3 回答

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
編輯
解決此答案未直接解決原始問題的評論。如果您是通過Google搜索到達(dá)的,請從此處開始
有一個(gè)名為override_function的函數(shù)可以實(shí)際使用。但是,由于此函數(shù)是Advanced PHP Debugger擴(kuò)展的一部分,因此很難override_function()為生產(chǎn)使用提供參數(shù)。因此,我要說“否”,不可能以原始提問者的意圖來覆蓋函數(shù)。
原始答案
在這里,您應(yīng)該利用OOP,特別是多態(tài)性。
interface Fooable
{
public function ihatefooexamples();
}
class Foo implements Fooable
{
public function ihatefooexamples()
{
return "boo-foo!";
}
}
class FooBar implements Fooable
{
public function ihatefooexamples()
{
return "really boo-foo";
}
}
$foo = new Foo();
if (10 == $_GET['foolevel']) {
$foo = new FooBar();
}
echo $foo->ihatefooexamples();

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超11個(gè)贊
命名空間php> = 5.3中的Monkey補(bǔ)丁
與修改解釋器相比,更容易避免的方法是猴子補(bǔ)丁。
猴子補(bǔ)丁是用您自己的類似“補(bǔ)丁”代替實(shí)際實(shí)現(xiàn)的藝術(shù)。
忍者技能
在像PHP Ninja這樣的猴子補(bǔ)丁之前,我們首先必須了解PHP名稱空間。
從PHP 5.3開始,我們就引入了名稱空間,乍一看,它們可能等同于類似Java包的名稱空間,但是并不完全相同。在PHP中,命名空間是一種通過創(chuàng)建焦點(diǎn)層次結(jié)構(gòu)來封裝范圍的方法,尤其是對于函數(shù)和常量。作為本主題,回退到全局功能旨在說明。
如果調(diào)用函數(shù)時(shí)未提供名稱空間,則PHP首先在當(dāng)前名稱空間中查找,然后向下移動層次結(jié)構(gòu),直到找到在該前綴名稱空間中聲明的第一個(gè)函數(shù)并執(zhí)行該功能。對于我們的示例,如果您print_r();要從namespace My\Awesome\Namespace;PHP的作用中進(jìn)行調(diào)用,則首先要查找一個(gè)名為的函數(shù),My\Awesome\Namespace\print_r();然后My\Awesome\print_r();再M(fèi)y\print_r();尋找該函數(shù),直到在全局名稱空間中找到PHP內(nèi)置函數(shù)為止\print_r();。
您將無法function print_r($object) {}在全局名稱空間中定義a ,因?yàn)檫@將導(dǎo)致名稱沖突,因?yàn)榫哂性撁Q的函數(shù)已經(jīng)存在。
期望出現(xiàn)致命錯(cuò)誤,例如:
Fatal error: Cannot redeclare print_r()
但是,沒有什么可以阻止您在命名空間范圍內(nèi)僅執(zhí)行此操作。
修補(bǔ)猴子
假設(shè)您有一個(gè)使用多個(gè)print_r();調(diào)用的腳本。
例:
<?php
print_r($some_object);
// do some stuff
print_r($another_object);
// do some other stuff
print_r($data_object);
// do more stuff
print_r($debug_object);
但是您稍后改變了主意,而是希望將輸出包裝在<pre></pre>標(biāo)簽中。你曾經(jīng)發(fā)生過嗎?
在您進(jìn)行更改之前,請更改每個(gè)呼叫,以print_r();考慮使用猴子修補(bǔ)程序。
例:
<?php
namespace MyNamespace {
function print_r($object)
{
echo "<pre>", \print_r($object, true), "</pre>";
}
print_r($some_object);
// do some stuff
print_r($another_object);
// do some other stuff
print_r($data_object);
// do more stuff
print_r($debug_object);
}
您的腳本現(xiàn)在將使用MyNamespace\print_r();而不是全局\print_r();
非常適合模擬單元測試。
歡樂!
- 3 回答
- 0 關(guān)注
- 1123 瀏覽
添加回答
舉報(bào)