Come impostare gli attributi per stdClass object al momento della creazione dell’oggetto

Voglio impostare l’attributo per un stdClass oggetto in una sola istruzione.
Non ho alcuna idea in proposito. Conoscere le seguenti cose

$obj = new stdClass;
$obj->attr = 'loremipsum';

Prende due dichiarazioni.

$obj = (object) array('attr'=>'loremipsum');

Prende singola affermazione, ma non è un metodo diretto.

$obj = new stdClass(array('attr'=>'loremipsum'));

Non funziona.

  • Non è possibile eseguire questa operazione utilizzando stdClass. Sarà necessario creare una classe personalizzata che dispone di un costruttore.
InformationsquelleAutor Habeeb Perwad | 2012-12-07



3 Replies
  1. 57
    $obj = (object) array(
        'attr'=>'loremipsum'
    );

    In effetti è così diretto come sta andando ottenere. Anche un costruttore personalizzato non sarà in grado di fare questo in una sola espressione.

    Il (object) cast potrebbe effettivamente essere una semplice traduzione da un array, perché internamente la proprietà sono archiviati in un hash come bene.

    Si potrebbe creare una classe base come questo:

    abstract class MyObject
    {
        public function __construct(array $attributes = array())
        {
            foreach ($attributes as $name => $value) {
                $this->{$name} = $value;
            }
        }
    }
    
    class MyWhatever extends MyObject
    {
    }
    
    $x = new MyWhatever(array(
        'attr' => 'loremipsum',
    ));

    Così facendo si blocca con il costruttore, però, prevede che ogni classe per chiamare il suo costruttore padre quando sottoposto a override.

    • Perché si sta creando “MyWhatever”? è possibile utilizzare direttamente l’ “MyObject”, eliminando la parola chiave abstract, giusto?
    • Certo, se stai bene con avere istanze della classe di base, è possibile rimuovere la parola chiave abstract 🙂
  2. 5

    Se Jack dà una buona risposta, è importante sottolineare che l’interprete PHP per sé è un metodo per descrivere il modo corretto per rappresentare un oggetto o variabile:

    php > $someObject = new stdClass();
    php > $someObject->name = 'Ethan';
    php > var_export($someObject);
    stdClass::__set_state(array(
       'name' => 'Ethan',
    ))

    È interessante notare che, utilizzando stdClass::__set_state non riesce a creare un stdClass object, mostrando così come è probabile che un bug in var_export(). Tuttavia, illustrano che non c’è nessun metodo semplice per creare il stdClass object con il set di attributi al momento della creazione dell’oggetto.

    • Buono a sapersi. Dai dai, Che comando hai usato per ottenere php interprete a riga di comando come interprete python (tipo, inserire, visualizzare l’output)?
    • Da Bash CLI: php -a
    • Grazie:) (5 in più per andare…)
  3. 1
            foreach ($attributes as $name => $value) {
                if (property_exists(self::class, $name)) {
                    $this->{$name} = $value;
                }
            }

    è più pulita, perché si impostare un attributo arbitrario se si print_r(get_object_vars($obj)) dell’oggetto restituito se l’attributo non esiste.

Lascia un commento