【问题标题】:add methods on the fly to stdClass object动态添加方法到 stdClass 对象
【发布时间】:2016-01-06 22:31:48
【问题描述】:

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

我现在有以下代码:

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

但我不断收到错误“未定义的方法”

我做错了什么?

【问题讨论】:

  • 你不能给stdClass添加方法,但是如果你在运行php7,你可以创建一个匿名类......除了你的类不是stdClass
  • 好吧,我不是:/还有其他方法可以得到想要的结果吗?
  • 你就不能用魔术__get()方法吗?
  • 我不知道它是如何工作的......

标签: php object methods


【解决方案1】:

PHP 不是 Javascript。您不能向已存在的类实例添加方法(或向已定义的类添加方法)。

这里有一些替代想法:

  1. 使用 properties 即函数(原则上您现在正在执行此操作,只是使用不同的调用)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2013-04-13
    • 1970-01-01
    • 2012-10-22
    • 2011-01-05
    • 2013-02-27
    • 1970-01-01
    相关资源
    最近更新 更多