2010-02-24 91 views
19

我想重新定義PHP中已經構建的某些函數,例如echo()或time() - 我不需要全局定義這些函數,只需在一個測試腳本中。重新定義內置的PHP函數

我認爲這可以在Perl中完成,但在PHP中 - 這可能嗎?

+1

可能重複(http://stackoverflow.com/問題/ 1837184/is-it-it-may-replace-a-function-in-php-such-as-mail-and-make-it-do-someth) – outis 2012-02-10 17:13:06

+1

... [有可能取代(monkeypatch )PHP函數?](http:// stackoverflow。com/q/530649 /),[Php redefine Class Methods OR Class](http://stackoverflow.com/q/137006/) – outis 2012-02-10 17:22:26

+0

...爲什麼有人會這樣做? – 2014-11-30 21:22:33

回答

17

runkit_function_redefine - 用一個新的實現替換函數定義

注:默認情況下,只有用戶空間功能可以刪除,重命名,或 修改。爲了覆蓋內部函數 ,您必須在php.ini中啓用 runkit.internal_override設置 。

+0

這是否對所有PHP腳本具有全局影響,還是特定於特定腳本? – Abs 2010-02-24 14:57:21

+0

取決於您正在編輯的php.ini文件的範圍。 – Dolph 2010-02-24 14:58:19

+4

編輯php.ini文件將影響在特定安裝的PHP上運行的所有PHP腳本。然而,函數redifinition本身對調用'runkit_function_redefine()'的腳本是唯一的。 – 2010-02-24 14:58:34

6

您可能也想看看

override_function() - 從Advanced PHP debugger包覆蓋內置函數

不得不重新定義本機PHP函數或語言語句時,應該會響起警鐘。在我看來,這不應該是你的產品代碼的一部分,除非你正在編寫一個調試器或類似的工具。

另一種選擇是使用http://antecedent.github.io/patchwork

碎料是一個PHP庫,使得可以在運行時重新定義用戶定義的功能和方法,鬆散地複製功能runkit_function_redefine純PHP 5.3代碼,其中,除其他外,您可以使用測試雙打替換靜態和私有方法。

後者不適合本地函數的工作,雖然

+0

@戈登 - 感謝您的建議。我只是想做這個測試的目的,而不是生產代碼 - 你是對的,它響鈴警鐘! – Abs 2010-02-24 15:19:36

1

echo不是一個函數,它是一種語言結構。我什麼都沒有。

但是函數調用像time()可以自PHP-5.3's namespace fallback policy覆蓋:

對於函數[...],PHP將回落至全局函數[...]如果一個命名空間功能[...]不存在。

例如,對於非全局名稱空間foo中的非限定函數調用time(),您可以提供foo\time()

我個人用這個來模擬例如time()用於單元測試。我發表在圖書館PHP-Mock那些嘲笑:

namespace foo; 

use phpmock\phpunit\PHPMock; 

class FooTest extends \PHPUnit_Framework_TestCase 
{ 

    use PHPMock; 

    public function testBar() 
    { 
     $time = $this->getFunctionMock(__NAMESPACE__, "time"); 
     $time->expects($this->once())->willReturn(3); 
     $this->assertEquals(3, time()); 
    } 
} 
的[?是否有可能在PHP(如郵件)更換功能,利用它做些別的事情]