Che cos'è stdClass in PHP?


Risposte:


785

stdClassè la classe vuota generica di PHP, un po 'come Objectin Java o objectin Python ( Modifica: ma in realtà non viene utilizzata come classe base universale; grazie @Ciaran per averlo sottolineato ).

È utile per oggetti anonimi, proprietà dinamiche, ecc.

Un modo semplice di considerare la StdClass è un'alternativa alla matrice associativa. Vedi questo esempio di seguito che mostra come json_decode()consente di ottenere un'istanza StdClass o un array associativo. Inoltre, ma non mostrato in questo esempio, SoapClient::__soapCallrestituisce un'istanza 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

Vedi Proprietà dinamiche in PHP e StdClass per altri esempi.


7
forse ha usato mysql_fetch_object. che crea un'istanza di stdlcass se non sbaglio.
Galeno,

69
Non è proprio una classe base come Java's Object, vedi la mia risposta qui sotto.
Ciaran McNulty,

1
Spero che tu sappia che l'oggetto non è la classe derivata di "tutti" gli oggetti in Python ... Almeno, non fino a quando non sei costretto a derivare dall'oggetto in Python 3.0
monokrome

11
Penso che la gente dovrebbe dire che stdClass è qualcosa di simile al {}costrutto di JavaScript .
Earth Engine,

Signore, la sua risposta è parzialmente errata perché l'articolo non è corretto. L'unica (e anche questa è una cosa sbagliata) che ti dà l'estensione di questa classe è la possibilità di digitare un suggerimento, cioè function(StdClass $a, array $params)se $asi verifica se è oggetto e instanceof.
Dejan Marjanovic,

1114

stdClassè solo una classe "vuota" generica che viene utilizzata durante il cast di altri tipi su oggetti. Nonostante ciò che dicono le altre due risposte, nonstdClass è la classe base per gli oggetti in PHP. Questo può essere dimostrato abbastanza facilmente:

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

Non credo ci sia un concetto di oggetto base in PHP


4
cosa significa std?
Adam Waite,

47
std = standard -
Tomas Prado

1
È una classe di utilità! A proposito questo è il vero commento!
Gustav,

16
In realtà, la prima frase dopo lo snippet di codice risponde alla domanda.
MauganRa

2
@Miro Markaravanes: gli attributi dinamici possono essere assegnati a qualsiasi classe in PHP, non solo a stdClass.
StanE

95

stdClass è un'altra fantastica funzionalità di PHP. Puoi creare una classe PHP anonima. Facciamo un esempio.

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

ora pensi di avere un'altra classe che verrà inizializzata con un oggetto pagina ed eseguirà la base su di esso.

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

Ora devi creare un nuovo oggetto PageShow con un oggetto pagina.

Qui non è necessario scrivere un nuovo modello di classe per questo, puoi semplicemente usare stdClass per creare una classe al volo.

    $pageview=new PageShow($page);
    $pageview->show();

3
una classe vuota con utili funzioni che funzionano con le righe, è anche uno standard di codifica migliore
borrel

1
Sarebbe lo stesso che usare l'array. In effetti STDclass viene generato al momento del tipo di giocoleria come la conversione da array a oggetto.
varuog,

1
Correggi un refuso nel tuo codice: ($ this-> currentpage-> name == 1) dovrebbe essere ($ this-> currentpage-> status == 1)
Enriqe

7
"Puoi creare una classe PHP anonima" - Non è una classe anonima . Puoi usare instanceof, get_class, ...
John Smith

2
Questa risposta è particolarmente confusa ora che PHP ha effettivamente classi anonime , che sono molto diverse da stdClass.
IMSoP,

59

Vale anche la pena notare che un stdClassoggetto può essere creato anche dall'uso di json_decode().


5
Vero. Uso frequentemente json_encode e json_decode per convertire array in oggetto in array, quando necessario.
Pinkal Vansia,

6
$ x = json_decode (json_encode ($ object), True) decodificherà l'oggetto in un array, ma non è binario sicuro. In sostanza, se non è in chiaro, potrebbe rompersi in JSON.
simontemplar,

@simontemplar In PHP non dovresti scrivere True. I booleani sono minuscoli trueo false.
BadHorsie,

2
@simontemplar Il manuale no, ma PSR-2 lo fa, quindi se stai seguendo qualsiasi tipo di standard dovrebbe essere in minuscolo. Certo, se vuoi scriverlo in questo modo è valido ma dovresti seguire gli standard. La documentazione manuale per i booleani sarà estremamente vecchia, probabilmente scritta prima della formazione degli standard. Siamo onesti, PHP è stato originariamente scritto come un pasticcio completo senza standard (vedi l'ampia gamma di convenzioni di denominazione variabili / funzioni / oggetti utilizzate). Onestamente non ho mai visto alcun codice PHP in cui lo sviluppatore ha utilizzato il tuo formato.
BadHorsie,

2
Seguo PSR-2 tranne True / False / Null e inserendo parentesi graffe sulla loro linea per le lezioni. A parte questo, non mi interessa. Se mai modifico il codice di qualcun altro, seguo qualunque standard stiano usando (se presente, di solito nessuno) e, in mancanza di ciò, faccio PSR-2 nel modo "giusto". C'è un sacco di codice terribile di Dio là fuori con tonnellate di altri problemi che la capitalizzazione di tre parole chiave è l'ultima delle mie preoccupazioni.
simontemplar,

26

Usando stdClass puoi creare un nuovo oggetto con le sue proprietà. Considera il seguente esempio che rappresenta i dettagli di un utente come un array associativo.

$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "smith@nomail.com";

Se devi rappresentare gli stessi dettagli delle proprietà di un oggetto, puoi usare stdClass come di seguito.

$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "smith@nomail.com";

Se sei uno sviluppatore di Joomla, consulta questo esempio nei documenti di Joomla per ulteriore comprensione.


24

Allo stesso modo,

$myNewObj->setNewVar = 'newVal'; 

produce un oggetto stdClass - cast automatico

L'ho scoperto oggi scrivendo erroneamente:

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

Freddo!


9
Ma questo dovrebbe sollevare un E_NOTICE
Petah,

3
@Petah Solo in PHP 5.3+, giusto? Ma sì, è sicuramente una cattiva pratica.
ChristoKiwi,

15

stdClass non è una classe anonima o un oggetto anonimo

Le risposte qui includono espressioni che stdClasssono una classe anonima o addirittura un oggetto anonimo. Non è vero.

stdClassè solo una normale classe predefinita. Puoi verificarlo usando l' instanceofoperatore o la funzione get_class. Niente di speciale va qui. PHP usa questa classe per trasmettere altri valori all'oggetto.

In molti casi in cui stdClassviene utilizzato dai programmatori l'array è l'opzione migliore, a causa delle funzioni utili e del fatto che questa base utente rappresenta la struttura dei dati non un oggetto reale.


8

Vale anche la pena notare che utilizzando Casting in realtà non è necessario creare un oggetto come nella risposta data da @Bandula. Invece puoi semplicemente trasmettere il tuo array a un oggetto e la stdClass viene restituita. Per esempio:

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

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

Output: again


Lo adoro. Molto più pulito!
WebSpanner

7

In realtà ho provato a creare stdClass vuota e ho confrontato la velocità con la classe vuota.

class emp{}

poi ha continuato a creare 1000 stdClass ed emps ... classi vuote sono state fatte in circa 1100 microsecondi mentre stdClasses ha impiegato oltre 1700 microsecondi. Quindi immagino sia meglio creare la propria classe fittizia per l'archiviazione dei dati se si desidera utilizzare gli oggetti in modo così grave (gli array sono molto più veloci sia per la scrittura che per la lettura).


22
apparentemente la differenza è causata dalla differenza nella lunghezza del nome. se chiami la classe "averylongclassnamefornoapparentreason", la creazione richiederà molto più tempo. quindi vai a capire.
Salvia,

27
Hmmm ... ottimizzazione prematura. Preferirei trovare query SQL complesse o altri colli di bottiglia della rete se sono davvero interessato alla velocità piuttosto che spendere tempo risparmiando 600 microsecondi. In realtà, preferirei prima controllare se javascript è sul piè di pagina anziché in testa piuttosto che preoccuparmi se uno è 600 microsecondi più veloce dell'altro.
Ardee Aram,

6
1000 è troppo piccolo per un benchmark affidabile. Prova un miliardo.
destra del

1
Nel mondo PHP è quasi sempre meglio usare gli array.
Vahid Amiri

^ Sicuramente non è così. L'inferno dell'array è un incubo quando si lavora in gruppo su un grande progetto.
Davie Dave,

6

oggetti stdClass in uso

StdClass ti consente di creare classi anonime e con il cast di oggetti puoi anche accedere alle chiavi di un array associativo in stile OOP. Proprio come accederesti alla normale proprietà dell'oggetto.

Esempio

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

farà eco

John Doe


5

Se si desidera creare rapidamente un nuovo oggetto per contenere alcuni dati su un libro. Faresti qualcosa del genere:

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

Si prega di controllare il sito - http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/ per maggiori dettagli.


4

Tieni presente che 2 bicchieri std vuoti non sono strettamente uguali. Questo è molto importante quando si scrivono aspettative beffardo.

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 >

Poiché NON è la stessa istanza, ergo non può eguagliarsi. Il confronto rigoroso delle classi funziona con l'identificazione dell'istanza. Ogni istanza di qualsiasi classe ha un ID univoco.
Bednic,

3

Il manuale di php.net ha alcune solide spiegazioni ed esempi forniti dagli utenti di cosa sia stdClass, mi piace particolarmente questo http://php.net/manual/en/language.oop5.basic.php#92123 , https: // stackoverflow.com/a/1434375/2352773 .

stdClass è l'oggetto PHP predefinito. stdClass non ha proprietà, metodi o parent. Non supporta metodi magici e non implementa interfacce.

Quando si esegue il cast di uno scalare o un array come Object, si ottiene un'istanza di stdClass. È possibile utilizzare stdClass ogni volta che è necessaria un'istanza di oggetto generica.

stdClass NON è una classe base! Le classi PHP non ereditano automaticamente da nessuna classe. Tutte le classi sono autonome, a meno che non estendano esplicitamente un'altra classe. PHP differisce da molti linguaggi orientati agli oggetti in questo senso.

Potresti definire una classe che estende stdClass, ma non otterrai alcun vantaggio, poiché stdClass non fa nulla.


3

è un modo in cui il file evitare di interrompere l'interpretazione dello script quando ci sono alcuni dati che devono essere inseriti in una classe, ma sfortunatamente questa classe non è stata definita

Esempio :

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

Qui i dati verranno inseriti nelle "Attività" predefinite. Ma, se abbiamo fatto il codice come questo:

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

poi il inserirà i risultati .

semplicemente dice questo: guarda, abbiamo un buon BAMBINO [Oggetti] Qui ma senza i genitori. Quindi, li invieremo a una casa di cura per bambini piccoli :)


2

Puoi anche usare objectper lanciare matrici su un oggetto a tua scelta:

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

Ora per creare un oggetto di tipo Examplee inizializzarlo puoi fare uno di questi:

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

O

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

Il secondo metodo è utile soprattutto per inizializzare oggetti con molte proprietà.


1

stClass è una classe vuota creata da php stesso e dovrebbe essere utilizzata solo da php, poiché non è solo una classe "vuota", php usa stdClass per convertire le matrici in stile oggetto se è necessario utilizzare stdClass, consiglio due opzioni migliori : 1- usa le matrici (molto più velocemente delle classi) 2- crea la tua classe vuota e usala

//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';

cosa induce qualcuno a pensare di usare lo stile dell'oggetto invece dello stile dell'array ???


0

Il motivo per cui abbiamo stdClass è perché in PHP non c'è modo di distinguere un array normale da un array associato (come in Javascript hai {}per oggetto e []per array per distinguerli).

Quindi questo crea un problema per gli oggetti vuoti. Prendi questo per esempio.

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)

Supponiamo che tu voglia codificare JSON nella variabile $ c

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

Ora supponiamo che tu abbia eliminato tutte le chiavi dal $brenderlo vuoto. Dato che $bora è vuoto (hai eliminato tutte le chiavi ricordi?), Sembra []che possa essere un array o un oggetto se lo guardi.

Quindi, se si esegue nuovamente un codice json, l'output sarà diverso

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

Questo è un problema perché sappiamo bche doveva essere un array associato ma PHP (o qualsiasi funzione come json_encode) no.

Quindi stdClass viene in soccorso. Riprendendo lo stesso esempio

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

Quindi ora anche se elimini tutte le chiavi da $be lo rendi vuoto, poiché è una stdClass non importa e quando json_encode lo otterrai:

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

Questo è anche il motivo per cui json_encodee json_decodedi default restituisce 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.