1. 主页 > 好文章

PHP快速查看类的方法:get_class_methods与反射类实战

新手如何快速涨粉这事儿没人能打包票,但新手想快速掌握PHP查看类的方法?嘿嘿,这个我还真有招!你是不是遇到过这种情况—领导甩给你一坨别人写的代码,你盯着某个类抓破头皮都不知道它有哪些可用方法?今天教的工具,保准你试了能把别人代码「扒光看透」


一、咱先别急着敲代码!

??举个现实例子??:小林拿到一个第三方支付的SDK,发现里面有个叫PaymentProcessor的类。但他连这个类能调send()还是submit()都搞不清楚,更别说还要对接了...
这时候根本不需要硬啃文档!PHP自己就带「透视眼」工具——我今天说的 ??get_class_methods函数?? 和 ??反射类??,你先记住这俩名字。


二、最傻瓜的操作:get_class_methods

这函数名字长得像俄罗斯方块,但用法简单到掉渣。比如有这人类似的代码:

php复制
class Dog {
    public function bark() {}
    private function eat() {}
}
$myDog = new Dog();
// 重点来了!
print_r(get_class_methods($myDog)); 

输出会是啥?对,??只显示bark()??!因为它默认不显示私有方法(private)。但老板要你逆向分析别人代码的话,可能就得...

??它的三大缺陷??你得记着:

  1. ??看不见private/protected方法??,除非你在类内部用
  2. ??不会显示父类继承的方法??,比如Dog继承自Animal类的方法
  3. ??返回纯数组没细节??,比如不知道参数有几个

三、想玩高级侦查?反射类安排上

这时候该ReflectionClass出场了——这货能把你家类扒得连裤衩都不剩!看操作:

php复制
$ref = new ReflectionClass('Dog'); 
// 强制看所有方法(包括私有的)
$methods = $ref->getMethods(); 

foreach ($methods as $method) {
    echo "方法名:".$method->getName()."
"
; echo "参数数量:".$method->getNumberOfParameters()."
"
; echo "是私有的吗?".$method->isPrivate()."
"
; }

跑这段代码的话,连eat()的私有性都能给你揪出来!是不是瞬间觉得手上的烂代码有救了?


四、灵魂拷问:这俩到底怎么选?

呃...我知道有人要纠结了,这俩看着都能用,非得分场合吗?
这么说吧——

场景get_class_methods适用度反射类适用度
只想快速看公开方法列表? 推荐?? 没必要
要分析方法的参数和权限? 搞不定? 必须上
动态调用未知类? 做不到? 配合invoke

上周有个小伙子问我:为啥他用get_class_methods死活读不到父类的方法?你看,这类问题用反射类的话直接调用$ref->getParentClass()就顺带扫到遗传的方法了。


小编观点

项目赶进度的时候别强迫症,能用get_class_methods快读就别折腾反射。但要真想进阶成代码侦探,反射类的学习成本绝对值回票价——毕竟它能看的不只是方法,连属性、命名空间这些都能扒个底朝天。千万别再人肉读源码了,工具用熟了你就是组里最靓的仔!

本文由嘻道妙招独家原创,未经允许,严禁转载