PHP Conference Japan 2024

ReflectionClass::hasMethod

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

ReflectionClass::hasMethod检查方法是否已定义

描述

public ReflectionClass::hasMethod(string $name): bool

检查类中是否定义了特定方法。

参数

name

要检查的方法名称。

返回值

如果存在该方法,则返回true,否则返回false

示例

示例 #1 ReflectionClass::hasMethod() 示例

<?php
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类不应该有bar方法
var_dump($rc->hasMethod('bar'));

// 方法名不区分大小写
var_dump($rc->hasMethod('PUBLICfOO'));
?>

以上示例将输出

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

参见

添加备注

用户贡献的备注 6 条备注

4
phoenix at todofixthis dot com
14 年前
父类方法(无论可见性如何)也适用于 ReflectionObject。例如:

<?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
?>
1
dn dot permyakov at gmail dot com
5 年前
特质方法可以通过实际名称和别名来查看

<?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)
0
flancer64 at gmail dot com
8 年前
使用PHP魔术方法实现的带注释的方法不被“hasMethod”识别。

<?php
/**
* @method void annotatedMethod()
*/
class SomeClass
{
public function
__call($name, $arguments)
{
echo
"这是一个魔术方法: $name.\n";
}

public function
codedMethod()
{
echo
"这是一个已编码的方法.\n";
}
}

$obj = new \SomeClass();
$obj->codedMethod();
$obj->annotatedMethod();

$ref = new ReflectionClass(\SomeClass::class);
echo
"SomeClass 拥有 'codedMethod': " . json_encode($ref->hasMethod('codedMethod')) . ".\n";
echo
"SomeClass 拥有 'annotatedMethod': " . json_encode($ref->hasMethod('annotatedMethod')) . ".\n";
?>

输出

这是一个已编码的方法。
这是一个魔术方法: annotatedMethod。
SomeClass 拥有 'codedMethod': true。
SomeClass 拥有 'annotatedMethod': false。
0
hanguofeng at gmail dot com
14 年前
注意,即使是私有方法也会被识别为“存在”。
-1
Xorifelse
7年前
值得注意的是,这是唯一确定特性是否具有特定方法的方法。

特性 a{
函数 __wakeup(){}
}

类 b{}

类 c{
使用 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
-4
michaelgranados at gmail dot com
12年前
一种检查是否可以对类调用方法的方法

<?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();
}
?>
To Top