我想在一个对象上添加一个函数,该函数从该对象返回一个特定的值。
我现在有以下代码:
<?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');
但我一直收到错误“未定义的方法”
我做错了什么?
答案 0 :(得分:1)
PHP不是Javascript。您不能将方法添加到类的现有实例(或者已经定义的类的方法)。
以下是一些不同的想法:
使用作为函数的属性(原则上你现在正在做什么,只是使用不同的调用)。
$object->getItemAttribute = function($a) {
return $object->{$a};
}
call_user_func($object->getItemAttribute);
我实际上不会建议实现这一点,因为它可能会让您的代码很难理解并惹恼未来任何维护者(包括您自己)。
定义一个实现新函数的包装类:
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};
}
};