Узнайте, является ли метод защищенным или общедоступным - PullRequest
4 голосов
/ 24 марта 2011

С помощью этого кода я пытаюсь проверить, могу ли я вызывать определенные функции

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

однако теперь я хочу иметь возможность ограничить выполнение, если метод $ защищен, что мне нужно сделать?

Ответы [ 2 ]

7 голосов
/ 24 марта 2011

Вы захотите использовать Отражение .

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
0 голосов
/ 24 марта 2011

Вы должны использовать ReflectionMethod. Вы можете использовать isProtected и isPublic, а также 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 Reflection, и, возможно, есть более прямой способ сделать это с помощью ReflectionClass или чего-то еще

...