即时添加方法到stdClass对象

时间:2016-01-06 22:31:48

标签: php object methods

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

我现在有以下代码:

    <?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');

但我一直收到错误“未定义的方法”

我做错了什么?

1 个答案:

答案 0 :(得分:1)

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};
        }
    };