PHP Conference Japan 2024

get_class_methods

(PHP 4, PHP 5, PHP 7, PHP 8)

get_class_methods获取类的所有方法名

描述

get_class_methods(对象|字符串 $object_or_class): 数组

获取类的方法名。

参数

object_or_class

类名或对象实例

返回值

返回由 object_or_class 指定的类定义的所有方法名组成的数组。

变更日志

版本 描述
8.0.0 object_or_class 参数现在仅接受对象或有效的类名。

范例

示例 #1 get_class_methods() 例子

<?php

class myclass {
// 构造函数
function __construct()
{
return(
true);
}

// 方法 1
function myfunc1()
{
return(
true);
}

// 方法 2
function myfunc2()
{
return(
true);
}
}

$class_methods = get_class_methods('myclass');
// 或者
$class_methods = get_class_methods(new myclass());

foreach (
$class_methods as $method_name) {
echo
"$method_name\n";
}

?>

以上示例将输出

__construct
myfunc1
myfunc2

参见

添加注释

用户贡献的注释 13 个注释

fschmengler at sgh-it dot eu
14 年前
需要注意的是,返回的方法取决于当前作用域。请参见以下示例

<?php
class C
{
private function
privateMethod()
{

}
public function
publicMethod()
{

}
public function
__construct()
{
echo
'$this:';
var_dump(get_class_methods($this));
echo
'C (inside class):';
var_dump(get_class_methods('C'));
}
}
$c = new C;
echo
'$c:';
var_dump(get_class_methods($c));
echo
'C (outside class):';
var_dump(get_class_methods('C'));
?>

输出

$this
数组
0 => 字符串 'privateMethod' (长度为 13)
1 => 字符串 'publicMethod' (长度为 12)
2 => 字符串 '__construct' (长度为 11)

C (类内)
数组
0 => 字符串 'privateMethod' (长度为 13)
1 => 字符串 'publicMethod' (长度为 12)
2 => 字符串 '__construct' (长度为 11)

$c
数组
0 => 字符串 'publicMethod' (长度为 12)
1 => 字符串 '__construct' (长度为 11)

C (类外)
数组
0 => 字符串 'publicMethod' (长度为 12)
1 => 字符串 '__construct' (长度为 11)
gk at proliberty dot com
21 年前
需要注意的是,get_class_methods($class) 不仅返回 $class 定义的方法,还返回继承的方法。

似乎没有任何 PHP 函数可以确定哪些方法是继承的,哪些是由类显式定义的。
onesimus at cox dot net
20 年前
此函数仅返回您指示的对象的方法。它将剔除继承的方法。

function get_this_class_methods($class){
$array1 = get_class_methods($class);
if($parent_class = get_parent_class($class)){
$array2 = get_class_methods($parent_class);
$array3 = array_diff($array1, $array2);
}else{
$array3 = $array1;
}
return($array3);
}
matt at zevi dot net
22 年前
仅限 Win32

这里可能值得注意的是,您无法获取由内置 'COM' 类创建的对象的方法。例如 - 这将不起作用

$word = new COM('Word.Application');
$methods = get_class_methods(get_class($word));
print_r($methods);

Matt
jazepstein at greenash dot net dot au
19 年前
在 PHP4 中,此函数将其返回值转换为小写;但在 PHP5 中,它会将返回值保留为其原始大小写。这在尝试编写动态调用类方法并在 PHP4 和 PHP5 中都起作用的代码时会导致严重问题。此代码片段显示了一种实现与这两个版本兼容的方法

<?php
// 示例变量 - 这些变量在实际应用中将是动态的。
$className = 'SomeClass';
$methodName= 'someMethod';
$args = array('arg1', 'arg2');

// 使用 array_map() 和 strtolower() 使 get_class_methods() 返回的所有值都小写。PHP4 已经这样做了 - 无论使用哪个 PHP 版本,现在都会发生这种情况。
$classMethods = array_map(strtolower, get_class_methods($className));

// in_array() 只能处理给定数组。
if (!$classMethods) {
$classMethods = array();
}

if (
in_array(strtolower($methodName), $classMethods)) {
// 调用某些方法
return call_user_func_array(array($className, $methodName), $args);
}
?>
Oli Filth
19 年前
作为对下面 onesimus 的代码的扩展,用于查找继承的方法,在 PHP 5 中,您可以使用 Reflection API 来查找其中哪些被重写。

例如

<?php
function get_overriden_methods($class)
{
$rClass = new ReflectionClass($class);
$array = NULL;

foreach (
$rClass->getMethods() as $rMethod)
{
try
{
// 尝试在父类中查找方法
new ReflectionMethod($rClass->getParentClass()->getName(),
$rMethod->getName());
// 检查方法是否在此类中显式定义
if ($rMethod->getDeclaringClass()->getName()
==
$rClass->getName())
{
// 如果是,则表示已重写,因此添加到数组中
$array[] .= $rMethod->getName();
}
}
catch (
exception $e)
{
/* 未在父类中找到! */ }
}

return
$array;
}
?>
polarglow06 at gmail dot com
9年前
我使用此函数创建了一个非常简单的测试运行器

function get_bar($text) {
$bar = "";
for($i=1; $i<=strlen($text); $i++) {
$bar .= "=";
}
return $bar;
}
class Tester {
function __construct() {
$this->run_tests();
}
// 运行测试
function run_tests() {
print("Tester by Minhajul Anwar \n");
$class = get_class($this);
$test_methods = preg_grep('/^test/', get_class_methods($this));
foreach($test_methods as $method) {
$start_rep = "test: $class::$method";
$bar = get_bar($start_rep);
print("\n$start_rep\n$bar\n");
$this->$method();
print("\n");
}
}
}

现在您只需要编写您的测试类,其中测试方法以“test”为前缀,然后实例化该测试类的对象,所有这些测试方法都将自动运行
缺点是:您的测试方法不能接受任何参数

一个例子
require '../autoload.php';
register_autoload_paths(realpath('./'));

class Test_Test extends Tester {
function test_something() {
print("方法已执行");
}
function testAnotherThing() {
print("另一个测试方法");
}
}

$Test = new Test_Test();
aldo at cerca dot com
22 年前
如果您使用“get_class_methods”来检查方法是否在类中,请记住该函数返回类方法的小写名称

class classPippo
{
function DummyFunct()
{
// 什么也不做...
}
}

$aClassMethods = get_class_methods(classPippo);

$sMethodName = 'DummyFunct';

// 这不起作用...

if (in_array($sMethodName, $aClassMethods))
classPippo::DummyFunct();

// 这有效...

if (in_array(strtolower($sMethodName), $aClassMethods))
classPippo::DummyFunct();
php at stock-consulting dot com
17年前
请注意,此函数将回答类和实例方法(“类方法”在PHP中称为“静态”)。对于那些对OO术语有深入了解的人来说,这有点像“陷阱” :-)
kabatak
19 年前
在PHP4中,如果您需要以其原始大小写获取get_class_methods。您可以使用我创建的这个简单函数。

// 注意:此函数假设您在一个文件中只有一个类

$file = "path/to/myclass.php"

function file_get_class_methods ($file)
{
$arr = file($file);
foreach ($arr as $line)
{
if (ereg ('function ([_A-Za-z0-9]+)', $line, $regs))
$arr_methods[] = $regs[1];
}
return $arr_methods;
}
BoD
18年前
!仅关注PHP5!

如果您想从类中获取所有方法/函数,可以使用get_class_methods函数。
<?php
$arrMethodNames
= get_class_methods ( $ClassNameOrObject);
?>
但是,此函数在PHP5中的缺点是,如果您从另一个类/对象上下文中调用该方法,则您将不会收到类的受保护和私有方法。

如果您想在另一个类中接收给定类的所有方法,则应使用PHP5反射API。以下源代码允许从派生类中检索其(抽象)基类中的所有方法。

在示例中,您需要从派生类的构造函数中调用基构造函数,以便让基类知道派生类的名称。使用“__CLASS__”定义将当前类的类名传递给其基类。

<?php

// 基类 - 抽象
abstract class A {

// ReflectionMethod 对象数组
// 在实例化时设置
// 派生类不需要了解此数组
private $arrMethods;

// 必须从派生类构造函数中调用的构造函数
protected function __construct ( $strDerivedClassName ) {
$oRefl = new ReflectionClass ( $strDerivedClassName );
if (
is_object($oRefl) ) {
$this->arrMethods = $oRefl->getMethods();
}
}

// 一些抽象函数
abstract protected function D ();

// 一些私有函数
private function E() {
}

// 用于打印所有类/对象方法的方法
// 必须能够从派生类中调用
// 如果仅用于内部类使用,可以是受保护的
public function PrintAllMethods () {
foreach (
$this->arrMethods as $curReflectionMethod ) {
echo
$curReflectionMethod->getName()."<br>";
}
}
}


// 派生类
class B extends A {

// 此类的构造函数
// 必须调用基构造函数
public function __construct () {
// 调用基构造函数
parent::__construct(__CLASS__);
}


// 一些公有函数
public function A () {
}

// 一些受保护的函数
protected function B () {
}

// 一些私有函数
private function C() {
}

// 实现基类中的一些抽象方法
protected function D () {
}
}


// 创建新的B对象
$b = new B();
// 打印此对象/类的所有方法
$b->PrintAllMethods();
?>

在此示例中,输出将为

__construct
A
B
C
D
E
PrintAllMethods

如您所见,这些是类B中的所有方法,以及类A中所有方法的顺序声明。请注意,仅显示一个“__construct”方法和一个“D”方法。这是由于PHP中的重载(__construct)和实现(D)。

在此示例中,任何其他方法处理方法都应在基类中实现,因为这些方法在派生类中也将可用。只需确保您为这些其他方法使用正确的访问说明符(私有、受保护、公有)

BoD
iarias at loyalia dot es
6年前
如果您只需要类声明的方法,而不是父类的方法,则可以执行以下操作

$declared_methods = array_diff(get_class_methods($class), get_class_methods(get_parent_class($class)));
epowell at removethis dot visi dot com
20 年前
我已经弄清楚如何使用反射API解决我在下面描述的问题。

<?
/* 传递类的名称,而不是声明的处理程序 */
function get_public_methods($className) {
/* 初始化返回数组 */
$returnArray = array();

/* 遍历类中的每个方法 */
foreach (get_class_methods($className) as $method) {

/* 获取类方法的反射对象 */
$reflect = new ReflectionMethod($className, $method);

/* 对于私有,使用isPrivate()。对于受保护,使用isProtected() */
/* 请参阅反射API文档以获取更多定义 */
if($reflect->isPublic()) {
/* 该方法是我们正在寻找的方法,将其推送到返回数组中 */
array_push($returnArray,$method);
}
}

/* 将数组返回给调用方 */
return $returnArray;
}
?>
To Top