PHP中的重載與接口

遺留問題:

資源和對象區(qū)別:
我們目前學習到的資源只有兩種:1.$link=mysql_connect("localhost","root","123");得到一個"連接MySQL數(shù)據(jù)庫"的資源。2.$result=mysql_query("select...");結(jié)果集資源,資源變量可以理解為php代碼之外的已經(jīng)有的"對象"。
PHP對象是通過PHP代碼創(chuàng)建出來的。

重載

一個類中,有多個同名方法,每個方法的參數(shù)不同。這種情況叫做重載。參數(shù)不同可以是:數(shù)量個數(shù)、參數(shù)類型、排列順序不同。PHP能夠變相實現(xiàn)重載:

  1. 屬性重載:使用一個不存在的屬性,會自動調(diào)用類中預(yù)先定義好的某個方法以處理數(shù)據(jù)。
  2. 方法重載:使用一個不存在的方法,會自動調(diào)用類中預(yù)先定義好的某個方法以處理該行為。
屬性重載

屬性重載使用環(huán)境:

  1. 取值:$v1 = 對象->屬性;
  2. 賦值:對象->屬性=XX值;
  3. 判斷是否存在:isset(對象->屬性)
  4. 銷毀:unset(對象->屬性)
    如果某屬性不存在,但使用以上語法,處理過程:
  5. 取值:自動調(diào)用類中的__get();
  6. 賦值:自動調(diào)用類中的__set();
  7. 判斷是否存在:自動調(diào)用類中的__isset();
  8. 銷毀:自動調(diào)用類中的__unset();
<?php
        class A{
            public $p1 = 1;
            public $propArr = array();//用數(shù)組來存儲"不存在的屬性值"
            function __get($prop_name){
                if(isset($this->propArr[$prop_name])){
                    return $this->propArr[$prop_name];
                }
                return "不存在屬性$prop_name";
            }
            function __set($prop_name,$value){
                $this->propArr[$prop_name] = $value;
            }
        }
        $o2 = new A();
        $o2->p2=2;
        echo "<br/>o1的p2屬性為:".$o2->p2;
        $s1 = isset($o2->p1);
        $s2 = isset($o2->p2);
        $s3 = isset($o2->p4);
        echo "<br/>";
        var_dump($s1,$s2,$s3);
        unset($o2->p2);
        $s4 = isset($o2->p2);
        echo "<br/>";
        var_dump($s4);
        ?>
//o1的p2屬性為:2
//bool(true) bool(true) bool(false)
//bool(false) 
方法重載

調(diào)用一個類對象中不存在的方法:自動調(diào)用__call()
變相實現(xiàn)了其他變相對象中的重載形式

<?php
    function f1(){
        echo "<br/>f1函數(shù)被執(zhí)行(任務(wù)完成)";
    }
    function f2(x,y){
        echo "<br/>f1函數(shù)被執(zhí)行(任務(wù)完成)";
        return x+y;
    }
    class A{
        function __call($name,$array){
                $count = count($array);
                if($count==0){
                    f1();
                }else if($count==2){
                    return f2($array[0],$array[1]);     
            }
        }
    }   
    $o1 = new A();
    $o1->f1();
    $v1 = $o1->f1(1,2);
    echo "<br/>v1結(jié)果=".$v1;  
    ?>

調(diào)用一個類中沒有的靜態(tài)方法:自動調(diào)用__staticCall(),變相實現(xiàn)重載的形式和調(diào)用普通方法類似(利用魔術(shù)方法__get()、set()、__isset()、__unset()等)

接口

接口可以看做是比抽象類更高層面的"規(guī)范",不考慮接口常量的話,功能就是規(guī)范下級類的實現(xiàn)方法,但接口可以實現(xiàn)"多繼承",也就是說一個類可以實現(xiàn)多個接口,而類不能多繼承。所以有接口后,在規(guī)范下級類將變得更加靈活。接口中只有兩類最簡單的特性信息,接口常量、抽象方法

  1. 接口常量:在接口中的常量
  2. 抽象方法:需要實現(xiàn)接口的類實現(xiàn)它,無須聲明abstract,但也是抽象方法
    <?php
        //飛這個動作的接口
        interface flyAnimal{
            function fly(){

            }
        }
        //鳥類(弗雷)
        class bird{
            public $wings = "2";

        }
        //麻雀會飛也是鳥類,繼承父類、實現(xiàn)接口
        class maque extends bird implements flyAnimal{
            function fly(){
                echo "<br/>煽動{$this->wings}個翅膀";
            }
        }
        clase tuoniao extends bird{
             public function run(){
                echo "<br/>煽動{$this->wings}個翅膀,跑啊跑";
             }
        }
        $m1 = new maque();
        $m1->fly();
        $t1 = new tuoniao();
        $t1->run();
    ?>

注意:

  1. 一個類只能集成一個父類,但可以繼承多個接口
class 類名A extends 類名B implements 接口1,接口2...{...}
  1. 一個接口同樣可以繼承另一個接口(單繼承)
interface 接口1 extends 接口2{···}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容