• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • ReflectionClass::hasMethod()

    (PHP 5 >= 5.1.2, PHP 7)

    检查方法是否已定义

    说明

    publicReflectionClass::hasMethod(string $name): bool

    检查一个类中指定的方法是否已定义。

    参数

    $name

    要检查的方法的名称。

    返回值

    如果有这个方法返回TRUE,否则返回FALSE

    范例

    Example #1ReflectionClass::hasMethod()例子

    <?php
    Class C {
        public function publicFoo() {
            return true;
        }
        protected function protectedFoo() {
            return true;
        }
        private function privateFoo() {
            return true;
        }
        static function staticFoo() {
            return true;
        }
    }
    $rc = new ReflectionClass("C");
    var_dump($rc->hasMethod('publicFoo'));
    var_dump($rc->hasMethod('protectedFoo'));
    var_dump($rc->hasMethod('privateFoo'));
    var_dump($rc->hasMethod('staticFoo'));
    // C should not have method bar
    var_dump($rc->hasMethod('bar'));
    // Method names are case insensitive
    var_dump($rc->hasMethod('PUBLICfOO'));
    ?>
    

    以上例程会输出:

    bool(true)
    bool(true)
    bool(true)
    bool(true)
    bool(false)
    bool(true)
    

    参见

    • ReflectionClass::hasConstant() 检查常量是否已经定义
    • ReflectionClass::hasProperty() 检查属性是否已定义
    Parent methods (regardless of visibility) are also available to a ReflectionObject. E.g.,
    <?php
    class ParentObject {
     public function parentPublic( ) {
     }
     private function parentPrivate( ) {
     }
    }
    class ChildObject extends ParentObject {
    }
    $Instance = new ChildObject();
    $Reflector = new ReflectionObject($Instance);
    var_dump($Reflector->hasMethod('parentPublic')); // true
    var_dump($Reflector->hasMethod('parentPrivate')); // true
    ?>
    
    Trait methods can be seen by both actual and alias names
    <?php
    trait Sauce
    {
      public function getSpicy()
      {
        return 'Cayenne';
      }
    }
    class Sandwich
    {
      use Sauce {
        Sauce::getSpicy as getSweet;
      }
    }
    $class = new \ReflectionClass('Sandwich');
    var_dump($class->hasMethod('getSweet'));
    var_dump($class->hasMethod('getSpicy'));
    ?>
    bool(true)
    bool(true)
    note that even if private method will also be 'has'.
    It might be interesting to know that this is the only method to determine if a trait has a specific method:
     trait a{
      function __wakeup(){}
     }
     class b{}
     class c{
      use a;
     }
     var_dump((new ReflectionClass('a'))->hasMethod('__wakeup')); // true
     var_dump((new ReflectionClass('b'))->hasMethod('__wakeup')); // false
     var_dump((new ReflectionClass('c'))->hasMethod('__wakeup')); // true
    Annotated methods that are implemented using PHP magic methods are not recognized by "hasMethod".
    <?php
    /**
     * @method void annotatedMethod()
     */
    class SomeClass
    {
      public function __call($name, $arguments)
      {
        echo "this is magic method: $name.\n";
      }
      public function codedMethod()
      {
        echo "this is coded method.\n";
      }
    }
    $obj = new \SomeClass();
    $obj->codedMethod();
    $obj->annotatedMethod();
    $ref = new ReflectionClass(\SomeClass::class);
    echo "SomeClass has 'codedMethod': " . json_encode($ref->hasMethod('codedMethod')) . ".\n";
    echo "SomeClass has 'annotatedMethod': " . json_encode($ref->hasMethod('annotatedMethod')) . ".\n";
    ?>
    Output:
    this is coded method.
    this is magic method: annotatedMethod.
    SomeClass has 'codedMethod': true.
    SomeClass has 'annotatedMethod': false.
    A way to check if you can call an method over a class:
    <?php
    function is_public_method(
        /* string */$className,
        /* string */$method
    ){
      $classInstance = new ReflectionClass($className);
      if ($classInstance->hasMethod($method)) {
        return false;
      }
      $methodInstance = $instance->getMethod($method);
      return $methodInstance->isPublic();
    }
    ?>