2010-07-06 28 views
3

調試別人的PHP代碼,我想選擇性地覆蓋他們的一個類。該課程包括:阻止PHP require_once從未運行

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";'); 
+1

如果您希望包含newclass.php而不是classname.php,爲什麼不在classname.php的頂部添加兩行?:'require_once'newclass.php'; return;' – 2010-07-06 17:54:52

+0

因爲我爲許多類做了這個,所以我不想改變原來的類文件。而且因爲我想要更好的控制,我寧願有一個非基於文件的解決方案。 (也就是說,我可能會決定添加一個/ tmp目錄到include_path並只創建我想覆蓋的類文件。) – benizi 2010-07-06 18:58:50

+0

Benizi別擔心我知道你的意思,它是一個最重要的問題。我無法在PHP中找到任何東西,這是一種有限的語言。我仍然不知道perl是如何受歡迎的。我想人們都懶得學習。 – ekerner 2014-03-30 14:48:34

回答

2

地點:

<?php return; ?> 

classname.php文件的最頂端。

0

然後,下一次該文件被require_once'ed,它會被標記爲已加載,因此不會重新加載。

require_once這是否爲你..

此外,你可以使用的東西,像哈克

if(!class_exists("my_class")) { 
    class my_class {} // define your class here 
} 
+0

對不起,在解釋中可能不清楚:'下一次'是第一次。我想,在我自己的代碼中不創建另一個文件,以防止'require_once('somefile.php');'從以前加載somefile.php。你的class_exists得到了我爲什麼要這樣做的要點。 – benizi 2010-07-06 19:03:35

0

我想你的意思是,這是完全可能的,還有另外一個「required_once」代碼中會導致你被覆蓋的其他地方。

有兩件事情可以做:

1)追捕的第一個「必需的」,然後註釋掉它。

2)進入類文件幷包含您的類並在定義其他類之前返回。