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