如果定義的類範圍太大太抽象就沒法具體到某類,那麼實例化出來到底是哪一種。比如定義動物這個類,實例化就毫無意義,我們不清楚到底是什麼動物。
既然父類實例化沒有意義,那麼可以規定在寫父類的時候規定這個父類不能被直接實例化,必須被其他類繼承之後再去實例化子類
1. 規定一個類爲‘抽象類’
abstract class 類名稱{
}
這個抽象類是用來被其他類繼承擴展的
2. 還有個概念叫抽象方法
abstruct[可見性] function 方法名([....]);
不需要定義方法的具體功能,具體功能由子類完成
注:
- 在擴展類的抽象方法時,可見性必須高於或等於抽象方法定義的可見性
- 參數要一致
- 類裏面如果有抽象方法那麼這個類本身必須要定義爲抽象類,換句話說,只有抽象類裏纔可以包含抽象方法
- 抽象類不一定要有抽象方法
<?php
/*
* 抽象類:
* 從語法上限制某個類不能被直接實例化,
* 限制一個父類不能被直接實例化
*/
header('Content-Type:text/html;charset=utf-8');
//抽象類
abstract class Humanity {
public $name;
public $sex;
public $iq=10;
const BIRTHPLACE='地球';
static public $counter=0;//靜態屬性,它是公共的資源和具體的實例沒有關係
//構造函數
public function __construct($name,$sex){
self::$counter++;
$this->name=$name;
$this->sex=$sex;
}
protected function chew($food){
echo "<p>{$food}已經被咀嚼完成!</p>";
}
//抽象方法
abstract public function eat($food);
static public function hello(){
echo '<p>您好!我是來自'.self::BIRTHPLACE.'的人類</p>';
}
}
class Student extends Humanity {
const BIRTHPLACE='火星';
public $studentId;
public function test($subject){
echo "<p>{$this->name}正在考{$subject}!</p>";
}
public function eat($food){
$this->chew($food);
echo "<p>{$this->name}正在快速的喫{$food}!</p>";
}
}
class Worker extends Humanity {
public function eat($food){
$this->chew($food);
echo "<p>{$this->name}正在的喫{$food}!</p>";
}
}
$hanMM=new Student('韓梅梅','女');