在不使用字符串的情况下引用PHP方法

在不使用字符串的情况下引用PHP方法,php,reflection,automated-refactoring,Php,Reflection,Automated Refactoring,假设我有以下PHP代码: class Foo { function getBar() { return 1; } } function check( Foo $foo ) { if ( $foo->getBar() == 1 ) { // here could be more code ... return 'Oh no, there was an error in class' . ge

假设我有以下PHP代码:

class Foo {
    function getBar() {
         return 1;
    }
}

function check( Foo $foo ) {
    if ( $foo->getBar() == 1 ) {
       // here could be more code ...
       return 'Oh no, there was an error in class' . 
              get_class( $foo ) . ', method ' .
              'getBar';
    }
}

check
中的最后一个字符串让我很烦恼,因为如果重构工具重命名了
Foo::bar
,错误消息将是错误的。有没有办法不用字符串就可以解决这个问题?

您可以使用_方法_)来获取当前方法的名称


但是,要获得对其他方法的引用,这将允许您进行某种自动重构-不,在php中是不可能的。

您可以使用u方法u获取当前方法的名称


但是要获得对其他方法的引用,允许您进行某种自动重构-不,这在php中是不可能的。

可以使用方法_exists()


可以使用方法_exists()完成


这在PHP本身是不可能的,但您可以实现这样一个特性。一个可能的实现如下所示:文件路径、类名、方法名和某种形式的位置描述,以及什么应该匹配什么。无论何时触发,您的新功能都将检查给定的文件,检查某些值是否已更改,修复需要修复的内容,并记录有关任务的报告。实现这样的功能并不简单,但需要注意的是,有一个解决方案。

这在PHP本身是不可能的,但您可以实现这样的功能。一个可能的实现如下所示:文件路径、类名、方法名和某种形式的位置描述,以及什么应该匹配什么。无论何时触发,您的新功能都将检查给定的文件,检查某些值是否已更改,修复需要修复的内容,并记录有关任务的报告。实现这样的东西并不简单,但需要注意的是,有一个解决方案。

不太清楚您想要实现什么。如果调用
getBar
,则可以打印
getBar
。如果你重构这个类,你必须重构你的check-function。让问题(方法名在字符串中,在重命名时不会被自动重构工具捕捉到)在文本中更加清晰。据我所知,这是不可能的。同样的问题也存在于phpunit中。不太清楚你想要实现什么。如果调用
getBar
,则可以打印
getBar
。如果你重构这个类,你必须重构你的check-function。让问题(方法名在字符串中,在重命名时不会被自动重构工具捕捉到)在文本中更加清晰。据我所知,这是不可能的。phpunit中也存在同样的问题。这使得错误更有可能在单元测试中被捕获(因为当
getBar
不再存在时,它们将失败),但并不能解决“有没有办法不使用字符串解决此问题”的问题。这使得错误更有可能在单元测试中被捕获(因为当
getBar
不再存在时,它们将失败),但不能解决“有没有办法不使用字符串解决这个问题”的问题。
class Foo {
    function getBar() {
         return 1;
    }
}

function check( Foo $foo , $method = 'getBar') {
    if (!method_exists($foo, $method) ) {
       // here could be more code ...
       return 'Oh no, there was an error in class' . 
              get_class( $foo ) . ', method ' .
              $method;
    }
}