Por favor, defina qué stdClass
es.
Por favor, defina qué stdClass
es.
Respuestas:
stdClass
es la clase vacía genérica de PHP, algo así como Object
en Java o object
en Python ( Editar: pero en realidad no se usa como clase base universal; gracias @Ciaran por señalar esto ).
Es útil para objetos anónimos, propiedades dinámicas, etc.
Una manera fácil de considerar el StdClass es como una alternativa al arreglo asociativo. Vea este ejemplo a continuación que muestra cómo json_decode()
permite obtener una instancia de StdClass o una matriz asociativa. Además, pero no se muestra en este ejemplo, SoapClient::__soapCall
devuelve una instancia de 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
Vea Propiedades dinámicas en PHP y StdClass para más ejemplos.
{}
construcción de JavaScript .
function(StdClass $a, array $params)
verificar si $a
es objeto y instanceof
.
stdClass
es solo una clase genérica 'vacía' que se usa al convertir otros tipos a objetos. A pesar de lo que dicen las otras dos respuestas, nostdClass
es la clase base para objetos en PHP. Esto se puede demostrar con bastante facilidad:
class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'
No creo que haya un concepto de un objeto base en PHP
stdClass es otra gran característica de PHP. Puedes crear una clase PHP anónima. Vamos a ver un ejemplo.
$page=new stdClass();
$page->name='Home';
$page->status=1;
ahora cree que tiene otra clase que se inicializará con un objeto de página y se ejecutará en base a él.
<?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';
}
}
Ahora tiene que crear un nuevo objeto PageShow con un Objeto Page.
Aquí no es necesario escribir una nueva plantilla de clase para esto, simplemente puede usar stdClass para crear una clase sobre la marcha.
$pageview=new PageShow($page);
$pageview->show();
stdClass
.
También vale la pena señalar que también stdClass
se puede crear un objeto a partir del uso de json_decode()
.
True
. Los booleanos son minúsculas true
o false
.
Usando stdClass puedes crear un nuevo objeto con sus propias propiedades. Considere el siguiente ejemplo que representa los detalles de un usuario como una matriz asociativa.
$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "smith@nomail.com";
Si necesita representar los mismos detalles que las propiedades de un objeto, puede usar stdClass como se muestra a continuación.
$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "smith@nomail.com";
Si es desarrollador de Joomla, consulte este ejemplo en los documentos de Joomla para obtener más información.
Igualmente,
$myNewObj->setNewVar = 'newVal';
produce un objeto stdClass - auto fundido
Hoy descubrí esto escribiendo mal:
$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';
¡Frio!
Las respuestas aquí incluyen expresiones que stdClass
son una clase anónima o incluso un objeto anónimo. No es verdad
stdClass
es solo una clase predefinida regular. Puede verificar esto utilizando el instanceof
operador o la función get_class
. Nada especial va aquí. PHP usa esta clase cuando convierte otros valores a objetos.
En muchos casos donde stdClass
los programadores lo usan, la matriz es una mejor opción, debido a las funciones útiles y al hecho de que este caso de uso representa la estructura de datos, no un objeto real.
También vale la pena señalar que al usar Casting en realidad no es necesario crear un objeto como en la respuesta dada por @Bandula. En su lugar, simplemente puede convertir su matriz en un objeto y se devuelve el stdClass. Por ejemplo:
$array = array(
'Property1'=>'hello',
'Property2'=>'world',
'Property3'=>'again',
);
$obj = (object) $array;
echo $obj->Property3;
Output: again
En realidad intenté crear stdClass vacío y comparé la velocidad con la clase vacía.
class emp{}
luego procedió a crear 1000 stdClasses y emps ... las clases vacías se realizaron en alrededor de 1100 microsegundos, mientras que stdClasses tomó más de 1700 microsegundos. Así que supongo que es mejor crear su propia clase ficticia para almacenar datos si desea usar objetos para eso (las matrices son mucho más rápidas tanto para escribir como para leer).
StdClass le permite crear clases anónimas y con la conversión de objetos también puede acceder a las claves de una matriz asociativa en estilo OOP. Al igual que accedería a la propiedad del objeto regular.
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"]);
hará eco
John Doe
Si desea crear rápidamente un nuevo objeto para contener algunos datos sobre un libro. Harías algo como esto:
$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/";
Por favor, consulte el sitio - http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/ para más detalles.
Tenga en cuenta que 2 stdClasses vacías no son estrictamente iguales. Esto es muy importante al escribir expectativas de burla.
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 >
El manual de php.net tiene algunas explicaciones sólidas y ejemplos aportados por los usuarios de lo que es stdClass, especialmente me gusta este http://php.net/manual/en/language.oop5.basic.php#92123 , https: // stackoverflow.com/a/1434375/2352773 .
stdClass es el objeto PHP predeterminado. stdClass no tiene propiedades, métodos o padre. No es compatible con métodos mágicos y no implementa interfaces.
Cuando lanza un escalar o matriz como Object, obtiene una instancia de stdClass. Puede usar stdClass siempre que necesite una instancia de objeto genérico.
¡stdClass NO es una clase base! Las clases de PHP no se heredan automáticamente de ninguna clase. Todas las clases son independientes, a menos que extiendan explícitamente otra clase. PHP difiere de muchos lenguajes orientados a objetos a este respecto.
Podría definir una clase que extienda stdClass, pero no obtendría ningún beneficio, ya que stdClass no hace nada.
stdclass es una forma en que el php evite dejar de interpretar el script cuando hay algunos datos que deben colocarse en una clase, pero desafortunadamente esta clase no se definió
Ejemplo:
return $statement->fetchAll(PDO::FETCH_CLASS , 'Tasks');
Aquí los datos se colocarán en las 'Tareas' predefinidas. Pero, si hicimos el código así:
return $statement->fetchAll(PDO::FETCH_CLASS );
entonces el php pondrá los resultados en stdclass .
simplemente phpdice eso: mira, tenemos un buen KIDS [Objetos] Aquí pero sin Padres. Entonces, los enviaremos a un hogar de cuidado infantil infantilstdclass :)
También puede usar object
para emitir matrices a un objeto de su elección:
Class Example
{
public $name;
public $age;
}
Ahora, para crear un objeto de tipo Example
e inicializarlo, puede hacer cualquiera de estos:
$example = new Example();
$example->name = "some name";
$example->age = 22;
O
$example = new Example();
$example = (object) ['name' => "some name", 'age' => 22];
El segundo método es principalmente útil para inicializar objetos con muchas propiedades.
stClass es una clase vacía creada por php, y solo php debería usarla, porque no es solo una clase "vacía", php usa stdClass para convertir matrices a estilo de objeto si necesita usar stdClass, le recomiendo dos opciones mejores : 1- usa matrices (mucho más rápido que las clases) 2- crea tu propia clase vacía y úsala
//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';
¿Qué hace que alguien piense en usar el estilo de objeto en lugar del estilo de matriz?
La razón por la que tenemos stdClass es porque en PHP no hay forma de distinguir una matriz normal de una matriz asociada (como en Javascript tiene {}
para objeto y []
matriz para distinguirlos).
Entonces esto crea un problema para los objetos vacíos. Toma esto por ejemplo.
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)
Supongamos que desea codificar JSON la variable $ c
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {one: 1, two: 2}}
Ahora supongamos que eliminó todas las claves para dejarlas $b
vacías. Como $b
ahora está vacío (¿eliminó todas las claves, recuerda?), Parece []
que puede ser una matriz u objeto si lo mira.
Entonces, si vuelve a hacer un json_encode, la salida será diferente
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': []}
Esto es un problema porque sabemos b
que se suponía que era una matriz asociada, pero PHP (o cualquier función como json_encode) no lo hace.
Entonces stdClass viene a rescatar. Tomando el mismo ejemplo nuevamente
$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)
Entonces, incluso si elimina todas las claves $b
y las deja vacías, ya que es una clase estándar, no importará y cuando lo codifique, obtendrá esto:
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}
Esta es también la razón por la cual json_encode
y json_decode
por defecto devuelve 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