您好,登錄后才能下訂單哦!
1.簡介
沒啥說的。
2.基本概念
類有自己的屬性和方法,內部使用可用偽變量$this(是該類的一個引用)訪問屬性或方法
類通過new被實例化(如果該類屬于某個命名空間,則需要寫全)
可以通過clone 復制一個新實例
類可以被繼承extends,接口類interface可以被implements繼承
5.5起,可以直接輸出類的完全限定名稱Classname::class 將輸出 namespace\classname
5.3引入的新實例化類的方法
class T
{
static public function getT()
{
return new static;
}
}
只知道可以這樣實例化,但不知道有什么區別。
例:PHP的單例模式
<?php
/**
* 演示一個單例模式
* 既然是單例,則他不應該被繼承,不能被多次實例化
* @author Lou
* */
final class T //不能被繼承
{
private static $ins = null; //我就是唯一的實例
public $num = 0; //num做校對用
private function __construct() //保證不能被外部訪問到
{
$this->num = mt_rand(10000, 99999); //隨機一個num
}
private function __clone()
{
return false; //不允許被克隆
}
public static function creatIns()
{
if(self::$ins == null) //如果是null
{
self::$ins = new self(); //就實例化
}
return self::$ins; //否則直接返回
}
}
?>
3.類屬性
以public protected private開頭
5.3以后,可以使用nowdocs格式聲明類屬性
可用static修飾類屬性
4.類常量
用const修飾 且接一個無$符號的格式常量名
5.自動加載類
x.spl_auto_register的用法(注冊自定義加載文件的函數來實現自動加載類文件)
<?php
function loader($classname)
{
$filename = "class/".$classname.".class.php";
if(is_file($filename))
{
require_once $filename;
}else{
exit("can not find file");
}
}
spl_autoload_register("loader");
$obj = new A;
echo $obj->a;
?>
提示:可以注冊多個自定義加載文件的函數,用于包含不同的類文件目錄
6.構造函數和析構函數
__construct 類實例創建時調用
__destruct 類實例銷毀時調用
7.訪問控制
public 外部內部繼承都可直接訪問
protected 僅內部和繼承可以直接訪問
private 僅內部可以直接訪問
8.繼承
extends 可以繼承父類的 公有, 受保護,屬性和方法
9.范圍解析操作符::
可用來訪問靜態類成員,或者類常量
擴展:self,parent 和 static 這三個特殊的關鍵字是用于在類定義的內部對其屬性或方法進行訪問的,還有一個偽變量$this
10.static(靜態)關鍵字
需要注意的是 可以有這種表達式 static::who();//who是類成員
這個表達式的用處在于可以后期靜態綁定(就是通過實例化的OBJ來判定這個who是子類的who還是父類的who,如果是子類實例化,則這個who就調用子類的who)
注意:static::只能用于靜態屬性或方法
11.抽象類
abstract 抽象類不能被實例化,只能被繼承。
抽象類的抽象方法必須被子類重寫,且重寫的控制權限必須大于等于父類的,如父類是protected,子類則必須至少為protected,也可以是public,但不能是private。
提示:子類方法可以有可選參數(抽象父類沒有的話)。
12.對象接口
interface 所有的類方法都必須是公有的空方法。子類接口父類用implements,子類必須實現父類所有的方法,子類可以實現多個接口,用,分隔。
接口可以繼承別的類
接口里可以有常量成員,但需要注意的是,子類不能復寫它。(遵循常量不能修改的特性)
13.traits
這個可以非常方便地使用其他類的東西,而不需要繼承或者實例化。它的優先級為:從基類繼承的成員被 trait 插入的成員所覆蓋。優先順序是來自當前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法。
如何使用? 直接用use。 可以use多個traits,用,分隔即可。
如果一個use的兩個traits 有相同的方法怎么辦?(即方法同名),這時需要用insteadof 和as 來區別,但應當避免這樣。
use A,B {
B::go insteadof A;//這時B的go方法將會覆蓋A的go方法
A::bed as protected abed; //a的bed方法將會以abed來訪問(這樣做即可以保留同名的方法又能解決沖突,是個好辦法) }
如:A::bed as protected abed; 或者僅僅修改它的級別
A::bed as protected; 需要注意的是,他可以破壞trait里的私有為公共,這在某些方面來說好像不腫么好。
trait不能用final修飾,并且不能被繼承,好像只能被use。
類能使用trait,trait也能使用trait
trait也可以使用抽象abstract方法,在use的類中必須重寫該方法
(需要注意的是:如果trait中的抽象類為私有,則use的類不能重寫它,即使將其as成受保護或公有也不行)
trait里同樣可以定義屬性以及static靜態成員
注意trait類屬性不能被as和重寫,所以trait的屬性和類的屬性必須不重名。
14.重載
重載的參數不能引用傳遞
所有重載方法都必須為public
重載屬性就是當訪問一個對象中不存在的屬性時,會自動按__set里的規則添加該屬性(相關函數為__set,__get,__isset,__unset)
重載方法就是當訪問一個對象中不存在的方法時,會自動調用__call里的東西,如果訪問的是一個靜態不存在的方法時,會自動調用__callstatic里的東西,這兩個魔術方法必須公共,_callstatic必須也為static方法。
15.遍歷對象
普通遍歷 foreach 即可。
可以通過Iterator接口實現自動義遍歷對象,不過有啥用啊? 除了調試沒啥用感覺。更多遍歷參見SPL擴展。
http://www.php.net/manual/zh/language.oop5.iterations.php
16.魔術方法
__construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__wakeup(),__toString(),__invoke(),__set_state()和 __clone() 等方法在 PHP 中被稱為"魔術方法"(Magic methods)。
__sleep和__wakeup的用法是:
當想序列化一個對象并保存時(serialize和unserialize),這兩個方法就會被調用。
__sleep可以返回一個數組(包含只需要序列化的屬性),用于清理不想被序列化的屬性。
unserialize一個對象時,__wakeup會首先被調用,如重新建數據庫連接等。(即一個數據庫對象被unserialize時,可以在__wakeup里添加重新調用連接數據庫的方法,就可以重新連接了。)
注意:序列化只能序列化類屬性,并不能序列化類方法。
感覺序列化對象有點像游戲里的暫停功能。。。
__toString:當你想echo obj時 顯示這個(這個方法必須返回一個string用于顯示),實際用處也不大吧。
__invoke當嘗試將實例化的對象用函數方式調用時,用這個
像這樣 $obj(5),變態才會這樣調用。
__set_state 注意這個類魔術方法必須是static的,當var_export導出類時,這個方法會被調用
http://www.php.net/manual/zh/language.oop5.magic.php
具體看這里吧,不知道有啥用。
17.final關鍵字
類的屬性不能為final,但類 和類方法可以被定義為final,即不能繼承和重寫。
18.對象復制
就是 clone,平時用不多,手冊上就GTK時會用到,但現目前PHP做界面啊。。。 我也想啊
當被clone時,對象里的__clone會被調用。
比如你可以在__clone里把類屬性做一個遞增,你就會知道這個對象被克隆了多少次。
18.對象比較
== 同一個類的實例并且屬性和屬性值相等
=== 必須是同一個類的同一個實例(即同一個對象)。
提示:PHP的擴展中可以自定義對象比較的原則。
19.類型約束
參見 C++的類方法參數類型 如 CLASSA $a 這樣子 必須加上參數類型。
http://www.php.net/manual/zh/language.oop5.typehinting.php 其他看這里
20.后期靜態綁定
看例子就明白了。
<?php
class A
{
public static function who()
{
echo __CLASS__;
}
public static function getWho()
{
//echo self::who();
echo static::who();
}
}
class B extends A
{
public static function who()
{
echo __CLASS__;
}
}
$obja = new A;
$obja->getWho();
$objb = new B;
$objb->getWho();
//用self::who()將永遠顯示A,而用static::who將顯示AB
?>
http://www.php.net/manual/zh/language.oop5.late-static-bindings.php 例4需要注意。(static::在self parent 下的情況)
21.對象和引用
在之前已經研究過了
$a = new A;
$b = $a; //$a,$b都是 new A的引用
$c = &$a; //$c是$a的引用,$a是new A的引用
22.對象序列化
serialize和unserialize,前面理解過了。需要注意的是,unserialize時,需要包含對象所對應的類文件。(即類)
需要理解的是:當序列化和反序列化與spl_autoload_register組合應用時,反序列化時會自動調用注冊進去的函數(即include class文件。)
這一章的內容挺多的,具體回憶可以參考
http://www.php.net/manual/zh/language.oop5.php
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。