我想在一个对象上添加一个函数,该函数从该对象返回特定值。
我现在有以下代码:
<?php
namespace sdk;
use core\Sdk;
class Contents extends Sdk {
public $url;
public $id;
public function __call($method, $args) {
if (isset($this->$method)) {
$func = $this->$method;
return call_user_func_array($func, $args);
}
}
public function getContents($id = '') {
$request = 'contents/list/'.$id;
return $this->getRequest($request);
}//getContents
public function getContent($id) {
$request = 'contents/detail/'.$id;
$this->object = $this->getRequest($request);
$this->object->getItemAttribute = function($attribute) {
var_dump($this->object);
};
return $this->object;
}//getContent
}//Class Contents
我尝试通过 tis 代码启动该方法
$contents->getContent(1);
$contents->object->getItemAttribute('titel');
但我不断收到错误“未定义的方法”
我做错了什么?
最佳答案
PHP 不是 JavaScript。您不能向类的现有实例添加方法(或向已定义的类添加方法)。
这里有一些替代想法:
使用作为函数的属性(原则上这就是您现在正在做的事情,只是使用不同的调用)。
$object->getItemAttribute = function($a) { return $object->{$a}; } call_user_func($object->getItemAttribute);
我实际上不建议实现这个,因为它可能会让你的代码难以理解,并且惹恼任何 future 的维护者(包括你自己)。
定义一个实现新函数的包装类:
class RequestWithAdditionalAttribute { private $wrapped; public function __construct(\stdClass $wrapped) { $this->wrapped = $wrapped; } public function getItemAttribute($a) { return $this->wrapped->{$a}; } } $wrappedObject = new RequestWithAdditionalAttribute($object)
PHP 7 变体:创建匿名类:
$wrappedObject = new class($object) { private $wrapped; public function __construct(\stdClass $wrapped) { $this->wrapped = $wrapped; } public function getItemAttribute($a) { return $this->wrapped->{$a}; } };
关于php - 动态添加方法到 stdClass 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34644118/