php - objects - tag title cos'è




Cosa è stdClass in PHP? (11)

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 faresti per accedere 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

Si prega di definire cosa è stdClass .


stdClass non è una classe anonima o un oggetto anonimo

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

stdClass è solo una normale classe predefinita. Puoi verificarlo utilizzando l'operatore instanceof 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 stdClass viene utilizzato dai programmatori, l'array è l'opzione migliore, a causa delle funzioni utili e del fatto che questo caso usa la struttura dei dati non un vero oggetto.


Il manuale di php.net ha alcune spiegazioni e esempi concreti forniti dagli utenti di ciò che stdClass è, mi piace particolarmente questo http://php.net/manual/en/language.oop5.basic.php#92123 , https://.com/a/1434375/2352773 .

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

Quando lanci uno scalare o un array come Oggetto, ottieni un'istanza di stdClass. Puoi usare stdClass ogni volta che ti serve un'istanza di un oggetto generico.

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

Si potrebbe definire una classe che estende stdClass, ma non si otterrebbe alcun beneficio, in quanto stdClass non fa nulla.


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

class emp{}

quindi proceduto alla creazione di 1000 stdClasses ed emp ... le classi vuote sono state eseguite in circa 1100 microsecondi mentre stdClasses ha impiegato oltre 1700 microsecondi. Quindi immagino sia meglio creare la propria classe dummy per l'archiviazione dei dati se si desidera utilizzare gli oggetti per così tanto male (gli array sono molto più veloci sia per la scrittura che per la lettura).


Puoi anche usare l' object per lanciare matrici su un oggetto di tua scelta:

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

Ora per creare un oggetto di tipo Example e 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à.


Se si desidera creare rapidamente un nuovo oggetto per contenere alcuni dati su un libro. Faresti qualcosa di simile a questo:

$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://rads..com/amzn/click/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.


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

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

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

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

Se sei uno sviluppatore Joomla, consulta questo esempio nei documenti di Joomla per ulteriori informazioni.


Vale anche la pena notare che, utilizzando Casting, non è effettivamente necessario creare un oggetto come nella risposta fornita da @Bandula. Invece puoi semplicemente lanciare la tua matrice su un oggetto e viene restituito stdClass. Per esempio:

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

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

Output: again


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

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

ora pensa di avere un'altra classe che si inizializzerà con un oggetto di pagina ed eseguirà la base su di essa.

<?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 Page.

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();

stdClass è la classe vuota generica di PHP, un po 'come l' Object in Java o l' object in Python ( Edit: ma non usato come classe base universale, grazie a @Ciaran per averlo indicato ).

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

Un modo semplice per considerare StdClass è un'alternativa all'array associativo. Vedi questo esempio qui sotto che mostra come json_decode() consente di ottenere un'istanza StdClass o un array associativo. Anche se non mostrato in questo esempio, SoapClient::__soapCall restituisce 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.


stdclass è un modo in cui php evita di arrestare l'interpretazione dello script quando ci sono dei dati che devono essere messi 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 );

allora il php metterà i risultati in stdclass .

semplicemente php dice che: guarda, abbiamo un buon KIDS [Oggetti] qui ma senza genitori. Quindi, li invieremo a un bambino in casa di cura stdclass :)





stdclass