使用此代码,我正在尝试测试是否可以调用某些函数
if (method_exists($this, $method))
$this->$method();
但是现在如果 $method 受到保护,我希望能够限制执行,我需要做什么?
使用此代码,我正在尝试测试是否可以调用某些函数
if (method_exists($this, $method))
$this->$method();
但是现在如果 $method 受到保护,我希望能够限制执行,我需要做什么?
你会想要使用反射。
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
您应该使用反射方法。您可以使用isProtected
andisPublic
以及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 或其他方法来做到这一点