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;