在PHP中创build匿名对象

我们知道,在JavaScript中创build匿名对象很简单,就像下面的代码一样:

var object = { p : "value", p1 : [ "john", "johnny" ] } ; alert(object.p1[1]) ; 

输出:

 an alert is raised with value "johnny" 

在PHP的情况下可以应用这种相同的技术? 我们可以在PHP中创build匿名对象吗?

已经有几年了,但我想我需要保持信息最新!

在php-7中可以创build匿名类,所以你可以做这样的事情:

 <?php class Foo {} $child = new class extends Foo {}; var_dump($child instanceof Foo); // true ?> 

您可以在RFC(它被接受)阅读更多关于这个: https : //wiki.php.net/rfc/anonymous_classes

但是我不知道它是如何实现的Javscript,所以他们可能会在JavaScript和PHP匿名类之间的一些差异。

编辑:

从发表的评论,现在是这个手册的链接: http : //php.net/manual/en/language.oop5.anonymous.php

谈论物体时,“匿名”不是正确的术语。 最好是说“匿名types的对象”,但这不适用于PHP。

PHP中的所有对象都有一个类。 “default”类是stdClass ,你可以这样创build它的对象:

 $obj = new stdClass; $obj->aProperty = 'value'; 

您还可以利用将数组转换为对象来获得更方便的语法:

 $obj = (object)array('aProperty' => 'value'); print_r($obj); 

但是,请注意,将数组转换为对象可能会对那些不是有效的PHPvariables名称的数组键值产生“有趣的”结果 – 例如, 这里是我的答案,显示了以数字开头的情况。

是的,这是可能的! 使用这个简单的PHP匿名对象类。 怎么运行的:

 // define by passing in constructor $anonim_obj = new AnObj(array( "foo" => function() { echo "foo"; }, "bar" => function($bar) { echo $bar; } )); $anonim_obj->foo(); // prints "foo" $anonim_obj->bar("hello, world"); // prints "hello, world" // define at runtime $anonim_obj->zoo = function() { echo "zoo"; }; $anonim_obj->zoo(); // prints "zoo" // mimic self $anonim_obj->prop = "abc"; $anonim_obj->propMethod = function() use($anonim_obj) { echo $anonim_obj->prop; }; $anonim_obj->propMethod(); // prints "abc" 

当然,这个对象是AnObj类的一个实例,所以它不是真正的匿名,但它可以像JavaScript一样快速地定义方法。

如果你想模仿JavaScript,你可以创build一个类Object ,从而得到相同的行为。 当然,这不是一个匿名的,但它会起作用。

 <?php class Object { function __construct( ) { $n = func_num_args( ) ; for ( $i = 0 ; $i < $n ; $i += 2 ) { $this->{func_get_arg($i)} = func_get_arg($i + 1) ; } } } $o = new Object( 'aProperty', 'value', 'anotherProperty', array('element 1', 'element 2')) ; echo $o->anotherProperty[1]; ?> 

这将输出元素2 。 这是从PHP的评论:类和对象被盗。

直到最近,这是我如何创build对象。

 $someObj = json_decode("{}"); 

然后:

 $someObj->someProperty = someValue; 

但是现在我跟着去

 $someObj = (object)[]; 

然后像以前一样:

 $someObj->someProperty = someValue; 

当然,如果你已经知道的属性和值,你可以在里面设置它们:

 $someObj = (object)['prop1' => 'value1','prop2' => 'value2']; 

注意:我不知道哪个版本的PHP可以工作,所以您需要注意这一点。 但是我认为第一种方法(如果在构造中没有属性,也是简短的)应该适用于所有具有json_encode / json_decode的版本

在PHP的情况下可以应用这种相同的技术?

不 – 因为JavaScript使用原型/直接声明对象 – 在PHP(和许多其他OO语言)中,只能从一个类创build一个对象。

所以问题就变成了 – 你能创build一个匿名类吗?

答案又是否定的 – 你如何实例化这个类而不能引用它呢?

如果你想用dynamic属性创build对象(比如在javascript中),而不会收到未定义属性的警告,那么当你没有为属性设置一个值时

 class stdClass { public function __construct(array $arguments = array()) { if (!empty($arguments)) { foreach ($arguments as $property => $argument) { if(is_numeric($property)): $this->{$argument} = null; else: $this->{$property} = $argument; endif; } } } public function __call($method, $arguments) { $arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this). if (isset($this->{$method}) && is_callable($this->{$method})) { return call_user_func_array($this->{$method}, $arguments); } else { throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()"); } } public function __get($name){ if(property_exists($this, $name)): return $this->{$name}; else: return $this->{$name} = null; endif; } public function __set($name, $value) { $this->{$name} = $value; } } $obj1 = new stdClass(['property1','property2'=>'value']); //assign default property echo $obj1->property1;//null echo $obj1->property2;//value $obj2 = new stdClass();//without properties set echo $obj2->property1;//null