向stdClass对象动态添加方法


add methods on the fly to stdClass object

我想在对象上添加一个函数,该函数从该对象返回特定值。

我现在有以下代码:

    <?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。不能将方法添加到类的现有实例中(或者将方法添加至已定义的类中)。

以下是一些替代方案:

  1. 使用作为函数的属性(原则上,这就是您现在所做的,只是使用不同的调用)。

    $object->getItemAttribute = function($a) {
        return $object->{$a};
    }
    call_user_func($object->getItemAttribute);
    

    实际上,我不建议实现这一点,因为这可能会使您的代码难以理解,并让任何未来的维护人员(包括您自己)感到恼火。

  2. 定义一个实现新函数的包装类:

    class RequestWithAdditionalAttribute {
        private $wrapped;
        public function __construct('stdClass $wrapped) {
            $this->wrapped = $wrapped;
        }
        public function getItemAttribute($a) {
            return $this->wrapped->{$a};
        }
    }
    $wrappedObject = new RequestWithAdditionalAttribute($object)
    
  3. PHP 7变体:创建一个匿名类:

    $wrappedObject = new class($object) {
        private $wrapped;
        public function __construct('stdClass $wrapped) {
            $this->wrapped = $wrapped;
        }
        public function getItemAttribute($a) {
            return $this->wrapped->{$a};
        }
    };