Proszę zdefiniować co stdClass
jest.
Proszę zdefiniować co stdClass
jest.
Odpowiedzi:
stdClass
jest ogólną pustą klasą PHP, trochę jak Object
w Javie lub object
Pythonie ( Edycja: ale tak naprawdę nie jest używana jako uniwersalna klasa podstawowa; dzięki @Ciaran za zwrócenie na to uwagi ).
Jest przydatny w przypadku obiektów anonimowych, właściwości dynamicznych itp.
Prostym sposobem na rozważenie StdClass jest alternatywa dla tablicy asocjacyjnej. Zobacz poniższy przykład, który pokazuje, w jaki sposób json_decode()
można uzyskać instancję StdClass lub tablicę asocjacyjną. Również, ale nie pokazano w tym przykładzie, SoapClient::__soapCall
zwraca instancję StdClass.
<?php
//Example with StdClass
$json = '{ "foo": "bar", "number": 42 }';
$stdInstance = json_decode($json);
echo $stdInstance->foo . PHP_EOL; //"bar"
echo $stdInstance->number . PHP_EOL; //42
//Example with associative array
$array = json_decode($json, true);
echo $array['foo'] . PHP_EOL; //"bar"
echo $array['number'] . PHP_EOL; //42
Zobacz Dynamiczne właściwości w PHP i StdClass, aby uzyskać więcej przykładów.
{}
konstrukcja JavaScript .
function(StdClass $a, array $params)
Sprawdzenie, czy $a
jest obiektem i instanceof
.
stdClass
jest po prostu ogólną „pustą” klasą używaną podczas rzutowania innych typów na obiekty. Pomimo tego, co mówią dwie pozostałe odpowiedzi, niestdClass
jest klasą podstawową dla obiektów w PHP. Można to dość łatwo wykazać:
class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'
Nie wierzę, że istnieje koncepcja podstawowego obiektu w PHP
stdClass to kolejna świetna funkcja PHP. Możesz stworzyć anonimową klasę PHP. Sprawdźmy przykład.
$page=new stdClass();
$page->name='Home';
$page->status=1;
teraz myślę, że masz inną klasę, która zainicjuje się z obiektem strony i wykona na nim bazę.
<?php
class PageShow {
public $currentpage;
public function __construct($pageobj)
{
$this->currentpage = $pageobj;
}
public function show()
{
echo $this->currentpage->name;
$state = ($this->currentpage->status == 1) ? 'Active' : 'Inactive';
echo 'This is ' . $state . ' page';
}
}
Teraz musisz utworzyć nowy obiekt PageShow za pomocą obiektu strony.
Tutaj nie ma potrzeby pisania nowego szablonu klasy. Możesz po prostu użyć stdClass, aby utworzyć klasę w locie.
$pageview=new PageShow($page);
$pageview->show();
stdClass
.
Warto również zauważyć, że stdClass
obiekt może zostać utworzony również z użycia json_decode()
.
True
. Wartości logiczne są małymi literami true
lub false
.
Za pomocą stdClass możesz stworzyć nowy obiekt z własnymi właściwościami. Rozważ następujący przykład, który reprezentuje dane użytkownika jako tablicę asocjacyjną.
$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "smith@nomail.com";
Jeśli chcesz przedstawić te same szczegóły co właściwości obiektu, możesz użyć stdClass jak poniżej.
$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "smith@nomail.com";
Jeśli jesteś programistą Joomla, zapoznaj się z tym przykładem w dokumentacji Joomla w celu dalszego zrozumienia.
Również,
$myNewObj->setNewVar = 'newVal';
zwraca obiekt stdClass - automatycznie rzutowany
Dowiedziałem się tego dzisiaj, popełniając błędy w pisowni:
$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';
Fajne!
Odpowiedzi tutaj obejmują wyrażenia stdClass
będące anonimową klasą lub nawet anonimowym obiektem. To nie prawda.
stdClass
jest zwykłą predefiniowaną klasą. Możesz to sprawdzić za pomocą instanceof
operatora lub funkcji get_class
. Nie ma tu nic specjalnego. PHP używa tej klasy do rzutowania innych wartości na obiekty.
W wielu przypadkach, gdy stdClass
są używane przez programistów, tablica jest lepszą opcją, ze względu na przydatne funkcje i fakt, że ta skrzynka reprezentuje strukturę danych, a nie rzeczywisty obiekt.
Warto również zauważyć, że korzystając z Castingu, tak naprawdę nie musisz tworzyć obiektu, jak w odpowiedzi udzielonej przez @Bandula. Zamiast tego możesz po prostu rzucić tablicę na obiekt i zwracana jest klasa stdClass. Na przykład:
$array = array(
'Property1'=>'hello',
'Property2'=>'world',
'Property3'=>'again',
);
$obj = (object) $array;
echo $obj->Property3;
Output: again
Właściwie próbowałem stworzyć pustą klasę stdClass i porównałem prędkość do pustej klasy.
class emp{}
następnie kontynuował tworzenie 1000 stdClasses i emps ... puste klasy wykonano w około 1100 mikrosekund, podczas gdy stdClasses zajęły ponad 1700 mikrosekund. Sądzę więc, że lepiej jest stworzyć własną sztuczną klasę do przechowywania danych, jeśli chcesz tak źle używać obiektów (tablice są znacznie szybsze zarówno do zapisu, jak i odczytu).
StdClass pozwala tworzyć anonimowe klasy, a rzutowanie obiektów umożliwia dostęp do kluczy tablicy asocjacyjnej w stylu OOP. Tak jak w przypadku dostępu do zwykłej właściwości obiektu.
class Example {
private $options;
public function __construct(Array $setup)
{
// casting Array to stdClass object
$this->options = (object) $setup;
// access stdClass object in oop style - here transform data in OOP style using some custom method or something...
echo $this->options->{'name'}; // ->{'key'}
echo $this->options->surname; // ->key
}
}
$ob1 = new Example(["name" => "John", "surname" => "Doe"]);
odbije się echem
nieznany z nazwiska
Jeśli chcesz szybko utworzyć nowy obiekt do przechowywania danych o książce. Zrobiłbyś coś takiego:
$book = new stdClass;
$book->title = "Harry Potter and the Prisoner of Azkaban";
$book->author = "J. K. Rowling";
$book->publisher = "Arthur A. Levine Books";
$book->amazon_link = "http://www.amazon.com/dp/0439136369/";
Proszę sprawdzić stronę - http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/, aby uzyskać więcej informacji.
Należy pamiętać, że 2 puste klasy stdClass nie są ściśle równe. Jest to bardzo ważne przy pisaniu kpiących oczekiwań.
php > $a = new stdClass();
php > $b = new stdClass();
php > var_dump($a === $b);
bool(false)
php > var_dump($a == $b);
bool(true)
php > var_dump($a);
object(stdClass)#1 (0) {
}
php > var_dump($b);
object(stdClass)#2 (0) {
}
php >
Podręcznik php.net zawiera kilka solidnych wyjaśnień i przykładów dostarczonych przez użytkowników na temat tego, czym jest stdClass, szczególnie podoba mi się ten http://php.net/manual/en/language.oop5.basic.php#92123 , https: // stackoverflow.com/a/1434375/2352773 .
stdClass jest domyślnym obiektem PHP. stdClass nie ma właściwości, metod ani elementu nadrzędnego. Nie obsługuje magicznych metod i nie implementuje interfejsów.
Kiedy rzutujesz skalar lub tablicę jako Object, dostajesz instancję stdClass. Możesz użyć stdClass, ilekroć potrzebujesz ogólnej instancji obiektu.
stdClass NIE jest klasą podstawową! Klasy PHP nie dziedziczą automatycznie po żadnej klasie. Wszystkie klasy są samodzielne, chyba że jawnie rozszerzają inną klasę. Pod tym względem PHP różni się od wielu języków obiektowych.
Możesz zdefiniować klasę rozszerzającą stdClass, ale nie uzyskałbyś żadnej korzyści, ponieważ stdClass nic nie robi.
stdclass jest sposobem, w jaki php unikaj przerywania interpretacji skryptu, gdy pewne dane muszą zostać umieszczone w klasie, ale niestety ta klasa nie została zdefiniowana
Przykład:
return $statement->fetchAll(PDO::FETCH_CLASS , 'Tasks');
Tutaj dane zostaną umieszczone w predefiniowanych „Zadaniach”. Ale gdybyśmy zrobili kod w ten sposób:
return $statement->fetchAll(PDO::FETCH_CLASS );
a później php umieści wyniki stdclass .
po prostu phpmówi: patrz, mamy dobre DZIECI [Przedmioty] Tutaj, ale bez Rodziców. Wyślemy je więc do Domu Opieki nad Niemowlakiemstdclass :)
Możesz także użyć object
do rzutowania tablic na wybrany obiekt:
Class Example
{
public $name;
public $age;
}
Teraz, aby utworzyć obiekt typu Example
i zainicjować go, możesz wykonać jedną z następujących czynności:
$example = new Example();
$example->name = "some name";
$example->age = 22;
LUB
$example = new Example();
$example = (object) ['name' => "some name", 'age' => 22];
Druga metoda jest najbardziej przydatna do inicjowania obiektów o wielu właściwościach.
stClass jest pustą klasą utworzoną przez sam php i powinien być używany tylko przez php, ponieważ nie jest to tylko „pusta” klasa, php używa stdClass do konwersji tablic na styl obiektowy, jeśli potrzebujesz użyć stdClass, polecam dwie lepsze opcje : 1- użyj tablic (znacznie szybciej niż klasy) 2- utwórz własną pustą klasę i użyj jej
//example 1
$data=array('k1'=>'v1' , 'k2'=>'v2',....);
//example 2
//creating an empty class is faster than instances an stdClass
class data={}
$data=new data();
$data->k1='v1';
$data->k2='v2';
co sprawia, że ktoś myśli o użyciu stylu obiektowego zamiast stylu tablicowego?
Powodem, dla którego mamy stdClass, jest to, że w PHP nie ma sposobu, aby odróżnić normalną tablicę od tablicy powiązanej (tak jak w JavaScript masz {}
obiekt i []
tablicę, aby je odróżnić).
Stwarza to problem dla pustych obiektów. Weź to na przykład.
PHP:
$a = [1, 2, 3]; // this is an array
$b = ['one' => 1, 'two' => 2]; // this is an associate array (aka hash)
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)
Załóżmy, że chcesz JSON zakodować zmienną $ c
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {one: 1, two: 2}}
Powiedzmy teraz, że usunąłeś wszystkie klucze z $b
pustych. Ponieważ $b
jest teraz pusty (usunąłeś wszystkie klucze, pamiętasz?), Wygląda na to, że []
może to być tablica lub obiekt, jeśli na to spojrzysz.
Więc jeśli ponownie zrobisz kod_json, wynik będzie inny
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': []}
Jest to problem, ponieważ wiemy, b
że miała to być tablica stowarzyszona, ale PHP (lub jakakolwiek funkcja taka jak json_encode) nie.
Więc stdClass przychodzi na ratunek. Ponownie biorąc ten sam przykład
$a = [1, 2, 3]; // this is an array
$b = (object) ['one' => 1, 'two' => 2]; // this makes it an stdClass
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)
Więc teraz, nawet jeśli usuniesz wszystkie klucze z $b
i sprawisz, że będą puste, ponieważ jest to stdClass, nie będzie to miało znaczenia, a kiedy json_encode to otrzymasz:
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}
Jest to również powód json_encode
i json_decode
domyślnie zwraca stdClass.
$c = json_decode('{"a": [1,2,3], "b": {}}', true); //true to deocde as array
// $c is now ['a' => [1,2,3], 'b' => []] in PHP
// if you json_encode($c) again your data is now corrupted