3

调试别人的 PHP 代码,我想有选择地覆盖他们的一个类。该课程通过以下方式包含:

require_once('classname.php');

但是,它出现在应用程序的各个地方。我宁愿“模拟” require_once,这样它就永远不会运行。即class classname按我的意愿定义。然后,下次文件被require_once'ed 时,它会被标记为已经加载,因此不会重新加载。

我可以创建自己的 classname.php 文件,但我宁愿将我正在做的测试包含在一个文件中,因为我可能为许多类执行此操作,并且我希望更轻松地控制压倒一切。

在 Perl 中,我想做的是:

$INC{'classname.pm'} = 1;

有没有办法访问 PHP 的 Perl 等价物%INC

更新:一直对 PHP 不允许你做的事情感到惊讶......

我的解决方法是使用runkitrunkit_method_redefine. 我加载了我试图阻止加载的类,然后重新定义了我试图“模拟”的所有方法,例如:

require_once('classname.php');
runkit_method_redefine('classname','method','$params','return "testdata";');
4

3 回答 3

2

地方:

<?php return; ?>

classname.php文件的最顶部。

于 2010-07-06T18:01:28.340 回答
0

我在想你的意思是完全有可能在代码的其他地方有另一个“required_once”会导致你的代码被覆盖。

你可以做两件事:

1)寻找第一个“必需”,然后将其注释掉。

2)进入类文件并包含您的类并在定义其他类之前返回。

于 2010-07-06T18:28:31.520 回答
0

然后,下次文件被 require_once'ed 时,它会被标记为已经加载,因此不会重新加载。

require_once 为您执行此操作..

此外,您可以使用一些 hacky 之类的东西

if(!class_exists("my_class")) {
  class my_class {}  // define your class here
}
于 2010-07-06T18:12:31.303 回答