波多野结衣 蜜桃视频,国产在线精品露脸ponn,a v麻豆成人,AV在线免费小电影

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

很多面試官在面試的時(shí)候都會(huì)問一些面向?qū)ο蟮膯栴},面向?qū)ο蟮娜筇匦灾校鄳B(tài)最主要的實(shí)現(xiàn)方式就是方法的重載和重寫。但是在php中,只有重寫,并沒有完全的重載能力的實(shí)現(xiàn)。

重寫,子類重寫父類方法。

// 重寫
class A{    public function test($a)
    {        echo 'This is A:' . $a, PHP_EOL;
    }}class childA extends A{    public function test($a)
    {        echo 'This is A child:' . $a, PHP_EOL;
    }}$ca = new childA();
$ca->test(1);

這個(gè)在PHP中是沒有任何問題的,子類可以重寫父類的方法。當(dāng)實(shí)例化子類的時(shí)候,調(diào)用的就是子類實(shí)現(xiàn)的重寫的方法。

重載,相同方法名但參數(shù)數(shù)量或者類型不同。

class A{
    function foo($a){
        echo $a;
    }    // Fatal error: Cannot redeclare A::foo()
    function foo($a, $b){
        echo $a+$b;
    }
}

抱歉,這樣寫的結(jié)果將會(huì)是直接的報(bào)錯(cuò)。PHP并不支持這樣的重載能力。而在PHP的官方手冊(cè)上,重載的定義是使用__set()、__get()、__call()、__callStatic()等魔術(shù)方法來對(duì)無法訪問的變量或方法進(jìn)行重載。這與我們所學(xué)習(xí)的面向?qū)ο笾械闹剌d完全不同,在手冊(cè)中的note里也有很多人對(duì)此提出了疑問。當(dāng)然,我們今天并不會(huì)再去講這些魔術(shù)方法的使用。關(guān)于它們的使用可以參考我們之前寫過的文章:PHP中的那些魔術(shù)方法(一)、PHP的那些魔術(shù)方法(二)

那么,在PHP中可以實(shí)現(xiàn)重載嗎?當(dāng)然可以,只不過會(huì)麻煩一些:

// 重載
class B{    public function foo(...$args)
    {        if (count($args) == 2) {
            $this->fooAdd(...$args);
        } else if (count($args) == 1) {
            echo $args[0], PHP_EOL;
        } else {
            echo 'other';
        }    }    private function fooAdd($a, $b)
    {        echo $a + $b, PHP_EOL;
    }}$b = new B();
$b->foo(1);
$b->foo(1, 2);

使用一個(gè)方法來調(diào)用其他方法,根據(jù)參數(shù)數(shù)量來進(jìn)行判斷,就可以實(shí)現(xiàn)參數(shù)數(shù)量不同的方法重載。

// 使用__call()進(jìn)行重載
class C{    public function __call($name, $args)
    {        if ($name == 'foo') {
            $funcIndex = count($args);
            if (method_exists($this, 'foo' . $funcIndex)) {
                return $this->{'foo' . $funcIndex}(...$args);
            }        }    }    private function foo1($a)
    {        echo $a, PHP_EOL;
    }    private function foo2($a, $b)
    {        echo $a + $b, PHP_EOL;
    }    private function foo3($a, $b, $c)
    {        echo $a + $b + $c, PHP_EOL;
    }}$c = new C();
$c->foo(1);
$c->foo(1, 2);
$c->foo(1, 2, 3);

使用__call()魔術(shù)方法或許會(huì)更簡(jiǎn)單,但也會(huì)讓一些新手在接手項(xiàng)目的時(shí)候蒙圈。畢竟魔術(shù)方法對(duì)IDE是不友好的,這樣的開發(fā)讓__call()成為了一個(gè)模板方法,由它來定義操作的算法骨架。我們也可以根據(jù)參數(shù)類型來模擬重載能力。

// 參數(shù)類型不同的重載
class D {    function __call($name, $args){
        if($name == 'foo'){
            if(is_string($args[0])){
                $this->fooString($args[0]);
            }else {
                $this->fooInt($args[0]);
            }        }    }    private function fooInt(int $a){
        echo $a . ' is Int', PHP_EOL;
    }    private function fooString(string $a){
        echo $a . ' is String', PHP_EOL;
    }}$d = new D();
$d->foo(1);
$d->foo('1');

不管怎么說,用上述方法實(shí)現(xiàn)的方法重載都非常麻煩,因?yàn)闀?huì)讓某一個(gè)方法或者魔術(shù)方法非常重,它需要成為一個(gè)控制器來根據(jù)參數(shù)對(duì)內(nèi)部的方法進(jìn)行調(diào)度。更多的情況下,我們應(yīng)該還是使用不同的方法名然后抽象公共的部分提取成獨(dú)立的私有內(nèi)部方法來實(shí)現(xiàn)不同方法名的“重載”。畢竟不同的語言還是要掌握它們不同的個(gè)性,并且根據(jù)這些個(gè)性靈活地運(yùn)用在我們的項(xiàng)目中。

測(cè)試代碼: https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/PHP%E4%B8%AD%E7%9A%84%E2%80%9C%E9%87%8D%E8%BD%BD%E2%80%9D%E6%98%AF%E4%B8%AA%E5%95%A5%EF%BC%9F.php

參考文檔: https://www.php.net/manual/zh/language.oop5.overloading.php#77843

分享到:
標(biāo)簽:重載 PHP
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定