Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用反射从同一类的其他方法调用私有方法_Php_Oop_Reflection - Fatal编程技术网

在PHP中使用反射从同一类的其他方法调用私有方法

在PHP中使用反射从同一类的其他方法调用私有方法,php,oop,reflection,Php,Oop,Reflection,我想使用反射从类的其他方法调用私有方法,如下所示: class Foo { private function bar() { print "!@#"; } public function foobar($methodName) { $method = new ReflectionMethod(get_class($this), $methodName); $method->invoke($this); } }

我想使用反射从类的其他方法调用私有方法,如下所示:

class Foo {
    private function bar() {
        print "!@#";
    }
    public function foobar($methodName) {
        $method = new ReflectionMethod(get_class($this), $methodName);
        $method->invoke($this);
    }
}
$foo = new Foo();
$foo->foobar('bar');
此代码生成错误:

Fatal error: Uncaught exception 'ReflectionException' with message 'Trying to invoke     private method Foo::bar() from scope ReflectionMethod'
这让我很困惑,因为我在同一个类方法的范围内调用invoke。如果不使用$this->$methodName(),调用_user\u func\u数组(…),有什么方法可以实现我想要的吗?另外,使用$method->setAccessible(true)是不可取的,因为它破坏了封装概念


谢谢您的关注。

那么
$this->$methodname()
有什么问题吗?要回答您有关
$method->setAccessible(true)
的问题,是的,它是肮脏的,但是您想要在这里做的想法无论如何都是肮脏的。。。不管怎么说,您正在创建公共方法,只是有点晦涩难懂。我认为使用反射更清晰、更符合逻辑。我展示了一个简单的例子,事实上类
Foo
是一个用于执行的公共方法和许多用于根据给定给执行方法的参数生成输出的私有视图方法。是否更清楚<代码>$this->$methodname()并不难理解,老实说,它比尝试开始使用反射方法更清晰。(我并不是说反思是不好的,但在这个简单的例子中,这不是一条路。)