第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

是否可以覆蓋PHP中的函數(shù)

是否可以覆蓋PHP中的函數(shù)

PHP
慕哥6287543 2019-10-21 10:30:14
你能聲明這樣的函數(shù)嗎?function ihatefooexamples(){  return "boo-foo!";};然后像這樣重新聲明它...if ($_GET['foolevel'] == 10){  function ihatefooexamples(){    return "really boo-foo";  };};這樣可以覆蓋函數(shù)嗎?可以嗎
查看完整描述

3 回答

?
慕哥9229398

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();


查看完整回答
反對 回復(fù) 2019-10-21
?
呼喚遠(yuǎn)方

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();


非常適合模擬單元測試。


歡樂!


查看完整回答
反對 回復(fù) 2019-10-21
  • 3 回答
  • 0 關(guān)注
  • 1123 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號