PHP对象文字

在PHP中,我可以很容易地指定数组文字:

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

但是,如果我想要数组对象呢? 我怎样才能在PHP中指定对象文字? 即在JavaScript中,这将是:

 [ {name: "John", hobby: "hiking"}, {name: "Jane", hobby: "dancing"} ] 

正如BoltClock所提到的那样,在PHP中没有对象字面值,但是你可以通过简单地将数组转换为对象来实现:

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

从PHP 5.4开始,您还可以使用短arrays语法:

 $json = [ (object) ['name' => 'John', 'hobby' => 'hiking'], (object) ['name' => 'Jane', 'hobby' => 'dancing'], ]; 

正如其他人所指出的那样,PHP中没有对象字面值,但是可以通过将数组强制转换为对象来“伪造”它。

使用PHP 5.4,这更简洁,因为数组可以用方括号来声明 。 例如:

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

这会给你一个带有“foo”和“bar”属性的对象。 但是,我不认为这比使用关联数组提供了更多的优势。 这只是一个语法差异。

考虑拥抱你使用的所有语言的独特性和“风味”。 在JavaScript中,对象文字已遍布全球。 在PHP中,关联数组在function上与JavaScript对象文字相同,易于创build,并且被其他PHP程序员理解。 我觉得你最好拥抱这个“味道”,而不是试图让它感觉像JavaScript的对象文字语法。

另一种方法是使用__set_state()魔术方法:

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

还有一些关于__set_state()方法,它来自哪里以及它应该如何使用。

在PHP中,你可以创build一个实例,然后才能使用类。 当然,您可以稍后将实例放入数组中。

如果你想在对象字面模式“像JavaScript”中定义模块,你可以做这样的事情:

 $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' ]); 

在这种types的模块化场景中,我通常select门面模式 ,就像我这样写我的电话:

 Module::action()->item; 

要么

 Post::get()->title; 

这些模式都不能使testing变得容易(甚至有时甚至可能)。 但这只是概念的certificate。 从技术上讲,“不”在PHP中没有对象文字,但是如果你习惯于JavaScript语法(我比PHP更像),你可以伪造它并做到这一点。 正如你所看到的,在PHP中比在JavaScript中更麻烦。

在PHP使用JavaScript风格的对象文字的方式如下:

首先我创build一个像这样的关联数组:

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

然后,我很容易使它成为这样一个对象:

 $test = (object)$test; 

现在你可以testing它:

 echo gettype($test); // "object" echo $test->name; // "test" 

尽pipe作为(对象)的投射在单一的等级层次上工作得很好,但它并不深入。 换句话说,如果我们想要在每一个级别的对象,我们必须做一些事情,如:

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

然而,我们可以把整个东西包装在json_encode和json_decode中,而不是像下面这样做:

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

这确保了它是最深处的一个对象。