找出方法是受保护还是公开

时间:2011-03-24 06:16:29

标签: php protected public-method

使用此代码我试图测试我是否可以调用某些函数

if (method_exists($this, $method))
    $this->$method();

但是现在我希望能够限制执行,如果$方法受到保护,我还需要做什么?

2 个答案:

答案 0 :(得分:7)

您需要使用Reflection

class Foo { 
    public function bar() { } 
    protected function baz() { } 
    private function qux() { } 
}
$f = new Foo();
$f_reflect = new ReflectionObject($f);
foreach($f_reflect->getMethods() as $method) {
    echo $method->name, ": ";
    if($method->isPublic()) echo "Public\n";
    if($method->isProtected()) echo "Protected\n";
    if($method->isPrivate()) echo "Private\n";
}

输出:

bar: Public
baz: Protected
qux: Private

您还可以按类和函数名实例化ReflectionMethod对象:

$bar_reflect = new ReflectionMethod('Foo', 'bar');
echo $bar_reflect->isPublic(); // 1

答案 1 :(得分:0)

您应该使用ReflectionMethod。您可以使用isProtectedisPublic以及getModifiers

http://www.php.net/manual/en/class.reflectionmethod.php http://www.php.net/manual/en/reflectionmethod.getmodifiers.php

$rm = new ReflectionMethod($this, $method); //first argument can be string name of class or an instance of it.  i had get_class here before but its unnecessary
$isPublic = $rm->isPublic();
$isProtected = $rm->isProtected();
$modifierInt = $rm->getModifiers();
$isPublic2 = $modifierInt & 256; $isProtected2 = $modifierInt & 512;

至于检查方法是否存在,您可以像现在一样使用method_exists或只是尝试构造ReflectionMethod,如果它不存在则抛出异常。 ReflectionClass有一个函数getMethods,如果你想使用它,可以获得所有类方法的数组。

免责声明 - 我不太了解PHP反射,并且可能有更直接的方法使用ReflectionClass或其他东西