Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中仅获取类的声明方法_Php_Oop_Cakephp - Fatal编程技术网

在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;
}