Qu'est-ce que stdClass en PHP?

1049

Veuillez définir ce qui stdClassest.

Keira Nighly
la source

Réponses:

785

stdClassest la classe vide générique de PHP, un peu comme Objecten Java ou objecten Python ( Edit: mais pas réellement utilisée comme classe de base universelle; merci @Ciaran pour l' avoir signalé ).

Il est utile pour les objets anonymes, les propriétés dynamiques, etc.

Un moyen simple de considérer la StdClass est une alternative au tableau associatif. Voir cet exemple ci-dessous qui montre comment json_decode()permet d'obtenir une instance StdClass ou un tableau associatif. En outre, mais non illustré dans cet exemple, SoapClient::__soapCallretourne une instance 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

Voir Propriétés dynamiques en PHP et StdClass pour plus d'exemples.

Alex Martelli
la source
7
il a peut-être utilisé mysql_fetch_object. cela crée une instance de stdlcass si je ne me trompe pas.
Galen
69
Ce n'est pas tout à fait une classe de base à la manière de l'objet Java, voir ma réponse ci-dessous.
Ciaran McNulty
1
J'espère que vous savez que l'objet n'est pas la classe dérivée de "tous" les objets en Python ...
Du
11
Je pense que les gens devraient dire que stdClass est quelque chose comme la {}construction de JavaScript .
Earth Engine
Monsieur, votre réponse est partiellement incorrecte car l'article est incorrect. La seule chose (et c'est faux aussi) que l'extension de cette classe vous donne est de taper hint it ie function(StdClass $a, array $params)vs vérifier si $ais object et instanceof.
Dejan Marjanovic
1114

stdClassest juste une classe générique «vide» qui est utilisée lors de la conversion d'autres types en objets. Malgré ce que disent les deux autres réponses, ce stdClassn'est pas la classe de base pour les objets en PHP. Cela peut être démontré assez facilement:

class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'

Je ne crois pas qu'il existe un concept d'un objet de base en PHP

Ciaran McNulty
la source
4
Que signifie std?
Adam Waite
47
std = standard -
Tomas Prado
1
C'est une classe utilitaire! Btw c'est le vrai commentaire!
Gustav
16
En fait, la première phrase après l'extrait de code répond à la question.
MauganRa
2
@Miro Markaravanes: les attributs dynamiques peuvent être attribués à n'importe quelle classe en PHP, pas seulement à stdClass.
StanE
95

stdClass est une autre grande fonctionnalité PHP. Vous pouvez créer une classe PHP anonyme. Permet de vérifier un exemple.

$page=new stdClass();
$page->name='Home';
$page->status=1;

pensez maintenant que vous avez une autre classe qui va s'initialiser avec un objet page et exécuter la base dessus.

<?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';
    }
}

Vous devez maintenant créer un nouvel objet PageShow avec un objet Page.

Ici, pas besoin d'écrire un nouveau modèle de classe pour cela, vous pouvez simplement utiliser stdClass pour créer une classe à la volée.

    $pageview=new PageShow($page);
    $pageview->show();
Mrinmoy Ghoshal
la source
3
une classe vide avec des fonctions utiles qui fonctionnent avec des lignes, c'est aussi une meilleure norme de codage
borrel
1
Ce serait la même chose que d'utiliser un tableau. En fait STDclass est généré au moment du jonglage de type comme la conversion de tableau en objet.
varuog
1
Veuillez corriger une faute de frappe dans votre code: ($ this-> currentpage-> name == 1) devrait être ($ this-> currentpage-> status == 1)
Enriqe
7
"Vous pouvez créer une classe PHP anonyme" - Ce n'est pas une classe anonyme . Vous pouvez utiliser instanceof, get_class, ...
John Smith
2
Cette réponse est particulièrement déroutante maintenant que PHP a en fait des classes anonymes , qui sont très différentes de stdClass.
IMSoP
59

Il convient également de noter qu'un stdClassobjet peut également être créé à partir de l'utilisation de json_decode().

mdpatrick
la source
5
Vrai. J'utilise fréquemment json_encode et json_decode pour convertir un tableau en objet en tableau, si nécessaire.
pinkal vansia
6
$ x = json_decode (json_encode ($ object), True) décode l'objet dans un tableau, mais ce n'est pas un coffre-fort binaire. Essentiellement, si ce n'est pas du texte en clair, il peut se casser en JSON.
simontemplar
@simontemplar En PHP, vous ne devez pas écrire True. Les booléens sont en minuscules trueou false.
BadHorsie
2
@simontemplar Le manuel ne fonctionne pas, mais PSR-2 le fait, donc si vous suivez n'importe quel type de normes, il devrait être en minuscules. Bien sûr, si vous voulez l'écrire de cette façon, c'est valide, mais vous devez suivre les normes. La documentation manuelle pour les booléens sera extrêmement ancienne, probablement écrite avant la formation des normes. Soyons honnêtes, PHP a été écrit à l'origine comme un gâchis complet sans aucune norme (voir le large éventail de conventions de nommage des variables / fonctions / objets utilisées). Honnêtement, je n'ai jamais vu de code PHP où le développeur a utilisé votre format.
BadHorsie
2
Je suis PSR-2 sauf pour True / False / Null et je place les accolades ouvrantes sur leurs propres lignes pour les classes. A part ça, je m'en fiche. Si jamais vous modifiez le code de quelqu'un d'autre, cependant, je respecte la norme qu'ils utilisent (le cas échéant, généralement aucune) et, à défaut, je fais PSR-2 de la "bonne" manière. Il y a beaucoup de code horrible avec beaucoup d'autres problèmes que la capitalisation de trois mots clés est le moindre de mes soucis.
simontemplar
26

En utilisant stdClass, vous pouvez créer un nouvel objet avec ses propres propriétés. Prenons l'exemple suivant qui représente les détails d'un utilisateur sous forme de tableau associatif.

$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "[email protected]";

Si vous devez représenter les mêmes détails que les propriétés d'un objet, vous pouvez utiliser stdClass comme ci-dessous.

$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "[email protected]";

Si vous êtes un développeur Joomla, reportez - vous à cet exemple dans les documents Joomla pour une meilleure compréhension.

Bandula Dharmadasa
la source
24

Également,

$myNewObj->setNewVar = 'newVal'; 

renvoie un objet stdClass - casté automatiquement

J'ai découvert cela aujourd'hui par une faute d'orthographe:

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

Cool!

Nom de code-Steeve-Knight
la source
9
Mais cela devrait soulever un E_NOTICE
Petah
3
@Petah Uniquement en PHP 5.3+ mais pas vrai? Mais oui, c'est une mauvaise pratique à coup sûr.
ChristoKiwi
15

stdClass n'est pas une classe ou un objet anonyme

Les réponses incluent ici des expressions qui stdClasssont une classe anonyme ou même un objet anonyme. Ce n'est pas vrai.

stdClassest juste une classe prédéfinie régulière. Vous pouvez le vérifier en utilisant l' instanceofopérateur ou la fonction get_class. Rien de spécial ne va ici. PHP utilise cette classe lors de la conversion d'autres valeurs en objet.

Dans de nombreux cas, où stdClassest utilisé par les programmeurs, le tableau est une meilleure option, en raison des fonctions utiles et du fait que ce cas d'utilisation représente la structure de données et non un véritable objet.

John Smith
la source
8

Il est également intéressant de noter qu'en utilisant Casting, vous n'avez pas réellement besoin de créer un objet comme dans la réponse donnée par @Bandula. Au lieu de cela, vous pouvez simplement convertir votre tableau en un objet et la classe std est retournée. Par exemple:

$array = array(
    'Property1'=>'hello',
    'Property2'=>'world',
    'Property3'=>'again',
);

$obj = (object) $array;
echo $obj->Property3;

Output: again

Antony
la source
Aimer. Beaucoup plus propre!
WebSpanner
7

En fait, j'ai essayé de créer une classe std vide et j'ai comparé la vitesse à une classe vide.

class emp{}

puis a continué à créer 1000 stdClasses et emps ... les classes vides ont été effectuées en environ 1100 microsecondes tandis que les stdClasses ont pris plus de 1700 microsecondes. Donc je suppose que c'est mieux de créer votre propre classe factice pour stocker des données si vous voulez si mal utiliser des objets pour cela (les tableaux sont beaucoup plus rapides pour l'écriture et la lecture).

sauge
la source
22
apparemment, la différence est causée par la différence de longueur du nom. si vous appelez la classe "averylongclassnamefornoapparentreason", sa création prendra beaucoup plus de temps. alors allez comprendre.
Sage
27
Hmmm ... optimisation prématurée. Je préfère trouver des requêtes SQL complexes ou d'autres goulots d'étranglement du réseau si je suis vraiment préoccupé par la vitesse plutôt que de passer du temps à économiser 600 microsecondes. En fait, je préfère d'abord vérifier si javascript est sur le pied de page plutôt que dans la tête plutôt que de savoir si l'un est 600 microsecondes plus rapide que l'autre.
Ardee Aram
6
1000 est trop petit pour une référence fiable. Essayez un milliard.
replié le
1
Dans le monde PHP, il est presque toujours préférable d'utiliser des tableaux.
Vahid Amiri
^ Certainement pas. L'enfer des tableaux est un cauchemar lorsque l'on travaille en équipe sur un grand projet.
Davie Dave
6

Objets stdClass en cours d'utilisation

La stdClass vous permet de créer des classes anonymes et avec la conversion d'objets, vous pouvez également accéder aux clés d'un tableau associatif dans le style POO. Tout comme vous accéderiez à la propriété d'objet standard.

Exemple

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"]);

fera écho

John Doe

DevWL
la source
5

Si vous vouliez créer rapidement un nouvel objet pour contenir des données sur un livre. Vous feriez quelque chose comme ceci:

$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/";

Veuillez consulter le site - http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/ pour plus de détails.

Niladri Banerjee - Uttarpara
la source
4

Veuillez garder à l'esprit que 2 stdClasses vides ne sont pas strictement égales. Ceci est très important lors de la rédaction des attentes moqueuses.

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
la source
Parce que ce n'est PAS la même instance, ergo, il ne peut pas être égal. Une comparaison stricte des classes fonctionne avec l'identification des instances. Chaque instance de n'importe quelle classe a un ID unique.
Bednic
3

Le manuel de php.net contient quelques explications et exemples solides fournis par les utilisateurs de ce qu'est stdClass, j'aime particulièrement celui-ci http://php.net/manual/en/language.oop5.basic.php#92123 , https: // stackoverflow.com/a/1434375/2352773 .

stdClass est l'objet PHP par défaut. stdClass n'a pas de propriétés, de méthodes ou de parent. Il ne prend pas en charge les méthodes magiques et n'implémente aucune interface.

Lorsque vous convertissez un scalaire ou un tableau en objet, vous obtenez une instance de stdClass. Vous pouvez utiliser stdClass chaque fois que vous avez besoin d'une instance d'objet générique.

stdClass n'est PAS une classe de base! Les classes PHP n'héritent pas automatiquement d'aucune classe. Toutes les classes sont autonomes, sauf si elles étendent explicitement une autre classe. PHP diffère de nombreux langages orientés objet à cet égard.

Vous pouvez définir une classe qui étend stdClass, mais vous n'en tirerez aucun avantage, car stdClass ne fait rien.

Danijel
la source
3

est une manière dont le éviter d'arrêter d'interpréter le script quand il y a des données doivent être mises dans une classe, mais malheureusement cette classe n'a pas été définie

Exemple :

 return $statement->fetchAll(PDO::FETCH_CLASS  , 'Tasks');

Ici, les données seront placées dans les «tâches» prédéfinies. Mais, si nous faisions le code comme ceci:

 return $statement->fetchAll(PDO::FETCH_CLASS );

puis le mettra les résultats dans .

simplement dit que: regardez, nous avons un bon KIDS [Objets] Ici mais sans Parents. Donc, nous les enverrons dans une garderie pour nourrissons :)

Nasir Nasrallah
la source
2

Vous pouvez également utiliser objectpour lancer des tableaux sur un objet de votre choix:

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

Maintenant, pour créer un objet de type Exampleet l'initialiser, vous pouvez effectuer l'une des opérations suivantes:

$example = new Example();
$example->name = "some name";
$example->age = 22;

OU

$example = new Example();
$example = (object) ['name' => "some name", 'age' => 22];

La deuxième méthode est surtout utile pour initialiser des objets avec de nombreuses propriétés.

Vahid Amiri
la source
1

stClass est une classe vide créée par php lui-même, et ne doit être utilisée que par php, car ce n'est pas seulement une classe "vide", php utilise stdClass pour convertir les tableaux en style objet si vous devez utiliser stdClass, je recommande deux meilleures options : 1- utiliser des tableaux (beaucoup plus rapides que les classes) 2- créer votre propre classe vide et l'utiliser

//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'est-ce qui pousse quelqu'un à penser à utiliser le style d'objet au lieu du style de tableau ???

Sherif Eldeeb
la source
0

La raison pour laquelle nous avons stdClass est parce qu'en PHP il n'y a aucun moyen de distinguer un tableau normal d'un tableau associé (comme en Javascript vous avez {}pour objet et []pour tableau de les distinguer).

Cela crée donc un problème pour les objets vides. Prenez cela par exemple.

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)

Supposons que vous souhaitiez coder JSON la variable $ c

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {one: 1, two: 2}}

Supposons maintenant que vous ayez supprimé toutes les clés pour les $brendre vides. Comme il $best maintenant vide (vous avez supprimé toutes les clés, vous vous en souvenez?), Il ressemble à []ce qui peut être un tableau ou un objet si vous le regardez.

Donc, si vous refaites un json_encode, la sortie sera différente

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': []}

C'est un problème car nous savons bqu'il était censé être un tableau associé, mais PHP (ou toute fonction comme json_encode) ne le fait pas.

Alors stdClass vient à la rescousse. Reprenant le même exemple

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

Alors maintenant, même si vous supprimez toutes les clés $bet les videz, car il s'agit d'une classe std, cela n'aura pas d'importance et lorsque vous le json_encode vous obtiendrez ceci:

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}

C'est aussi la raison pour laquelle json_encodeet json_decodepar défaut retourne 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
la source