在PHP中创建匿名对象

155

众所周知,在JavaScript中创建匿名对象很容易,如下面的代码:

var object = { 
    p : "value", 
    p1 : [ "john", "johnny" ]
};

alert(object.p1[1]);

输出:

an alert is raised with value "johnny"

这个技巧能在PHP中应用吗?我们能在PHP中创建匿名对象吗?


1
注意:这是一个旧问题,所以被接受的答案已经过时。现在PHP 7已经添加了所需的功能。请参见@Rizier123下面的答案。 - Simba
@Simba - 感谢您指出这个问题。您是否愿意在此页面上发布一个答案,以帮助未来的访问者? - Sujit Agarwal
1
我不需要,因为已经有一个包含此信息的答案了(请参见下面,由@Rizier123提供)。 - Simba
这个回答根本没有回答问题啊?不确定为什么标记为被接受。 - undefined
12个回答

0
如果您想创建具有动态属性的对象(类似于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

-1
这种技术能否应用于PHP中?
不行,因为JavaScript使用原型/对象的直接声明,而在PHP(以及许多其他面向对象的语言)中,对象只能从类创建。
所以问题变成了 - 你能创建一个匿名类吗?
同样的答案是不行 - 如果不能引用它,你怎么实例化这个类呢?

创建匿名类的实例不需要名称。Java:Object var = new Object() { ... }; -- C++:class { ... } var; - TheOperator
1
现在你可以在PHP中创建匿名类。 - Victor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接