Jak uzyskać właściwość w PHP na podstawie ciągu znaków? Zadzwonię magic
. Więc co to jest magic
?
$obj->Name = 'something';
$get = $obj->Name;
byłoby jak ...
magic($obj, 'Name', 'something');
$get = magic($obj, 'Name');
php
string
oop
properties
Daniel A. White
źródło
źródło
ArrayAccess
,Countable
i jeden z interfejsów iterator, to przeważnie nie do odróżnienia od normalnegoarray()
Jeśli chcesz uzyskać dostęp do właściwości bez tworzenia zmiennej pośredniej, użyj
{}
notacji:Pozwala to również na utworzenie pętli nazwy właściwości, na przykład:
źródło
$this->{$property}[$name]
, w przeciwnym razie$this->$property[$name]
wystąpi błąd$this->$property[$name]
faktycznie się uda, chociaż prawdopodobnie jest to błąd.$name
jest po cichu rzutowany na liczbę całkowitą. W przypadku łańcucha nieliczbowego jest to0
. Następnie ten indeks łańcucha wartości$property
jest używany jako nazwa właściwości. Jeśli$property
zawiera wartość „abc”, będzie to odwoływać się do właściwości$this->a
(indeks 0). Jeśli istnieje taka właściwość, to się powiedzie.To, o co pytasz, nazywa się zmiennymi zmiennymi . Wszystko, co musisz zrobić, to zapisać ciąg w zmiennej i uzyskać do niego dostęp w następujący sposób:
źródło
Coś takiego? Nie testowałem tego, ale powinno działać dobrze.
źródło
Po prostu zapisz nazwę właściwości w zmiennej i użyj tej zmiennej, aby uzyskać dostęp do właściwości. Lubię to:
źródło
Mogą istnieć odpowiedzi na to pytanie, ale możesz chcieć zobaczyć te migracje do PHP 7
źródło: php.net
źródło
To jest proste, $ obj -> {$ obj-> Name} nawiasy klamrowe będą opakowywać właściwość podobnie jak zmienna zmienna.
To było najlepsze wyszukiwanie. Ale nie rozwiązało mojego pytania, które dotyczyło $ this. W moim przypadku użycie nawiasu kręconego też pomogło ...
przykład z Code Igniter get instancję
w źródłowej klasie biblioteki o nazwie coś z instancją klasy nadrzędnej
klasa biblioteki musi pobierać źródła z innej klasy również z instancją nadrzędną
źródło
Tylko jako dodatek: w ten sposób można uzyskać dostęp do właściwości o nazwach, które w innym przypadku byłyby bezużyteczne
(nie to, że powinieneś, ale na wypadek, gdybyś musiał).Jeśli chcesz robić jeszcze bardziej wyszukane rzeczy, powinieneś przyjrzeć się refleksji
źródło
Na wypadek, gdyby ktoś chciał znaleźć głęboką właściwość o nieznanej głębokości, wymyśliłem poniżej bez konieczności przeglądania wszystkich znanych właściwości wszystkich dzieci.
Na przykład, aby znaleźć $ Foo-> Bar-> baz lub $ Foo-> baz lub $ Foo-> Bar-> Baz-> dave, gdzie $ path jest ciągiem znaków, takim jak „foo / bar / baz”.
A potem zadzwoń z czymś takim:
źródło
Oto moja próba. Ma wbudowane pewne typowe testy `` głupoty '', dzięki którym nie próbujesz ustawiać ani pobierać członka, który nie jest dostępny.
Możesz przenieść te sprawdzenia 'property_exists' odpowiednio do __set i __get i wywołać je bezpośrednio w magic ().
źródło
Funkcja ta sprawdza, czy właściwość istnieje w tej klasie którejkolwiek z jego dzieci, a jeśli tak, to pobiera wartość, w przeciwnym razie zwraca wartość null. Więc teraz właściwości są opcjonalne i dynamiczne.
Stosowanie:
źródło
dlaczego edit: before: using eval (evil) after: no eval all. bycie starym w tym języku.
źródło