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 个注释

59
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 (类内):';
var_dump(get_class_methods('C'));
}
}
$c = new C;
echo
'$c:';
var_dump(get_class_methods($c));
echo
'C (类外):';
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)
19
gk at proliberty dot com
21 年前
需要注意的是,get_class_methods($class) 不仅返回 $class 定义的方法,还返回继承的方法。

似乎没有 PHP 函数可以确定哪些方法是继承的,哪些方法是类显式定义的。
11
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);
}
9
matt at zevi dot net
22 年前
仅限 Win32

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

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

Matt
7
jazepstein at greenash dot net dot au
18 年前
在 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);
}
?>
7
polarglow06 at gmail dot com
8 年前
我使用此函数创建了一个非常简单的测试运行器

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();
7
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;
}
?>
3
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();
4
php at stock-consulting dot com
17 年前
请注意,此函数将回答类方法和实例方法("类方法"在 PHP 中称为"静态")。对于那些深入了解面向对象术语的人来说,这有点像"陷阱" :-)
3
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;
}
-2
BoD
18 年前
!只针对 PHP5!

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

如果你想在另一个类中接收给定类的所有方法,你应该使用 PHP5 Reflection 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)。

在这个例子中,任何进一步的方法处理方法都应该在基类中实现,因为这些方法也将在派生类中可用。只需确保为这些额外方法使用正确的访问说明符(private、protected、public)。

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

$declared_methods = array_diff(get_class_methods($class), get_class_methods(get_parent_class($class)));
-5
epowell at removethis dot visi dot com
19 年前
我已经找到了一种方法来解决我下面描述的问题,使用 Reflection API。

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

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

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

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

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