如何访问此声明中的第二个属性或方法
$this->test->hello();
在我的__get()
中,我只能弄清楚如何找出test
属性是什么。我希望能够捕获'hello'方法调用。并用它做一些动态的事情。
所以简而言之,如果我输入
$this->test->hello()
我想echo
每个细分
echo $propert // test
echo $method //hello
问题是我的测试用于从外部类实例化一个新的类对象。方法hello
属于test
类对象。
我想在__get()
。
我该怎么做?
编辑:
public function __get($name)
{
if ($name == 'system' || $name == 'sys') {
$_class = 'System_Helper';
} else {
foreach (get_object_vars($this) as $_property => $_value) {
if ($name == $_property)
$_class = $name;
}
}
$classname = '\\System\\' . ucfirst($_class);
$this->$_class = new $classname();
//$rClass = new \ReflectionClass($this->$_class);
$rClass = get_class_methods($this->$_class);
foreach($rClass as $k => $v)
echo $v."\n";
//print_r($rClass);
return $this->$_class;
答案 0 :(得分:1)
您似乎正在使用某种代理类,这可能符合您的需求。
class ObjectProxy {
public $object;
public function __construct($object) {
$this->object = $object;
}
public function __get($name) {
if (!property_exists($this->object, $name)) {
return "Error: property ($name) does not exist";
}
return $this->object->$name;
}
public function __call($name, $args) {
if (!method_exists($this->object, $name)) {
return "Error: method ($name) does not exist";
}
return call_user_func_array(array($this->object, $name), $args);
}
}
class A {
public $prop = 'Some prop';
public function hello() {
return 'Hello, world!';
}
}
class B {
public function __get($name) {
if (!isset($this->$name)) {
$class_name = ucfirst($name);
$this->$name = new ObjectProxy(new $class_name);
}
return $this->$name;
}
}
$b = new B();
var_dump($b->a->hello());
var_dump($b->a->prop);
var_dump($b->a->foo);
var_dump($b->a->bar());
输出:
string 'Hello, world!' (length=13)
string 'Some prop' (length=9)
string 'Error: property (foo) does not exist' (length=36)
string 'Error: method (bar) does not exist' (length=34)
示例:
可以轻松扩展其他魔术方法,例如__set
,__callStatic
,__isset
,__invoke
等。
答案 1 :(得分:0)
我认为您要使用__call
代替__get
。另外,不要。
答案 2 :(得分:0)
您为$this
实例化的对象将使用__get
魔术方法创建对象(作为属性)test
。存储在$this->test
的对象需要实现__call
魔术方法才能使用hello()
(如果未定义)