2011-03-24 2 views
4

Avec ce code, je suis en train de tester si je peux appeler certaines fonctionssavoir si une méthode est protégé ou public

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

mais maintenant, je veux être en mesure de limiter l'exécution si la méthode $ est protégé, que devrais-je faire?

Répondre

7

Vous devez utiliser 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"; 
} 

Sortie:

bar: Public 
baz: Protected 
qux: Private 

Vous pouvez également instancier l'objet ReflectionMethod par classe et nom fonction:

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

Ai-je besoin de vérifier si la méthode $ existe, ou serait est public être 0 si la méthode est indéfinie? – Moak

+0

Si vous essayez de construire ReflectionMethod sur une méthode qui n'existe pas, elle lèvera une exception. la première chose qu'il faisait avec 'ReflectionObject' itère à travers les méthodes existantes, donc ce n'est pas un problème –

+0

@Moak: Vous pouvez utiliser [' ReflectionObject :: hasMethod'] (http://us2.php.net/manual/fr/reflectionclass .hasmethod.php) pour tester l'existence de la méthode. Cela fonctionne * même pour des méthodes privées * lors de la vérification en dehors de la classe. – Charles

0

Vous devez utiliser ReflectionMethod. Vous pouvez utiliser isProtected et isPublic ainsi que 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; 

Comme pour vérifier si oui ou non la méthode existe, vous pouvez le faire comme vous le faites maintenant avec method_exists ou simplement essayer de construire le ReflectionMethod et une exception sera levée si elle n'existe pas. ReflectionClass a une fonction getMethods pour vous obtenir un tableau de toutes les méthodes d'une classe si vous souhaitez utiliser cela.

Disclaimer - Je ne sais pas PHP réflexion trop bien, et il pourrait y avoir une façon plus directe de le faire avec ReflectionClass ou quelque chose d'autre

Questions connexes