PHP objet littéral

En PHP, je peux spécifier des littéraux de tableau assez facilement:

array(
    array("name" => "John", "hobby" => "hiking"),
    array("name" => "Jane", "hobby" => "dancing"),
    ...
)

Mais Que faire si je veux un tableau d'objets? Comment puis-je spécifier un littéral d'objet en PHP? C'est-à-dire en javascript ce serait:

[
    {name: "John", hobby: "hiking"},
    {name: "Jane", hobby: "dancing"}
]
45
demandé sur TMS 2012-03-10 11:54:54

9 réponses

Comme BoltClock l'a mentionné, il n'y a pas de littéral d'objet en PHP, mais vous pouvez le faire en tapant simplement la conversion des tableaux en objets:

$testArray = array(
    (object)array("name" => "John", "hobby" => "hiking"),
    (object)array("name" => "Jane", "hobby" => "dancing")
);

echo "Person 1 Name: ".$testArray[0]->name;
echo "Person 2 Hobby: ".$testArray[1]->hobby;
70
répondu Tim 2012-03-10 08:16:58

À partir de PHP 5.4, vous pouvez également utiliser la syntaxe short array:

$json = [
    (object) ['name' => 'John', 'hobby' => 'hiking'],
    (object) ['name' => 'Jane', 'hobby' => 'dancing'],
];
55
répondu mipa 2013-02-27 19:53:00

Comme d'autres l'ont noté, il n'y a pas de littéral d'objet en PHP, mais vous pouvez le "simuler" en lançant un tableau sur un objet.

Avec PHP 5.4, c'est encore plus concis, car les tableaux peuvent être déclarés avec des crochets. Par exemple:

$obj = (object)[
    "foo" => "bar",
    "bar" => "foo",
];

Cela vous donnerait un objet avec les propriétés " foo " et "bar". Cependant, je ne pense pas que cela offre vraiment beaucoup d'avantages par rapport à l'utilisation de tableaux associatifs. C'est juste une différence de syntaxe.

Envisager d'embrasser l'unicité et "saveur" de toutes les langues que vous utilisez. En JavaScript, les littéraux d'objets sont partout. En PHP, les tableaux associatifs sont fonctionnellement les mêmes que les littéraux D'objets JavaScript, sont faciles à créer et sont bien compris par les autres programmeurs PHP. Je pense que vous feriez mieux d'embrasser cette "saveur" que d'essayer de la faire ressembler à la syntaxe littérale de L'objet de JavaScript.

7
répondu Josh 2014-06-12 15:23:50

Une autre façon serait d'utiliser le __set_state() méthode magique:

$object = stdClass::__set_state (array (
    'height'   => -10924,
    'color'    => 'purple',
    'happy'    => false,
    'video-yt' => 'AgcnU74Ld8Q'
));

Un peu plus sur la méthode __set_state (), d'où vient - elle et comment est-elle supposée être utilisée.

4
répondu Septagram 2013-02-21 10:08:10

En PHP, vous devez créer une instance avant de pouvoir utiliser une classe. Bien sûr, vous pouvez mettre les instances dans un tableau plus tard.

0
répondu pgampe 2012-03-10 08:06:58

Si vous voulez définir des modules dans le modèle littéral de l'objet "like JavaScript", vous pouvez faire quelque chose comme ceci:

$object = (object) [
    'config' => (object) [
        'username' => 'Rob Bennet',
        'email' => 'rob@madebyhoundstooth.com'
    ],

    'hello' => function() use(&$object) {
        return "Hello " . $object->config->username . ". ";
    },

    'emailDisplay' => function() use(&$object) {
        return "Your email address is " . $object->config->email;
    },

    'init' => function($options) use(&$object) {
        $object->config = $options;
        $doUsername = $object->hello;
        $doEmail = $object->emailDisplay;
        return $doUsername() . $doEmail();
    }
];

$sayMyInfo = $object->init;

echo $sayMyInfo((object) [
    'username' => 'Logan',
        'email' => 'wolverine@xmen.com'
]);

Dans ce type de scénario modulaire, j'opte généralement pour le modèle de façade , j'aime juste écrire mes appels ainsi:

Module::action()->item;

Ou

Post::get()->title;

Aucun de ces modèles ne le rend facile (ou même possible parfois) pour les tests. Mais c'est juste une preuve de concept. Techniquement, " non " il n'y a pas de littéral D'objet en PHP, mais si vous êtes habitué à Syntaxe JavaScript (que je suis plus que PHP), vous pouvez le simuler et le faire. Comme vous pouvez le voir, C'est beaucoup plus compliqué en PHP qu'en JavaScript.

0
répondu Rob Bennet 2013-06-01 00:50:58

Ma façon de littéraux d'objets de style JavaScript en PHP est comme suit:

D'abord, je crée un tableau associatif comme ceci:

$test = array(
  'name' => "test",
  'exists' => true
);

Ensuite, je fais facilement un objet comme ceci:

$test = (object)$test;

Maintenant, vous pouvez le tester:

echo gettype($test); // "object"
echo $test->name; // "test"
0
répondu Reza Baradaran Gazorisangi 2015-07-18 16:46:55

Bien que le casting en tant que (objet) fonctionne bien sur un seul niveau hiérarchique, il ne va pas en profondeur. En d'autres termes, si nous voulons des objets à tous les niveaux, nous devrions faire quelque chose comme:

$foods = (object)[
  "fruits" => (object)["apple" => 1, "banana" => 2, "cherry" => 3],
  "vegetables" => (object)["asparagus" => 4, "broccoli" => 5, "carrot" => 6]
];

Cependant, au lieu de faire plusieurs casting en tant qu'objets, nous pouvons envelopper le tout dans un json_encode et json_decode comme ceci:

$foods = json_decode(json_encode([
  "fruits" => ["apple" => 1, "banana" => 2, "cherry" => 3],
  "vegetables" => ["asparagus" => 4, "broccoli" => 5, "carrot" => 6]
]));

Cela garantit que c'est un objet au niveau le plus profond.

0
répondu Dave Lampert 2016-06-08 03:40:59

Si le json_decode(json_encode( $array )) n'est pas bon pour vous, vous pouvez utiliser des fonctions similaires comme celles-ci. Lequel est le plus rapide, Je ne sais pas.

function deep_cast_object( $o ){
  return deep_cast_object_ref( $o );
}

function deep_cast_object_ref( & $o ){

  if( is_array( $o ))
    $o = (object)$o;

  if( is_object( $o ))
    foreach( $o as & $v )
      deep_cast_object_ref( $v );

  return $o;
}

$obj = deep_cast_object(array(
  'Fractal' => array(
    'of'    => array(
      'bad' => 'design',
    ),
  ),
));

var_dump( $obj );
0
répondu biziclop 2018-07-10 16:50:38