在PHP中仅获取类的声明方法
您好,我只需要获取类中声明的方法,而不是继承的方法。我需要这个。我正在获取所有控制器,加载它们并从这些控制器中检索方法。但是,不仅声明的方法会出现,继承的方法也会出现在PHP中仅获取类的声明方法,php,oop,cakephp,Php,Oop,Cakephp,您好,我只需要获取类中声明的方法,而不是继承的方法。我需要这个。我正在获取所有控制器,加载它们并从这些控制器中检索方法。但是,不仅声明的方法会出现,继承的方法也会出现 是否存在只获取已声明方法的方法 从架构的角度来看,我认为如果可能的话应该避免反射,但是如果你认为自己知道自己在做什么,请看一看 <?php class A { public function x() { } public function y() { } } class B extends A {
是否存在只获取已声明方法的方法 从架构的角度来看,我认为如果可能的话应该避免反射,但是如果你认为自己知道自己在做什么,请看一看
<?php
class A {
public function x() { }
public function y() { }
}
class B extends A {
public function a() { }
public function b() { }
public function x() { } // <-- defined here
}
$r = new ReflectionClass('B');
print_r($r->getMethods());
?>
您可以使用
遇到一条评论:“ReflectionClass::getMethods()按类(首先是继承树中最低的)对方法进行排序,然后按类定义中定义的顺序对方法进行排序”
我证实了这一点,这似乎是真的。基于这一事实,我们可以对ircmaxell的解决方案进行一些优化,以避免迭代其他继承的方法。还添加了一些清理以避免构造函数\析构函数:
public function getMethods($className)
{
$methodNames = [];
$reflectionClass = new ReflectionClass(className);
$publicMethods = $reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC);
$lowerClassName = strtolower($className);
foreach ($publicMethods as $method) {
if (strtolower($method->class) == $lowerClassName) {
// You can skip this check if you need constructor\destructor
if (!($method->isConstructor() ||
$method->isDestructor())) {
$methodNames[] = $method->getName();
}
} else {
// exit loop if class mismatch
break;
}
}
return $methodNames;
}
我只知道复杂的反射法。你需要这个干什么?你能告诉我你为什么要这么做吗?它是用于文档还是用于应用程序中?我需要将控制器中的所有公共方法添加到我的权限表中。我使用的是cakePHP,他们的ACL组件与我现有的模型不兼容。@Joe-我需要将所有方法添加到数据库中的一个表中。我使用的是cakePHP,他们的ACL组件不适合我现有的模型。你可以编辑你知道的注释:)“从架构的角度来看,我认为应该尽可能避免反射”为什么?嗯,我想这是个人偏好。对我来说,反射类似于修补内存中的可执行文件,并且可能是意外的(或暴露此类行为),除非有良好的文档记录,并且可能使代码更加复杂或引入副作用。但是,它可能对编写框架和元编程/扩展语言功能很有用。为什么要使用
ReflectionMethod::IS_PUBLIC
?不过应该提到这一点,因为它使问题的答案不完整。
function getDeclaredMethods($className) {
$reflector = new ReflectionClass($className);
$methodNames = array();
$lowerClassName = strtolower($className);
foreach ($reflector->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
if (strtolower($method->class) == $lowerClassName) {
$methodNames[] = $method->name;
}
}
return $methodNames;
}
public function getMethods($className)
{
$methodNames = [];
$reflectionClass = new ReflectionClass(className);
$publicMethods = $reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC);
$lowerClassName = strtolower($className);
foreach ($publicMethods as $method) {
if (strtolower($method->class) == $lowerClassName) {
// You can skip this check if you need constructor\destructor
if (!($method->isConstructor() ||
$method->isDestructor())) {
$methodNames[] = $method->getName();
}
} else {
// exit loop if class mismatch
break;
}
}
return $methodNames;
}