7.6.2 PHP類的訪問類型控制

7.6.2 PHP類的訪問類型控制

繼承已為大家所熟知的一個程序設計特性,PHP 的對象模型也使用了繼承。繼承將會影響到類與類,對象與對象之間的關系。
比如,當擴展一個類,子類就會繼承父類的所有公有和保護方法。但是子類的方法會覆蓋父類的方法。
繼承對于功能的設計和抽象是非常有用的,而且對于類似的對象增加新功能就無須重新再寫這些公用的功能。
php繼承的關鍵字:extends
格式:
[修飾符] class 子類名 extends 父類名{ ... }

通過繼承可以簡化類的定義。

class Person{
        public $name;
        public $age;
        function getInfo(){...}
}

class Student{
        public $name;
        public $age;
        public $school;
        function getInfo(){...}
        function study(){...}
}
使用繼承后的效果:
class Person{
        public $name;
        public $age;
        function getInfo(){...}
}
class Student extends Person{
        public $school;
        function study(){...}
}

PHP只支持單繼承,不允許多重繼承。一個子類只能有一個父類,不允許一個類直接繼承多個類,但一個類可以被多個類繼承。
可以有多層繼承,即一個類可以繼承某一個類的子類,如類B 繼承了類A,類C又繼承了類B,那么類C也間接繼承了類A,
  class A{
     ....
  }
  class B  extends A{
     ....
  }
  class C  extends B{
     ....
  }

子類與父類的屬性與方法

子類繼承父類的所有內容,但父類中的private部分不能直接訪問
子類中新增加的屬性和方法是對父類的擴展
子類中定義的與父類同名的屬性是對父類屬性的覆蓋,同名的方法也是對父類方法的覆蓋

訪問類型控制

訪問權限:
private protected public(默認的)


在同一類中: 可以 可以 可以
類的子類中: X 可以 可以
其他外部類中: X X 可以

定義一個父類(基類)
<?php
    //聲明一個人類,定義人所具有的一些其本的屬性和功能成員,作為父類 
    class Person {                      
        var $name;                      //聲明一個存儲人的名字的成員
        var $sex;                       //聲明一個存儲人的性別的成員
        var $age;                       //聲明一個存儲人的年齡的成員
        
        function __construct($name="", $sex="男", $age=1) {        
            $this->name = $name;                    
            $this->sex = $sex;                      
            $this->age = $age;                      
        }
        function say(){                 
            echo "我的名字:".$this->name.",性別:".$this->sex.",年齡:".$this->age."。<br>";
        }   
        
        function run() {                
            echo $this->name."正在走路。<br>";
        }
    }
<?php
    //聲明一個類作為父類使用,將它的成員都聲明為保護的
    class MyClass {                         
        protected $var1=100;               //聲明一個保護的成員屬性并給初值為100
        protected function printHello() {   //聲明一個成員方法使用protected關鍵字設置為保護的
            echo "hello<br>";                  //在方法中只有一條輸出語句作為測試使用
        }
    }
    //聲明一個MyClass類的子類試圖訪問父類中的保護成員
    class MyClass2 extends MyClass {     
        //在類中聲明一個公有方法,訪問父類中的保護成員
        function useProperty() {
            echo "輸出從父類繼承過來的成員屬性值".$this->var1."<br>";  //訪問父類中受保護的屬性
            $this->printHello();                 //訪問父類中受保護的方法
        }
    }
    $subObj = new MyClass2();          //初始化出子類對象
    $subObj->useProperty();               //調用子類對象中的方法實現對父類保護的成員訪問
    echo $subObj->var1;                    //試圖訪問類中受保護的成員,結果出錯

子類中重載父類的方法

在子類里面允許重寫(覆蓋)父類的方法
在子類中,使用parent訪問父類中的被覆蓋的屬性和方法
parent::__construce();
parent::fun();

<?php
    class Person {                      
        protected $name;            
        protected $sex;                     
        public function __construct($name=“”, $sex=“男”) {  ...屬性賦值 }
        public function say(){ ...輸出屬性信息 }   
    }
   class Student extends Person {  //聲明學生類,使用extends繼承Person類
        private $school;            
         //構造方法重寫(覆蓋)
        public function __construct($name="", $sex="男", $school="") {   
            parent::__construct($name,$sex);   //調用父類構造方法,初始化父類
            $this->school = $school;                  //新添加一條為子類中新聲明的成員屬性賦初值
        }
        public function say( ) {                        //方法重寫(覆蓋)
            parent::say();                                    //調用父類中被本方法覆蓋掉的方法
            echo "在".$this->school."學校上學<br>";    //在原有的功能基礎上多加一點功能
        }   
    }
$student = new Student("張三","男",20, "edu");  //創建學生對象,并多傳一個學校名稱參數    
$student->say();                                                 //調用學生類中覆蓋父類的說話方法

test.php

<?php
/* 繼承 --- 擴展  extends 
 *
 *   1. 子類使用extends 繼承父類 子類可以將父類中所有的內容都繼承過來
 *
 *   2. private 這是是私有的, 只能自己用, 不能別人用, 包括自己的子類也不能用
 *
 *   3. protected 這個是保護的權限, 只能是自己和自己的子類中可以使用的成員, 不能在外面使用
 *
 *   4. public 這個公開的權限 , 所有都可以, 自己, 子類, 類外部都可以使用
 */

    class Person {
        public $name;
        protected $age;
        protected $sex;

        function __construct($name, $age, $sex) {
            $this->name = $name;
            $this->age = $age;
            $this->sex = $sex;
        }

        public function say() {
            echo "我的名子是:{$this->name},我的年齡是:{$this->age},我的性別是:{$this->sex}。<br>";
        }

        function eat() {
            echo "11111111111111<br>";
        }

        function run() {
        
        }
    }


    class Student extends Person{
        var $school;

        function study() {
        
        }
    }



    class Teacher extends  Student {
        var $gz;
        

        function jiao() {
            echo "我的名子是:{$this->name},我的年齡是:{$this->age},我的性別是:{$this->sex}。<br>";
        }



    }



    $t = new Teacher("高洛峰", 30, "男");


//$t -> say();
    $t -> jiao();


    echo $t->name;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容