Mam właściwości obiektu w moim kodzie, które wyglądają następująco:
$obj ->field_name_cars[0];
$obj ->field_name_clothes[0];
Problem polega na tym, że mam setki nazw pól i muszę dynamicznie zapisywać nazwę właściwości. W przeciwnym razie nazwa obiektu i klucze właściwości będą zawsze takie same. Więc spróbowałem:
$obj -> $field[0];
Mając nadzieję, że nazwa właściwości zostanie dynamicznie zmieniona i uzyska dostęp do poprawnych wartości. Ale ciągle otrzymuję 'undefined property $ field in stdClass :: $ field;
Mniej więcej próbuję dynamicznie zapisywać php przed jego wykonaniem, aby mógł wyprowadzać właściwe wartości. Zastanawiasz się, jak do tego podejść?
Myślę, że szukasz notacji typu zmienna-zmienna, która podczas uzyskiwania dostępu do wartości z innych tablic / obiektów najlepiej osiągnąć za pomocą składni nawiasów klamrowych w następujący sposób:
$obj->{field[0]}
źródło
Magiczna metoda __get to twój przyjaciel:
class MyClass { private $field = array(); public function __get($name) { if(isset($this->field[$name])) return $this->field[$name]; else throw new Exception("$name dow not exists"); } }
Stosowanie:
$myobj = new MyClass(); echo $myobj->myprop;
Objaśnienie: Wszystkie dane pola są przechowywane w tablicy. Gdy uzyskujesz dostęp,
$myobj->myprop
ta właściwość oczywiście nie istnieje w klasie. To jest, gdzie__get
jest nazywany.__get
wyszukuje nazwę wfield
tablicy i zwraca poprawną wartość.źródło
dziś stoję przed tym wyzwaniem. Skończyło się na tym stylu rozwoju
$countTickets = new \stdClass; foreach ($tickets as $key => $value) { if(!isset($countTickets->total)){ $countTickets->total = 0; } if(!isset($countTickets->{$value['categoryname']})){ $countTickets->{$value['categoryname']} = 0; } $countTickets->total += $value['number']; $countTickets->{$value['categoryname']} += $value['number']; }
źródło
Pracowałem nad kodem, który używał dynamicznie tworzonych właściwości obiektów. Pomyślałem, że używanie dynamicznie tworzonych właściwości obiektów jest całkiem fajne (moim zdaniem prawda). Jednak mój program działał 7 sekund. Usunąłem dynamiczne właściwości obiektu i zastąpiłem je właściwościami obiektu zadeklarowanymi jako część każdej klasy (w tym przypadku publicznymi). Czas procesora wzrósł z ponad 7 sekund do 0,177 sekundy. To całkiem pokaźne.
Możliwe, że robiłem coś złego w sposobie korzystania z dynamicznych właściwości obiektu. Możliwe też, że moja konfiguracja jest w jakiś sposób zepsuta. Oczywiście powinienem powiedzieć, że mam bardzo prostą, waniliową konfigurację PHP na moim komputerze.
źródło