PHP Conference Japan 2024

ReflectionClass::hasMethod

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

ReflectionClass::hasMethod檢查方法是否已定義

說明

public ReflectionClass::hasMethod(字串 $name): 布林值

檢查類別中是否定義了特定方法。

參數

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 則註解

phoenix at todofixthis dot com
14 年前
父類別的方法(不論可見性)也可供 ReflectionObject 使用。例如:

<?php
類別 ParentObject {
public function
parentPublic( ) {
}

private function
parentPrivate( ) {
}
}

類別
ChildObject 繼承 ParentObject {
}

$Instance = new ChildObject();
$Reflector = new ReflectionObject($Instance);

var_dump($Reflector->hasMethod('parentPublic')); // true
var_dump($Reflector->hasMethod('parentPrivate')); // true
?>
dn dot permyakov at gmail dot com
5 年前
特徵 (Trait) 的方法可以用實際名稱和別名來查看

<?php

trait Sauce
{
public function
getSpicy()
{
return
'Cayenne';
}
}

類別
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)
flancer64 at gmail dot com
8 年前
使用 PHP 魔術方法實作的已註釋方法無法被 "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";
?>

輸出結果

this is coded method.
this is magic method: annotatedMethod.
SomeClass has 'codedMethod': true.
SomeClass has 'annotatedMethod': false.
hanguofeng at gmail dot com
14 年前
注意,即使是私有方法也會被判斷為「有」。
Xorifelse
7 年前
有趣的是,這是唯一能判斷 trait 是否有特定方法的方式

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
michaelgranados at gmail dot com
12 年前
一種檢查是否可以在類別上呼叫方法的方式

<?php
函式 is_public_method(
/* 字串 */$className,
/* 字串 */$method
){
$classInstance = new ReflectionClass($className);
if (
$classInstance->hasMethod($method)) {
return
false;
}
$methodInstance = $instance->getMethod($method);
return
$methodInstance->isPublic();
}
?>
To Top