訪問修飾符
修飾符 | 描述 |
---|---|
public(公有的) | 可以在類的內部和外部訪問 |
private(私有的) | 只能在類的內部訪問 |
protected(受保護的) | 在類的內部和子類中訪問(在整個繼承鏈上訪問) |
方法修飾符
static(靜態的)
class Person {
public static $national = '中國';
public static function show()
{
echo "這是一個靜態方法";
}
}
//測試
echo Person::$national,'<br>';
Person::show();
1、static修飾屬性成爲靜態屬性,static修飾方法成爲靜態方法
2、靜態屬性在加載類的時候分配空間,所以不需要實例化就可以直接訪問
3、訪問靜態成員語法:類名::靜態成員
4、靜態成員在內存只有就一份,爲所有的實例公共。
5、靜態成員不能訪問普通成員,只能訪問靜態成員。因爲靜態成員被創建的時候可能還沒有任何實例被實例化
6、靜態變量在類加載的時候產生,頁面執行完畢銷燬
self
self表示當前類的名字
class User {
public static $count = 0;
public function __construct(){
self::$count++;//表示當前類的名字
}
public function (){
self::$count--;
}
}
$user1 = new User();
$user2 = new User();
靜態成員是可以被繼承的
header("Content-type: text/html; charset=utf-8");
class Person {
public static $nation = '中國';
public static show(){
echo "這是一個父類的靜態方法";
}
}
class Student extends Person{
}
echo Student::$national,'<br>';
Student::show();
確定當前對象(靜態延時綁定)
【static::靜態成員】稱爲延時綁定,static表示的是一個類,具體表示什麼類在運行時確定,表示的是當前對象所在的類
class Person {
public static $type='人類';
public function showPerson() {
//var_dump($this); //object(Student)#1 (0) { }
//echo self::$type; //人類
echo static::$type; //學生 【靜態延時綁定】
}
}
class Student extends Person {
public static $type='學生';
public function showStu() {
//var_dump($this); //object(Student)#1 (0) { }
//echo self::$type; //學生
echo static::$type; //學生 【靜態延時綁定】
}
}
//測試
$stu=new Student;
$stu->showPerson();
echo '<hr>';
$stu->showStu();
final(最終的)
final修飾的類不能被繼承
final修飾的方法不能重寫
abstruct(抽象的)
1、abstruct修飾的方法叫抽象方法,abstruct修飾的類叫抽象類
2、如果只有方法的聲明而沒有方法的實現成爲抽象方法
3、如果一個類中有一個方法是抽象方法,那麼這個類就是抽象類
4、抽象類不允許實例化,必須在子類中重新實現才能實例化
//抽象類
abstract class Goods {
protected $name;
public function setName($name) {
$this->name=$name;
}
abstract public function getName(); //抽象方法
}
//實現抽象類
class Book extends Goods {
public function getName() {
echo "《{$this->name}》";
}
}
//測試
$book=new Book();
$book->setName('PHP入門到精通');
$book->getName();
抽象類的作用:
1、定義統一的方法名稱
2、防止實例化
接口(interface)
1、如果一個類中所有的方法全都是抽象方法,那麼這個類就可以聲明成接口
2、接口是一個特殊的抽象類
3、接口中的抽象方法只能是public的,默認也是public權限
4、通過implements類實現接口
5、不能通過final和abstract修飾接口中的抽象方法
interface Goods {
function add();
function update();
}
class GoodsA implements Goods {
public function add() {
echo '實現add<br>';
}
public function update() {
echo '實現update<br>';
}
}
//測試
$goods=new GoodsA();
$goods->add();
$goods->update();
接口允許多重實現
類不允許多重繼承,接口允許多重實現
繼承類同時實現接口