復(fù)習(xí)PHP-語(yǔ)言參考-類(lèi)與對(duì)象

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è)好辦法)    }

注意:as語(yǔ)法還可以修改控制級(jí)別

如: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)

成都網(wǎng)站建設(shè)公司