php - 动态添加方法到 stdClass 对象

标签 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');

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

我做错了什么?

最佳答案

PHP 不是 JavaScript。您不能向类的现有实例添加方法(或向已定义的类添加方法)。

这里有一些替代想法:

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

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

    我实际上不建议实现这个,因为它可能会让你的代码难以理解,并且惹恼任何 future 的维护者(包括你自己)。

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

关于php - 动态添加方法到 stdClass 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34644118/

相关文章:

javascript - 在 Javascript 中反转对象数组

Java方法和调用方法太多次

php - PDO 查询中的 SQL 语法错误

PHP使用正则表达式将字符串解析为数组

PHP MySql 更新查询不起作用,说 :- Undefined Index

java - 能够单独输入第一个对象的名称

javascript - 如何在元素单击时获取对象属性?

PHP从MySQL数据库字段中提取多张图像

javascript - 奇怪的 JavaScript 行为(我期待递归)

Java:方法在哪里?