1.簡介
我們一直強調(diào)網(wǎng)站設(shè)計、成都網(wǎng)站制作對于企業(yè)的重要性,如果您也覺得重要,那么就需要我們慎重對待,選擇一個安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過程中的有力推手。專業(yè)網(wǎng)站制作公司不一定是大公司,成都創(chuàng)新互聯(lián)公司作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。
沒啥說的。
2.基本概念
類有自己的屬性和方法,內(nèi)部使用可用偽變量$this(是該類的一個引用)訪問屬性或方法
類通過new被實例化(如果該類屬于某個命名空間,則需要寫全)
可以通過clone 復制一個新實例
類可以被繼承extends,接口類interface可以被implements繼承
5.5起,可以直接輸出類的完全限定名稱Classname::class 將輸出 namespace\classname
5.3引入的新實例化類的方法
class T
{
static public function getT()
{
return new static;
}
}
只知道可以這樣實例化,但不知道有什么區(qū)別。
例:PHP的單例模式
<?php
/**
* 演示一個單例模式
* 既然是單例,則他不應(yīng)該被繼承,不能被多次實例化
* @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的用法(注冊自定義加載文件的函數(shù)來實現(xiàn)自動加載類文件)
<?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;
?>
提示:可以注冊多個自定義加載文件的函數(shù),用于包含不同的類文件目錄
6.構(gòu)造函數(shù)和析構(gòu)函數(shù)
__construct 類實例創(chuàng)建時調(diào)用
__destruct 類實例銷毀時調(diào)用
7.訪問控制
public 外部內(nèi)部繼承都可直接訪問
protected 僅內(nèi)部和繼承可以直接訪問
private 僅內(nèi)部可以直接訪問
8.繼承
extends 可以繼承父類的 公有, 受保護,屬性和方法
9.范圍解析操作符::
可用來訪問靜態(tài)類成員,或者類常量
擴展:self,parent 和 static 這三個特殊的關(guān)鍵字是用于在類定義的內(nèi)部對其屬性或方法進行訪問的,還有一個偽變量$this
10.static(靜態(tài))關(guān)鍵字
需要注意的是 可以有這種表達式 static::who();//who是類成員
這個表達式的用處在于可以后期靜態(tài)綁定(就是通過實例化的OBJ來判定這個who是子類的who還是父類的who,如果是子類實例化,則這個who就調(diào)用子類的who)
注意:static::只能用于靜態(tài)屬性或方法
11.抽象類
abstract 抽象類不能被實例化,只能被繼承。
抽象類的抽象方法必須被子類重寫,且重寫的控制權(quán)限必須大于等于父類的,如父類是protected,子類則必須至少為protected,也可以是public,但不能是private。
提示:子類方法可以有可選參數(shù)(抽象父類沒有的話)。
12.對象接口
interface 所有的類方法都必須是公有的空方法。子類接口父類用implements,子類必須實現(xiàn)父類所有的方法,子類可以實現(xiàn)多個接口,用,分隔。
接口可以繼承別的類
接口里可以有常量成員,但需要注意的是,子類不能復寫它。(遵循常量不能修改的特性)
13.traits
這個可以非常方便地使用其他類的東西,而不需要繼承或者實例化。它的優(yōu)先級為:從基類繼承的成員被 trait 插入的成員所覆蓋。優(yōu)先順序是來自當前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法。
如何使用? 直接用use。 可以use多個traits,用,分隔即可。
如果一個use的兩個traits 有相同的方法怎么辦?(即方法同名),這時需要用insteadof 和as 來區(qū)別,但應(yīng)當避免這樣。
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靜態(tài)成員
注意trait類屬性不能被as和重寫,所以trait的屬性和類的屬性必須不重名。
14.重載
重載的參數(shù)不能引用傳遞
所有重載方法都必須為public
重載屬性就是當訪問一個對象中不存在的屬性時,會自動按__set里的規(guī)則添加該屬性(相關(guān)函數(shù)為__set,__get,__isset,__unset)
重載方法就是當訪問一個對象中不存在的方法時,會自動調(diào)用__call里的東西,如果訪問的是一個靜態(tài)不存在的方法時,會自動調(diào)用__callstatic里的東西,這兩個魔術(shù)方法必須公共,_callstatic必須也為static方法。
15.遍歷對象
普通遍歷 foreach 即可。
可以通過Iterator接口實現(xiàn)自動義遍歷對象,不過有啥用?。?除了調(diào)試沒啥用感覺。更多遍歷參見SPL擴展。
http://www.php.net/manual/zh/language.oop5.iterations.php
16.魔術(shù)方法
__construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__wakeup(),__toString(),__invoke(),__set_state()和 __clone() 等方法在 PHP 中被稱為"魔術(shù)方法"(Magic methods)。
__sleep和__wakeup的用法是:
當想序列化一個對象并保存時(serialize和unserialize),這兩個方法就會被調(diào)用。
__sleep可以返回一個數(shù)組(包含只需要序列化的屬性),用于清理不想被序列化的屬性。
unserialize一個對象時,__wakeup會首先被調(diào)用,如重新建數(shù)據(jù)庫連接等。(即一個數(shù)據(jù)庫對象被unserialize時,可以在__wakeup里添加重新調(diào)用連接數(shù)據(jù)庫的方法,就可以重新連接了。)
注意:序列化只能序列化類屬性,并不能序列化類方法。
感覺序列化對象有點像游戲里的暫停功能。。。
__toString:當你想echo obj時 顯示這個(這個方法必須返回一個string用于顯示),實際用處也不大吧。
__invoke當嘗試將實例化的對象用函數(shù)方式調(diào)用時,用這個
像這樣 $obj(5),變態(tài)才會這樣調(diào)用。
__set_state 注意這個類魔術(shù)方法必須是static的,當var_export導出類時,這個方法會被調(diào)用
http://www.php.net/manual/zh/language.oop5.magic.php
具體看這里吧,不知道有啥用。
17.final關(guān)鍵字
類的屬性不能為final,但類 和類方法可以被定義為final,即不能繼承和重寫。
18.對象復制
就是 clone,平時用不多,手冊上就GTK時會用到,但現(xiàn)目前PHP做界面啊。。。 我也想啊
當被clone時,對象里的__clone會被調(diào)用。
比如你可以在__clone里把類屬性做一個遞增,你就會知道這個對象被克隆了多少次。
18.對象比較
== 同一個類的實例并且屬性和屬性值相等
=== 必須是同一個類的同一個實例(即同一個對象)。
提示:PHP的擴展中可以自定義對象比較的原則。
19.類型約束
參見 C++的類方法參數(shù)類型 如 CLASSA $a 這樣子 必須加上參數(shù)類型。
http://www.php.net/manual/zh/language.oop5.typehinting.php 其他看這里
20.后期靜態(tài)綁定
看例子就明白了。
<?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.對象和引用
在之前已經(jīng)研究過了
$a = new A;
$b = $a; //$a,$b都是 new A的引用
$c = &$a; //$c是$a的引用,$a是new A的引用
22.對象序列化
serialize和unserialize,前面理解過了。需要注意的是,unserialize時,需要包含對象所對應(yīng)的類文件。(即類)
需要理解的是:當序列化和反序列化與spl_autoload_register組合應(yīng)用時,反序列化時會自動調(diào)用注冊進去的函數(shù)(即include class文件。)
這一章的內(nèi)容挺多的,具體回憶可以參考
http://www.php.net/manual/zh/language.oop5.php
網(wǎng)站標題:復習PHP-語言參考-類與對象
分享URL:http://chinadenli.net/article12/jpddgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、移動網(wǎng)站建設(shè)、標簽優(yōu)化、定制開發(fā)、軟件開發(fā)、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)