Jak wiemy, tworzenie anonimowych obiektów w JavaScript jest łatwe, jak w poniższym kodzie:
var object = {
p : "value",
p1 : [ "john", "johnny" ]
};
alert(object.p1[1]);
Wynik:
an alert is raised with value "johnny"
Czy tę samą technikę można zastosować w PHP? Czy możemy tworzyć anonimowe obiekty w PHP?
Odpowiedzi:
Minęło już kilka lat, ale myślę, że muszę aktualizować informacje!
Od PHP 7 możliwe było tworzenie anonimowych klas, więc możesz robić takie rzeczy:
Możesz przeczytać więcej na ten temat w instrukcji
Ale nie wiem, jak podobny jest do JavaScript, więc może występować kilka różnic między klasami anonimowymi w JavaScript i PHP.
źródło
„Anonimowy” nie jest poprawną terminologią w odniesieniu do przedmiotów. Lepiej byłoby powiedzieć „obiekt typu anonimowego ”, ale nie dotyczy to PHP.
Wszystkie obiekty w PHP mają klasę. Klasą „domyślną” jest
stdClass
i możesz tworzyć z niej obiekty w następujący sposób:Możesz także skorzystać z rzutowania tablicy na obiekt, aby uzyskać wygodniejszą składnię:
Należy jednak pamiętać, że rzutowanie tablicy na obiekt może przynieść „interesujące” wyniki dla tych kluczy tablic, które nie są prawidłowymi nazwami zmiennych PHP - na przykład, oto moja odpowiedź, która pokazuje, co się dzieje, gdy klucze zaczynają się od cyfr.
źródło
Tak to mozliwe! Korzystanie z tej prostej klasy obiektu anonimowego PHP . Jak to działa:
Oczywiście ten obiekt jest instancją
AnObj
klasy, więc nie jest tak naprawdę anonimowy, ale umożliwia definiowanie metod w locie, tak jak robi to JavaScript.źródło
W ten sposób do niedawna tworzyłem obiekty w locie.
Następnie:
Ale teraz idę z:
Wtedy jak poprzednio:
Oczywiście, jeśli znasz już właściwości i wartości, możesz je ustawić w środku, jak wspomniano:
NB: Nie wiem, na jakich wersjach PHP to działa, więc musisz o tym pamiętać. Ale myślę, że pierwsze podejście (które jest również krótkie, jeśli nie ma właściwości do ustawienia podczas budowy) powinno działać dla wszystkich wersji, które mają json_encode / json_decode
źródło
Konwertuj tablicę na obiekt (ale to nie jest rekurencyjne dla podrzędnych):
źródło
Jeśli chcesz naśladować JavaScript, możesz utworzyć klasę
Object
i uzyskać takie samo zachowanie. Oczywiście nie jest to już całkiem anonimowe, ale zadziała.To da element 2 . Zostało to skradzione z komentarza do PHP: Classes and Objects .
źródło
Obsługa klas anonimowych jest dostępna od PHP 7.0 i jest najbliższym odpowiednikiem przykładu JavaScript przedstawionego w pytaniu.
Nie można pominąć deklaracji widoczności właściwości (użyłem tylko
var
dlatego, że jest krótsza niżpublic
).Podobnie jak JavaScript, możesz również zdefiniować metody dla klasy:
źródło
Z dokumentacji PHP kilka więcej przykładów:
$ obj1 i $ obj3 są tego samego typu, ale $ obj1! == $ obj3. Ponadto wszystkie trzy wyślą json_encode () do prostego obiektu JS {}:
Wyjścia:
https://www.php.net/manual/en/language.types.object.php
źródło
Jeśli chcesz stworzyć obiekt (jak w javascript) z dynamicznymi właściwościami, bez otrzymywania ostrzeżenia o niezdefiniowanej właściwości, gdy nie ustawiłeś wartości na property
źródło
Nie - ponieważ javascript używa prototypów / bezpośredniej deklaracji obiektów - w PHP (i wielu innych językach OO) obiekt można stworzyć tylko z klasy.
Powstaje więc pytanie - czy możesz stworzyć anonimową klasę.
Znowu odpowiedź brzmi nie - w jaki sposób utworzyłbyś instancję klasy bez możliwości odniesienia się do niej?
źródło
Object var = new Object() { ... };
- C ++:class { ... } var;
Dla tego, kto chce obiektu rekurencyjnego:
źródło
Anoynmus obiekt wiki
źródło