在php中创建匿名对象

Suj*_*wal 128 php oop object

我们知道,在JavaScript中创建匿名对象很容易,如下面的代码:

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

alert(object.p1[1]);
Run Code Online (Sandbox Code Playgroud)

输出:

an alert is raised with value "johnny"
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*Jon 219

在谈论对象时,"匿名"不是正确的术语.最好说"匿名类型的对象",但这不适用于PHP.

PHP中的所有对象都有一个类."默认"类是stdClass,您可以这样创建它的对象:

$obj = new stdClass;
$obj->aProperty = 'value';
Run Code Online (Sandbox Code Playgroud)

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

$obj = (object)array('aProperty' => 'value');
print_r($obj);
Run Code Online (Sandbox Code Playgroud)

但是,请注意,将数组转换为对象可能会为那些无效的PHP变量名称的数组键产生"有趣"的结果 - 例如,这是我的答案,显示当键以数字开头时会发生什么.

  • @CodingFreak:你可以,**但**:如果数组包含子数组,并且你也希望它们作为对象,你需要明确地将每个数组转换为对象. (2认同)

Riz*_*123 35

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


在php-7中,可以创建匿名类,因此您可以执行以下操作:

<?php

    class Foo {}
    $child = new class extends Foo {};

    var_dump($child instanceof Foo); // true

?>
Run Code Online (Sandbox Code Playgroud)

您可以在RFC中阅读更多相关信息(已被接受):https://wiki.php.net/rfc/anonymous_classes

但我不知道它与Javscript的实现有多相似,所以它们可能是javascript和php中匿名类之间的一些差异.

编辑:

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

  • 这很有意思,但它并没有真正解决这个问题,因为OP正在询问一种方便的方法,可以在不创建类的情况下使用各种成员初始化对象.我不确定是否可以使用php中的匿名类来执行此操作,如果可以,则不会解释如何使用. (3认同)

小智 20

对的,这是可能的!使用这个简单的PHP Anonymous Object类.这个怎么运作:

// 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"
Run Code Online (Sandbox Code Playgroud)

当然这个对象是一个AnObj类的实例,所以它不是真正的匿名,但它可以动态定义方法,就像JavaScript一样.


Zuk*_*uks 16

直到最近,这就是我如何动态创建对象.

$someObj = json_decode("{}");
Run Code Online (Sandbox Code Playgroud)

然后:

$someObj->someProperty = someValue;
Run Code Online (Sandbox Code Playgroud)

但现在我选择:

$someObj = (object)[];
Run Code Online (Sandbox Code Playgroud)

然后像以前一样:

$someObj->someProperty = someValue;
Run Code Online (Sandbox Code Playgroud)

当然,如果你已经知道属性和值,你可以像上面提到的那样设置它们:

$someObj = (object)['prop1' => 'value1','prop2' => 'value2'];
Run Code Online (Sandbox Code Playgroud)

注意:我不知道这适用于哪个版本的PHP,所以你需要注意这一点.但我认为第一种方法(如果没有在构造中设置的属性也很短)应适用于所有具有json_encode/json_decode的版本

  • 这与 $someObj = new \stdClass() 有什么不同? (2认同)

kba*_*kba 7

如果您希望模仿JavaScript,则可以创建一个类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];
?>
Run Code Online (Sandbox Code Playgroud)

那将输出元素2.这是从对PHP:Classes和Objects的评论中窃取的.


T.T*_*dua 6

速记:

$obj = (object)  ['myProp' => 'myVal'];
Run Code Online (Sandbox Code Playgroud)


mik*_*n32 5

自 PHP 7.0 起就提供了对匿名类的支持,并且是与问题中提供的 JavaScript 示例最接近的类似物。

<?php
$object = new class {
    var $p = "value";
    var $p1 = ["john", "johnny"];
};

echo $object->p1[1];
Run Code Online (Sandbox Code Playgroud)

属性的可见性声明不能省略(我只是使用它,var因为它比 短public。)

与 JavaScript 一样,您也可以为类定义方法:

<?php
$object = new class {
    var $p = "value";
    var $p1 = ["john", "johnny"];
    function foo() {return $this->p;}
};

echo $object->foo();
Run Code Online (Sandbox Code Playgroud)