在php中的std对象中添加方法

The*_*pha 16 php object stdclass

是否可以以这种方式添加方法/功能,例如

$arr = array(
    "nid"=> 20,
    "title" => "Something",
    "value" => "Something else",
    "my_method" => function($arg){....}
);
Run Code Online (Sandbox Code Playgroud)

或者像这样

$node = (object) $arr;
$node->my_method=function($arg){...};
Run Code Online (Sandbox Code Playgroud)

如果有可能那么我该如何使用该功能/方法?

kee*_*erm 16

您无法动态地将方法添加到stdClass并以正常方式执行它.但是,您可以做一些事情.

在第一个示例中,您将创建一个闭包.您可以通过发出命令来执行该闭包:

$arr['my_method']('Argument')
Run Code Online (Sandbox Code Playgroud)

您可以创建一个stdClass对象并为其中一个属性分配闭包,但由于语法冲突,您无法直接执行它.相反,你必须做以下事情:

$node = new stdClass();
$node->method = function($arg) { ... }
$func = $node->method;
$func('Argument');
Run Code Online (Sandbox Code Playgroud)

尝试

$node->method('Argument')
Run Code Online (Sandbox Code Playgroud)

会产生错误,因为stdClass上不存在方法"method".

使用魔法__call看到这个SO答案的一些光滑的hackery .


小智 14

现在可以在PHP 7.1中使用匿名类来实现

$node = new class {
    public $property;

    public function myMethod($arg) { 
        ...
    }
};

// and access them,
$node->property;
$node->myMethod('arg');
Run Code Online (Sandbox Code Playgroud)

  • 但这是否为已定义的对象添加了一个新函数? (2认同)

gou*_*oup 6

从 PHP 7 开始,也可以直接调用匿名函数属性:

$obj = new stdClass;
$obj->printMessage = function($message) { echo $message . "\n"; };
echo ($obj->printMessage)('Hello World'); // Hello World
Run Code Online (Sandbox Code Playgroud)

这里的表达式$obj->printMessage产生匿名函数,然后直接用参数 执行'Hello World'。然而,有必要在调用函数表达式之前将它放在括号中,这样以下仍然会失败:

echo $obj->printMessage('Hello World'); 
// Fatal error: Uncaught Error: Call to undefined method stdClass::printMessage()
Run Code Online (Sandbox Code Playgroud)