在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