function __set(){}
function __get(){}
function __construct(){}
function __destruct(){}
public公有的屬性和方法可以在類或子類的內(nèi)部和外部進(jìn)行訪問
protected屬性和方法只能在類或子類的內(nèi)部進(jìn)行訪問,但可以自己定義公共方法
private屬性和方法只能在類的內(nèi)部進(jìn)行訪問,但可以自己定義公共方法
析構(gòu)函數(shù)却邓,在程序執(zhí)行結(jié)束的時(shí)候自動(dòng)調(diào)用灾锯。
通過把變量設(shè)置為null,并且無其他的對(duì)象引用 就可以觸發(fā)析構(gòu)函數(shù)的調(diào)用谅辣。
當(dāng)對(duì)象不會(huì)再被使用的時(shí)候短纵,會(huì)觸發(fā)析構(gòu)函數(shù)杈帐。
析構(gòu)函數(shù)通常被用于清理程序使用的資源。比如程序使用了打印機(jī)悟泵,那么可以在析構(gòu)函數(shù)里面釋放打印機(jī)資源杈笔。
構(gòu)造函數(shù)執(zhí)行順序是從上而下。
析構(gòu)函數(shù)執(zhí)行順序是從下而上糕非。
$james = new NbaPlayer('James');
$james1=$james;
$james2=&$james;
$james=null;//等同于$james2=null
$james1=null;
//$james $james1同時(shí)為null 觸發(fā)析構(gòu)函數(shù)蒙具,缺一個(gè)都不觸發(fā)
1.parent關(guān)鍵字可以用于調(diào)用父類中被子類重寫了的方法
2.self關(guān)鍵字可以用于訪問類自身的成員方法球榆,也可以用于訪問自身
的靜態(tài)成員和類常量,不能用于訪問類自身的屬性禁筏,使用常量的時(shí)候不需要
在常量名稱前面加$符號(hào)
3.static關(guān)鍵字用于訪問類自身定義的靜態(tài)成員持钉,訪問靜態(tài)屬性時(shí)需要在
屬性前面添加$符號(hào)
//繼承:當(dāng)子類被實(shí)例化時(shí),php會(huì)先在子類中查找構(gòu)造方法篱昔,如果子類有自己的構(gòu)造方法
php會(huì)先調(diào)用子類中的方法每强,當(dāng)子類中沒有時(shí),php則去調(diào)用父類中的構(gòu)造方法州刽。析構(gòu)方法同樣也是
繼承關(guān)鍵字 extends
//多態(tài):覆蓋和重載
覆蓋就是在子類中重寫父類的方法空执,而在子類的對(duì)象中雖然調(diào)用的是父類中相同的方法
,但返回的結(jié)果是不同的穗椅。相同的一行代碼辨绊,對(duì)于傳入不同的接口的實(shí)現(xiàn)的對(duì)象時(shí),表現(xiàn)是
不同的匹表。
重載门坷,一個(gè)標(biāo)識(shí)符被用作多個(gè)函數(shù)名,且能夠通過函數(shù)的參數(shù)個(gè)數(shù)或參數(shù)類型來區(qū)分
get_class();返回對(duì)象所屬類的名字 如果不是對(duì)象袍镀,則返回false
關(guān)鍵字::變量名/常量名/方法名
parent::可以調(diào)用父類中的成員變量默蚌,成員方法和常量
self::可以調(diào)用當(dāng)前類中的靜態(tài)成員和常量
類名::可以調(diào)用本類中的變量,方法和常量
final class name(){} 該類不可以再被繼承 也不能有子類
final function name(){} 該方法不可以進(jìn)行重寫或覆蓋流椒,但是能被子類調(diào)用
抽象類是一種不能被實(shí)例化的類敏簿,只能作為其他類的父類來使用。
abstract class name{
abstract function name();
}
*屬性不能被定義為 final宣虾,只有類和方法才能被定義為 final惯裕。
抽象方法沒有方法體,其功能的實(shí)現(xiàn)在子類中.
抽象類可以是個(gè)空類绣硝,也就是不一定需要有抽象方法蜻势。但抽象方法只能存在抽象類中。
抽象類中可以包含普通的方法鹉胖,有方法的具體實(shí)現(xiàn)
繼承抽象類的關(guān)鍵字是extends,需要實(shí)現(xiàn)抽象類中定義的抽象方法
php只支持單繼承握玛,要實(shí)現(xiàn)多繼承,要使用接口甫菠。
接口類通過interface關(guān)鍵字來聲明挠铲,并且類中只能包含未實(shí)現(xiàn)的方法和一些成員變量,繼承別的接口時(shí)用關(guān)鍵字extends。
不能實(shí)例化接口
interface interfaceName{
public $a;
function method1();//未實(shí)現(xiàn)的方法 沒有方法體
function method2();
}
子類通過implements關(guān)鍵字來實(shí)現(xiàn)接口寂诱,如果要實(shí)現(xiàn)多個(gè)接口拂苹,每個(gè)接口用','分割,
而且接口類中所有未實(shí)現(xiàn)的方法需要在子類中全部實(shí)現(xiàn)痰洒。
class subclass implements interfaceName1,interfaceName2{
function method1(){}
function method2(){}
}
if(objectname instanceof interfacename){}
可以用instanceof關(guān)鍵字來判斷某個(gè)對(duì)象是否實(shí)現(xiàn)了某個(gè)接口
if(objectname instanceof classname){} 也可以檢測(cè)某個(gè)對(duì)象是否屬于哪個(gè)類
如果構(gòu)造函數(shù)定義成了私有方法瓢棒,則不允許直接實(shí)例化對(duì)象了浴韭,這時(shí)候一般通過靜態(tài)方法進(jìn)行實(shí)例化,
在設(shè)計(jì)模式中會(huì)經(jīng)常使用這樣的方法來控制對(duì)象的創(chuàng)建脯宿,比如單例模式只允許有一個(gè)全局唯一的對(duì)象念颈。
class Car {
private function __construct() { //私有構(gòu)造方法
echo 'object create';
}
private static $_object = null;
public static function getInstance() {
if (empty(self::$_object)) {
self::$_object = new Car(); //內(nèi)部方法可以調(diào)用私有方法,因此這里可以創(chuàng)建對(duì)象
}
return self::$_object;
}
}
//$car = new Car(); //這里不允許直接實(shí)例化對(duì)象
$car = Car::getInstance(); //通過靜態(tài)方法來獲得一個(gè)實(shí)例