¿Qué es stdClass en PHP?

Respuestas:

785

stdClasses la clase vacía genérica de PHP, algo así como Objecten Java o objecten 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::__soapCalldevuelve 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.

Alex Martelli
fuente
77
tal vez usó mysql_fetch_object. eso crea una instancia de stdlcass si no me equivoco.
Galen
69
No es exactamente una clase base en la forma en que es el Objeto de Java, vea mi respuesta a continuación.
Ciaran McNulty
1
Espero que sepa que el objeto no es la clase derivada de "todos" los objetos en Python ... Al menos, no hasta que se vea obligado a derivar del objeto en Python 3.0
monokrome
11
Creo que la gente debería decir que stdClass es algo así como la {}construcción de JavaScript .
Earth Engine
Señor, su respuesta es parcialmente incorrecta porque el artículo es incorrecto. Lo único (y esto también es incorrecto) que le brinda la extensión de esta clase es la opción de escribir insinuarlo, es decir, function(StdClass $a, array $params)verificar si $aes objeto y instanceof.
Dejan Marjanovic
1114

stdClasses 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

Ciaran McNulty
fuente
44
¿Qué significa STD?
Adam Waite
47
std = standard -
Tomas Prado
1
¡Es una clase de utilidad! Por cierto, este es el comentario real!
Gustav
16
En realidad, la primera oración después del fragmento de código responde a la pregunta.
MauganRa
2
@Miro Markaravanes: los atributos dinámicos pueden asignarse a cualquier clase en PHP, no solo stdClass.
StanE
95

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();
Mrinmoy Ghoshal
fuente
3
una clase vacía con funciones útiles que funcionan con filas, también es un mejor estándar de codificación
borrel
1
Sería lo mismo que usar una matriz. De hecho, STDclass se genera en el momento del tipo malabarismo como conversión de matriz a objeto.
varuog
1
Corrija un error tipográfico en su código: ($ this-> currentpage-> name == 1) debe ser ($ this-> currentpage-> status == 1)
Enriqe
77
"Puedes crear una clase PHP anónima" - No es una clase anónima . Puede usar instanceof, get_class, ...
John Smith
2
Esta respuesta es particularmente confusa ahora que PHP en realidad tiene clases anónimas , que son muy diferentes de stdClass.
IMSoP
59

También vale la pena señalar que también stdClassse puede crear un objeto a partir del uso de json_decode().

mdpatrick
fuente
55
Cierto. Frecuentemente uso json_encode y json_decode para convertir matriz en objeto a matriz, cuando es necesario.
pinkal vansia
66
$ x = json_decode (json_encode ($ object), True) decodificará el objeto en una matriz, pero no es binario seguro. Esencialmente, si no es texto sin formato, podría romperse en JSON.
simontemplar
@simontemplar En PHP no deberías escribir True. Los booleanos son minúsculas trueo false.
BadHorsie
2
@simontemplar El manual no lo hace, pero PSR-2 sí, por lo que si está siguiendo algún tipo de estándar, debe estar en minúsculas. Claro, si quieres escribirlo de esa manera, es válido, pero debes seguir los estándares. La documentación manual para booleanos será extremadamente antigua, probablemente escrita antes de que se formaran los estándares. Seamos honestos, PHP se escribió originalmente como un desastre completo sin ningún estándar (consulte la amplia gama de convenciones de denominación de variables / funciones / objetos utilizadas). Sinceramente, nunca he visto ningún código PHP en el que el desarrollador haya utilizado tu formato.
BadHorsie
2
Sigo PSR-2, excepto True / False / Null y poner llaves de apertura en sus propias líneas para las clases. Aparte de eso, simplemente no me importa. Sin embargo, si alguna vez edito el código de otra persona, sigo cualquier estándar que estén usando (si lo hay, generalmente ninguno) y, si no lo hago, hago PSR-2 de la manera "correcta". Hay un montón de código horrible por ahí con toneladas de otros problemas que la capitalización de tres palabras clave es la menor de mis preocupaciones.
simontemplar
26

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"] = "[email protected]";

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 = "[email protected]";

Si es desarrollador de Joomla, consulte este ejemplo en los documentos de Joomla para obtener más información.

Bandula Dharmadasa
fuente
24

Igualmente,

$myNewObj->setNewVar = 'newVal'; 

produce un objeto stdClass - auto fundido

Hoy descubrí esto escribiendo mal:

$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';

¡Frio!

Codename-Steeve-Knight
fuente
99
Pero esto debería generar un E_NOTICE
Petah
3
@Petah Solo en PHP 5.3+, ¿verdad? Pero sí, es una mala práctica seguro.
ChristoKiwi
15

stdClass no es una clase anónima ni un objeto anónimo

Las respuestas aquí incluyen expresiones que stdClassson una clase anónima o incluso un objeto anónimo. No es verdad

stdClasses solo una clase predefinida regular. Puede verificar esto utilizando el instanceofoperador o la función get_class. Nada especial va aquí. PHP usa esta clase cuando convierte otros valores a objetos.

En muchos casos donde stdClasslos 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.

John Smith
fuente
8

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

Antonio
fuente
Quiéralo. Mucho más limpio!
WebSpanner
7

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).

Sabio
fuente
22
aparentemente la diferencia es causada por la diferencia en la longitud del nombre. si llama a la clase "averylongclassnamefornoapparentrenton", llevará más tiempo crearla. así que imagínate.
Sage
27
Hmmm ... optimización prematura. Prefiero encontrar consultas SQL complejas u otros cuellos de botella de red si realmente me preocupa la velocidad en lugar de perder tiempo ahorrando 600 microsegundos. En realidad, prefiero verificar primero si javascript está en el pie de página en lugar de en la cabeza que preocuparme si uno es 600 microsegundos más rápido que el otro.
Ardee Aram
66
1000 es demasiado pequeño para un punto de referencia confiable. Intenta mil millones.
derecha el
1
En el mundo PHP, casi siempre es mejor usar matrices.
Vahid Amiri
^ Definitivamente no es así. Array Hell es una pesadilla cuando se trabaja en equipo en un gran proyecto.
Davie Dave
6

objetos stdClass en uso

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.

Ejemplo

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

DevWL
fuente
5

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.

Niladri Banerjee - Uttarpara
fuente
4

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 >
jakub wrona
fuente
Debido a que NO es la misma instancia, ergo no puede ser igual entre sí. La comparación estricta de clases funciona con la identificación de instancias. Cada instancia de cualquier clase tiene una identificación única.
Bednic
3

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.

Danijel
fuente
3

es una forma en que el 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 pondrá los resultados en .

simplemente dice eso: mira, tenemos un buen KIDS [Objetos] Aquí pero sin Padres. Entonces, los enviaremos a un hogar de cuidado infantil infantil :)

Nasir Nasrallah
fuente
2

También puede usar objectpara emitir matrices a un objeto de su elección:

Class Example
{
   public $name;
   public $age;
}

Ahora, para crear un objeto de tipo Examplee 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.

Vahid Amiri
fuente
1

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?

Sherif Eldeeb
fuente
0

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 $bvacías. Como $bahora 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 bque 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 $by 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_encodey json_decodepor 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
supersan
fuente