成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

類的關(guān)鍵字、魔術(shù)方法與單態(tài)設(shè)計(jì)模式

bovenson / 1118人閱讀

摘要:方法如無的調(diào)用,則默認(rèn)為為靜態(tài)方法。聲明靜態(tài)方法會(huì)有錯(cuò)誤提示,但很方便,能用盡量用效率高。

一、面向?qū)ο蟮年P(guān)鍵字

1.instanceof操作符:

對(duì)象是否屬于類(檢測繼承性),如下:

    class Person {};
    class Student extends Person {};
    $p=new Person;
    $s=new Student;
    echo $p instanceof Student;//false
    echo $s instanceof Student;//true
    echo $s instanceof Person;//true

2.final關(guān)鍵字:

不定義常量,不能使用final修飾成員屬性

    a.final可以修飾類,該類不能擴(kuò)展(不能有子類),即最終類,如下:
    final class Person {......};
    b.final可以修飾方法,這個(gè)方法不能在子類中被覆蓋(不能被擴(kuò)展),即最終方法,如下:
    public final function say(){......};
    //子類不能用parent::say();調(diào)用

3.static關(guān)鍵字:

    a.將一個(gè)類中多個(gè)實(shí)例對(duì)象的共用屬性/方法存入初始化靜態(tài)段中,節(jié)省內(nèi)存空間
    b.類第一次出現(xiàn),加載時(shí),已將static成員加載到了內(nèi)存,即不創(chuàng)建實(shí)例對(duì)象,也可以訪問該成員//echo Person::country
    c.靜態(tài)成員一定要使用類來訪問//echo Person::country
    d.靜態(tài)成員可以訪問也可以賦值,賦值后所有實(shí)例都變化,self關(guān)鍵字可以在本類中代表本類名,類似this
    e.靜態(tài)成員一旦被加載,只有腳本結(jié)束才釋放    
    f.該關(guān)鍵字可以修飾屬性和方法,不能修飾類。方法如無$this的調(diào)用,則默認(rèn)為為靜態(tài)方法。聲明靜態(tài)方法會(huì)有錯(cuò)誤提示,但很方便,能用盡量用(效率高)。
    g.上述第f條的缺點(diǎn)如下:
        (1)占內(nèi)存,腳本結(jié)束才釋放
        (2)靜態(tài)方法只能使用靜態(tài)屬性,因?yàn)椴荒苁褂?this

4.const關(guān)鍵字

a.常量存儲(chǔ)區(qū)域?yàn)槌跏蓟o態(tài)段
b.define只能在類外部聲明常量,內(nèi)部報(bào)錯(cuò)
c.const只能修飾成員屬性,即定義常量,注意:
    (1)常量使用大寫,不能使用$
    (2)聲明時(shí)必有初值
    (3)訪問方式與static相同(self::name),但只能讀
          

二、魔術(shù)方法

1.自動(dòng)調(diào)用,只有PHP語言存在
2.以“__”開始
3.方法名固定        
4.如果不寫就不存在,也沒有默認(rèn)功能   

1.__toString():將對(duì)象轉(zhuǎn)為自定義的字符串(類似js),該方法不能有參數(shù),必須返回一個(gè)字符串(echo/print后常用),如下:

    class Person {
        function __toString(){
            return "$$$$
"; } }; $p=new Person; echo $p;//$$$$

2.__clone():

a.克隆對(duì)象

    class Person {
        function __toString(){
            return "$$$$
"; } }; $p=new Person; $p2=clone $p;

b.魔術(shù)方法:

(1)在克隆對(duì)象時(shí)自動(dòng)調(diào)用
(2)作用:與構(gòu)造方法一樣,對(duì)新克隆的對(duì)象初始化
(3)該方法中$this代表副本,可進(jìn)行初始化($that有時(shí)可代表原本,有的版本能用)
    class Person {
        var $name;
        function __construct($name){
            $this->name=$name;
        }
        function say(){
            echo $this->name."
"; } function __clone(){ $this->name="ni"; } }; $p=new Person("wo"); $p->say();//wo $p2=clone $p; $p2->say();//ni

3.__call():

a.調(diào)用對(duì)象中不存在的方法時(shí),自動(dòng)調(diào)用
b.有兩個(gè)參數(shù),第一個(gè)參數(shù)不存在的方法名,第二個(gè)是不存在方法的參數(shù)數(shù)組
c.作用:將功能相似方法進(jìn)行批量處理或?qū)Σ淮嬖诜椒ㄍ瓿商崾竟δ?/p>

    class Person {
        var $name;
        function __construct($name){
            $this->name=$name;
        }
        function say(){
            echo $this->name."
"; } function __clone(){ $this->name="ni"; } function __call($method,$args){ echo "方法{$method}(),參數(shù)為"; print_r($args); echo"不存在!
"; } }; $p=new Person("wo"); $p->eat("肉","米"); //方法eat(),參數(shù)為Array ( [0] => 肉 [1] => 米 ) 不存在!

d.可以用來實(shí)現(xiàn)重載(與JS函數(shù)的arguments方法類似)

class Foo1{
        public function __call($name,$arguments){
                if($name=="doStuff"){
                        /**
                         *實(shí)際上,不僅僅可以第一個(gè)參數(shù)類型,還可以判斷參數(shù)個(gè)數(shù),以及參數(shù)順序,那么就和C++等強(qiáng)數(shù)據(jù)類型語言的重載效果是一樣的了!
                        */
                        if(is_int($arguments[0])){
                                $this->doStuffForInt($arguments[0]);
                        }else if(is_string($arguments[0])){
                                $this->doStuffForString($arguments[0]);
                        }
                }
        }

        private function doStuffForInt($a){
                echo "執(zhí)行的是doStuffForInt()方法";
        }

        private function doStuffForString($a){
                echo "執(zhí)行的是doStuffForString()方法";
        }
}

$foo1=new Foo1;

$foo1->doStuff("1");//執(zhí)行的是doStuffForString()方法

三、單態(tài)/單件/單例設(shè)計(jì)模式

概念:一個(gè)類只能創(chuàng)建一個(gè)對(duì)象,最適合PHP使用的設(shè)計(jì)模式

方法:

a.先將構(gòu)造函數(shù)私有化,讓類不能創(chuàng)建對(duì)象,如下:

    class Person {
        private function __construct(){
            
        }
        function __destruct(){
            echo "######
"; } function say(){ echo "$$$$
"; } }; $p=new Person;//報(bào)錯(cuò)

b.定義(static)靜態(tài)方法,在類中創(chuàng)建類的對(duì)象,外部使用類調(diào)用來創(chuàng)建對(duì)象,但這樣仍然是每次調(diào)用創(chuàng)建一個(gè)新對(duì)象,而不是只能創(chuàng)建一個(gè)對(duì)象,具體如下:

    class Person {
        private function __construct(){
            
        }
        static function createObj(){
            $obj=new self;
            return $obj;
        }
        function __destruct(){
            echo "######
"; } function say(){ echo "$$$$
"; } }; $p=Person::createObj();//###### $p=Person::createObj();//###### $p=Person::createObj();//###### $p=Person::createObj();//###### $p->say();//$$$$

c.將新建對(duì)象的變量$obj設(shè)定為靜態(tài)屬性(唯一的),即可達(dá)到要求,該類只能創(chuàng)建一個(gè)對(duì)象,如下:

    class Person {
        static $obj=null;
        private function __construct(){
            
        }
        static function createObj(){
            if(is_null(self::$obj)){
                self::$obj=new self;
            }
            return self::$obj;
        }
        function __destruct(){
            echo "######
"; } function say(){ echo "$$$$
"; } }; $p=Person::createObj(); $p=Person::createObj(); $p=Person::createObj(); $p=Person::createObj(); //由于只創(chuàng)建了一個(gè)類,只輸出一次###### $p->say();//$$$$

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/25594.html

相關(guān)文章

  • Spring專題之Bean初始化源碼分析(1)

    摘要:初始化我們知道容器初始化后會(huì)對(duì)容器中非懶加載的,單例的以及非抽象的定義進(jìn)行的初始化操作,所以我們分析源碼的入口也就是在容器初始化的入口,分析容器初始化后在什么地方開始第一次的初始化。 前言 Spring IOC容器在初始化之后會(huì)對(duì)容器中非懶加載的,單例的以及非抽象的bean定義進(jìn)行bean的初始化操作,同時(shí)會(huì)也涉及到Bean的后置處理器以及DI(依賴注入)等行為。對(duì)于Bean的初始化,...

    harryhappy 評(píng)論0 收藏0
  • PHP_OOP

    摘要:特殊在,方法被對(duì)象調(diào)用執(zhí)行時(shí),會(huì)自動(dòng)確定是那個(gè)對(duì)象調(diào)用的該方法,會(huì)使用該對(duì)象為方法內(nèi)的賦值構(gòu)造析構(gòu)類,沒有作用域,作用域,只是講,函數(shù)內(nèi)和函數(shù)外。析構(gòu)在對(duì)象消失對(duì)象被銷毀時(shí),也會(huì)自動(dòng)執(zhí)行一個(gè)方法,稱之為析構(gòu)方法。 相關(guān)定義 對(duì)象(object):現(xiàn)實(shí)生活中的實(shí)體,在編程語言中的體現(xiàn)。實(shí)體都有屬性和功能。一組數(shù)據(jù),和操作管理這些數(shù)據(jù)的操作,定義在一起就形成了一個(gè)實(shí)體,稱之為對(duì)象。(屬性和...

    RiverLi 評(píng)論0 收藏0
  • PHP面向?qū)ο?/b>

    摘要:面向?qū)ο竺嫦驅(qū)ο蠡A(chǔ)面向?qū)ο笫裁词穷惥哂邢嗤瑢傩蕴卣骱头椒ㄐ袨榈囊幌盗袀€(gè)體的集合,類是一個(gè)抽象的概念。析構(gòu)函數(shù),當(dāng)一個(gè)對(duì)象被銷毀前,自動(dòng)調(diào)用。作用是為新克隆的對(duì)象進(jìn)行初始化賦值對(duì)象序列化時(shí),自動(dòng)調(diào)用。使用抽象類的作用限制實(shí)例化。 面向?qū)ο?面向?qū)ο蠡A(chǔ) 面向?qū)ο?什么是類? 具有相同屬性(特征)和方法(行為)的一系列個(gè)體的集合,類是一個(gè)抽象的概念。 什么是對(duì)象? 從類中,拿到的具有具體...

    seanlook 評(píng)論0 收藏0
  • PHP面向?qū)ο缶幊蹋好嫦驅(qū)ο蟾拍睢⒒緦?shí)踐、高級(jí)實(shí)戰(zhàn)、PHP面向?qū)ο筇厥鈱?shí)踐

    摘要:一面向?qū)ο蟮母拍钍裁词敲嫦驅(qū)ο笫篱g萬物皆對(duì)象,抽象的也是對(duì)象,一切可見或不可見都是對(duì)象對(duì)象的基本組成對(duì)象包含兩個(gè)部分對(duì)象的組成元素是對(duì)象的數(shù)據(jù)模型,用于描述對(duì)象的數(shù)據(jù)又稱為對(duì)象的屬性,或者對(duì)象的成員變量對(duì)象的行為是對(duì)象的行為模型,用于描述對(duì) 一、面向?qū)ο蟮母拍?1.1 什么是面向?qū)ο?object oriented) ?????世間萬物皆對(duì)象,抽象的也是對(duì)象,一切可見或不可見都是對(duì)象 ...

    worldligang 評(píng)論0 收藏0
  • php易錯(cuò)筆記-類與對(duì)象,命名空間

    摘要:類與對(duì)象基本概念如果在之后跟著的是一個(gè)包含有類名的字符串,則該類的一個(gè)實(shí)例被創(chuàng)建。如果該類屬于一個(gè)名字空間,則必須使用其完整名稱。如果一個(gè)類被聲明為,則不能被繼承。命名空間通過關(guān)鍵字來聲明。 類與對(duì)象 基本概念 new:如果在 new 之后跟著的是一個(gè)包含有類名的字符串,則該類的一個(gè)實(shí)例被創(chuàng)建。如果該類屬于一個(gè)名字空間,則必須使用其完整名稱。 Example #3 創(chuàng)建一個(gè)實(shí)例 ...

    MartinHan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<