亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP面向對象程序設計重載(overloading)操作詳解

2024-05-05 00:09:36
字體:
來源:轉載
供稿:網友

本文實例講述了PHP面向對象程序設計重載(overloading)操作。分享給大家供大家參考,具體如下:

重載

PHP中的”重載”與其它絕大多數面向對象語言不同,只是他們都是用的相同的名詞而已。傳統的”重載”是用于提供多個同名的 類方法,但各方法的參數類型和個數不同。 PHP所提供的”重載”(overloading)是指動態地”創建”類屬性和方法。當調用當前環境下未定義不可見的類屬性或方法時,重載方法會被調用。是通過魔術方法(magic methods)來實現的。

一般來說,把類中的成員屬性都定義為private的,這更符合現實的邏輯,能夠更好的對類中成員起到保護作用。但是,對成員屬性的讀取和賦值操作是非常頻繁的,而如果在類中為每個私有屬性都定義可以在對象的外部獲取和賦值的公有方法,又是非常非常煩惱的。因此在PHP5.1.0以后的版本中,預定義了兩個方法“__get()”和“__set()”,用來完成對所用私有屬性都能獲取和賦值操作,以及用來檢查私有屬性是否存在的方法“__isset()”和用來刪除對象中私有屬性方法“__unset()”。
通俗一點來說,重載在php中的含義是指,當一個對象或類使用其未定義或不可見的屬性和方法時,其中的一些“處理機制”。

屬性重載

對一個對象不存在的屬性進行使用時,這個類中預先設定好的應對辦法(處理機制)。

屬性,本質就是變量,其只有4個操作:

取值:

當對一個對象不存在(未定義或不可見)的屬性進行“取值”時,就會自動調用方法:__GET()方法不區分大小寫。

賦值:

當對一個對象不存在(未定義或不可見)的屬性進行“賦值”時,就會自動調用方法:__SET()

判斷(isset):

當對一個對象不存在(未定義或不可見)的屬性進行isset()判斷時,就會自動調用方法:isset()

銷毀(unset):

當對一個對象不存在的(未定義或不可見)屬性進行unset()判斷時,就會自動調用方法:unset()

以上4個方法,被稱為魔術方法。

魔術方法

__GET($屬性名):

在對一個對象不存在的屬性進行“取值”的時候,會自動調用的方法,其中該方法可以帶一個形參,表示要對之取值而又不存在的屬性名(字符串),可以使用該方法對意外情況進行某種特殊的處理。

例如:

<?phpclass A{  public $p1 = 1;}$a1 = new A();echo $a1->p1; //1echo $a1->p2; //未定義$p2,會報錯, Notice: Undefined property: A::$p2?>

php的重載,使用__get()方法對上面的出錯作“優雅處理”。

<?phpclass A{  public $p1 = 1;  //private $p2 = 1; //這里將屬性私有化,其實和未定義一樣,對外部來說都相當于不存在  function __get($prop_name){    /*    //比如可以這樣處理    echo "<br />{$prop_name}屬性還未定義(不存在)!";    return ""; //也可以返回0,或false等    */    //還可以這樣處理    trigger_error("發生錯誤:屬性不存在!", E_USER_ERROR);    die();  }}$a1 = new A();echo $a1->p1; //1echo $a1->p2; //未定義$p2,但經過"處理"?>

這里舉一個對所用私有屬性獲取的操作的例子。

例子:

<?phpclass Person{  public $name;  public $sex;  private $age; //年齡私有化,類外不能直接訪問這個屬性  function __construct($name='', $sex='', $age){    $this->name = $name;    $this->sex = $sex;    $this->age = $age;  }  private function __get($propertyName){ //這里要用private修飾,防止類外部調用    if($propertyName == 'age'){      return $this->age;    }  }}$p = new Person('yeoman', '男',23);$v1 = $p->name;$v2 = $p->sex;$v3 = $p->age;  //自動調用了__get()方法獲取私有屬性age(函數定義里面返回)echo "name=$v1, sex=$v2, age=$v3";?>

運行結果為:

name=yeoman, sex=男, age=23

__SET($屬性名, 值):

當對一個對象不存在的屬性進行“賦值”時,就會自動調用這個內部的魔術方法;其有2個形參,分別代表要對不存在的屬性進行賦值的“屬性名”和“屬性值”。
這個方法,結合_GET方法,往往可以使我們定義的類,有一種可擴展的特性。即:類或對象的屬性,可以更為方便自由。

例子:

<?phpclass A{  //定義一個屬性,  protected $prop_list = array();  //初始為空數組  //這個方法會在A的對象使用一個不存在的屬性進行賦值時調用  function __set($p,$v){    //echo "使用不存在的屬性!";    $this->prop_list[$p] = $v;  }  function __get($p){    return $this->prop_list[$p];  }}$a1 = new A();$a1->p1 = 1;  //不存在的屬性名賦值,此時會調用_set(),并傳過去"p1"和1$a1->p2 = 2;$a1->ac = 'avc';echo "<br />輸出這些“不存在的屬性”的值:";echo "<br />a1->p1:" . $a1->p1;  //不存在的屬性名取值,此時會調用_get(),并傳過去"p1"echo "<br />a1->p2:" . $a1->p2;echo "<br />a1->ac:" . $a1->ac;?>

運行結果為:

輸出這些“不存在的屬性”的值:
a1->p1:1
a1->p2:2
a1->ac:avc

__ISSET($屬性名):

當對一個對象不存在的屬性進行isset()判斷時,就會自動調用內部方法:isset();

用法:

$v1 = isset($對象->不存在的屬性);  //此時會調用這個對象所屬類中的魔術方法:isset()

例子:

<?phpclass A{  //定義一個屬性,  protected $prop_list = array();  //初始為空數組  //這個方法會在A的對象使用一個不存在的屬性進行賦值時調用  function __set($p,$v){    //echo "使用不存在的屬性!";    $this->prop_list[$p] = $v;  }  function __get($p){    if($this->prop_list[$p]){      return $this->prop_list[$p];    }else{      return "該屬性不存在!";    }  }  function __isset($prop){  //__isset()是自定義的方法, isset()是系統函數    $re = isset($this->prop_list[$prop]);    return $re;  }}$a1 = new A();$a1->p1 = 1;//不存在的屬性名賦值,此時會調用_set(),并傳過去"p1"和1$a1->p2 = 2;$a1->ac = 'avc';echo "<br />輸出這些“不存在的屬性”的值";echo "<br />a1->p1:" . $a1->p1;//不存在的屬性名取值,此時會調用_get(),并傳過去"p1"echo "<br />a1->p2:" . $a1->p2;echo "<br />a1->ac:" . $a1->ac;//下面演示isset判斷不存在的屬性$v1 = isset($a1->p1); //存在$v2 = isset($a1->ppp1);  //不存在var_dump($v1);echo "<br />";var_dump($v2);?>

運行結果:

輸出這些“不存在的屬性”的值
a1->p1:1
a1->p2:2
a1->ac:avc
boolean true
boolean false

__UNSET($屬性名)

當對一個對象不存在的屬性進行unset()銷毀時,就會自動調用內部方法:unset();

<?phpclass A{  //定義一個屬性,  protected $prop_list = array();  //初始為空數組  //這個方法會在A的對象使用一個不存在的屬性進行賦值時調用  function __set($p,$v){    //echo "使用不存在的屬性!";    $this->prop_list[$p] = $v;  }  function __get($p){    if($this->prop_list[$p]){      return $this->prop_list[$p];    }else{      return "該屬性不存在!";    }  }  function __unset($prop){    unset($this->prop_list[$prop]);  }}$a1 = new A();$a1->p1 = 1;//不存在的屬性名賦值,此時會調用_set(),并傳過去"p1"和1echo "<br />a1->p1:" . $a1->p1;//不存在的屬性名取值,此時會調用_get(),并傳過去"p1"//下面演示unset銷毀一個不存在的屬性unset($a1->p1);echo "<br />a1->p1:" . $a1->p1;?>

運行結果為:

a1->p1:1
a1->p1:該屬性不存在!

下面的例子中,聲明一個Person類,并將所有的成員屬性設置成private的。在類中添加自定義的“__isset()”和“__unset()”兩個方法。在類外部使用“isset()”和“unset()”函數時,會自動調用這兩個方法。代碼如下:

<?phpclass Person{  private $name; //此屬性被封住  private $sex;  private $age;  function __construct($name='', $sex='男', $age){    $this->name = $name;    $this->sex = $sex;    $this->age = $age;  }  private function __isset($propertyName){  //需要一個參數,是測定的私有屬性的名稱    if($propertyName == 'name'){      return false;  //返回假,不允許在類外部測定name屬性    }    return isset($this->$propertyName);  //這里propertyName要加$符,因為這是參數,不是屬性  }  private function __unset($propertyName){    if($propertyName == 'name')      return; //退出方法,不允許刪除對象中的name屬性    unset($this->$propertyName); //這里propertyName要加$符  }  public function say(){    echo "名字:" . $this->name . ",性別:" . $this->sex . ",年齡:" . $this->age . "<br />";  }}$person = new Person("yeoman", "男", 23);var_dump(isset($person->name));  //輸出bool(false),不允許測定name屬性var_dump(isset($person->sex)); //輸出bool(true),存在sex私有屬性var_dump(isset($person->age)); //輸出bool(true),存在age私有屬性var_dump(isset($person->id)); //輸出bool(false),測定對象中不存在id屬性unset($person->name); //刪除私有屬性name,但在 __unset()中不允許刪除unset($person->sex);  //刪除對象中的私有屬性sex,刪除成功unset($person->age);$person->say();  //對象中的sex和age屬性被刪除,輸出:名字:yeoman,性別:,年齡:?>

運行結果:

boolean false
boolean true
boolean true
boolean false
名字:yeoman,性別:,年齡:

方法重載

當對一個對象不存在的實例方法進行“調用”時,會自動調用類中的__call()這個魔術方法;

當對一個類不存在的靜態方法進行“調用”時,會自動調用類中的__callstatic()這個魔術方法。

例子:直接調用不存在的方法

<?phpini_set('display_errors',1);class A{}$a = new A();$a->f1(); //不存在的方法?>

會報錯,報錯內容為:

Fatal error: Uncaught Error: Call to undefined method A::f1()

對上面報錯作“優雅處理”:

<?phpclass A{  //當對這個類的對象不存在的實力方法進行調用時,會自動調用本方法  //這個方法必須帶2個形參:  //$methodName:表示要調用的不存在的方法名;  //$argument:表示要調用該不存在的方法時,所使用的實參數據,是一個數組。  function __call($methodName, $argument){    //echo "__call被調用了!";    echo $methodName . "()方法不存在!";  }}$a = new A();$a->f1(); //不存在的方法,但經過處理?>

運行結果為:

f1()方法不存在!

當對一個類不存在的靜態方法進行“調用”時,會自動調用類中的__callstatic()這個魔術方法。和上面的處理類似。

希望本文所述對大家PHP程序設計有所幫助。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久天堂| 91欧美精品午夜性色福利在线| 亚洲第一区中文字幕| 日韩欧美中文字幕在线播放| 岛国视频午夜一区免费在线观看| 欧美高清在线播放| 91高清免费在线观看| 国产精品福利久久久| 国产丝袜精品视频| 久久99精品视频一区97| 亚洲色图偷窥自拍| 69视频在线播放| 久久精品电影网站| 在线精品视频视频中文字幕| 久久精品影视伊人网| 国产精品久久久久av| 亚洲欧洲午夜一线一品| 国产va免费精品高清在线观看| 欧美日韩国产一区在线| 高清日韩电视剧大全免费播放在线观看| 91国内免费在线视频| 亚洲深夜福利在线| 欧美电影免费观看高清| 揄拍成人国产精品视频| 日韩视频免费在线观看| 欧美激情日韩图片| 欧美大片免费观看在线观看网站推荐| 欧美日韩中国免费专区在线看| 成人a在线视频| 日产日韩在线亚洲欧美| 亚洲成人精品视频| 国产精品美女无圣光视频| 欧美成人黑人xx视频免费观看| 国产mv免费观看入口亚洲| 亚洲色图综合久久| 中文字幕精品—区二区| 精品二区三区线观看| 亚洲国产中文字幕久久网| 欧美成人午夜激情视频| 国产一区二区三区视频| 亚洲成年网站在线观看| 国产精品网站视频| 亚洲91av视频| 国产精品久久久一区| 欧美影院成年免费版| 中文字幕亚洲欧美日韩在线不卡| 国内免费久久久久久久久久久| 久久久久久12| 亚洲成人999| 久久久久亚洲精品成人网小说| 日韩精品亚洲精品| 亚洲人午夜精品免费| 欧美成人激情视频免费观看| 国产97在线|日韩| 欧美高清性猛交| 亚洲天堂免费视频| 国产一区二区久久精品| 91精品国产91久久久久福利| 在线视频国产日韩| 最近日韩中文字幕中文| 亚洲影视中文字幕| 91高清免费视频| 久久精品99久久香蕉国产色戒| 亚洲图片在区色| 精品欧美aⅴ在线网站| www.日韩免费| 国产精品一区二区三区久久| 91社影院在线观看| 国产精品久久久久久av下载红粉| 国产精品国产三级国产专播精品人| 色哟哟网站入口亚洲精品| 91成品人片a无限观看| 午夜精品久久久久久久男人的天堂| 麻豆成人在线看| 日本亚洲欧美成人| 久久久久久久久久久人体| 欧美成人h版在线观看| 久久噜噜噜精品国产亚洲综合| 国产精品免费一区| 亚洲国产精久久久久久| 欧美亚洲在线视频| 欧美疯狂做受xxxx高潮| xvideos亚洲| 亚洲第一中文字幕在线观看| 国产欧美日韩综合精品| 北条麻妃一区二区在线观看| 欧美影院久久久| 亚洲影院色在线观看免费| 色婷婷av一区二区三区在线观看| 久久这里只有精品视频首页| 91精品国产综合久久香蕉922| 欧美性黄网官网| 国产亚洲激情视频在线| 亚洲欧美中文日韩v在线观看| 亚洲精品成人久久电影| 久久国产精品网站| 亚洲第一区第二区| 91sao在线观看国产| 国产精品女主播| 91亚洲国产成人久久精品网站| 国产欧美一区二区三区四区| 欧美性猛交视频| 日韩激情视频在线| 成人免费在线视频网站| 国产成人精品视| 国产亚洲欧美一区| 日韩三级影视基地| 中文字幕日韩综合av| 久久精品2019中文字幕| 少妇高潮久久久久久潘金莲| 欧美激情欧美狂野欧美精品| 欧美高清在线播放| 色偷偷噜噜噜亚洲男人的天堂| 欧美一区二区视频97| 欧美激情一区二区三区高清视频| 国产一区二区丝袜| 日韩中文字幕在线视频播放| 亚洲欧美中文另类| 欧美在线视频免费观看| 茄子视频成人在线| 午夜精品一区二区三区视频免费看| 国产精品久久久久久久久久久久久| 成人av在线天堂| 国产欧美精品在线| 国产v综合ⅴ日韩v欧美大片| 国产精品久久久久久网站| 日韩一区二区av| 色综合91久久精品中文字幕| 日韩精品一区二区视频| 欧美成人精品三级在线观看| 久久精品中文字幕免费mv| 尤物tv国产一区| 日韩av有码在线| 中文字幕欧美日韩va免费视频| 国产日韩欧美在线观看| 日韩欧美精品网站| 久久久久久久久久久成人| 亚洲电影中文字幕| 欧美精品在线网站| 91国产高清在线| 4438全国亚洲精品在线观看视频| 亚洲系列中文字幕| 久久这里只有精品视频首页| 国产v综合ⅴ日韩v欧美大片| 亚洲护士老师的毛茸茸最新章节| 久久久久久中文字幕| 日韩在线观看免费网站| 亚洲人成在线电影| 日韩av免费在线| 麻豆一区二区在线观看| 国语自产在线不卡| 欧美一级在线播放| 91精品免费视频| 精品毛片网大全| 欧美视频13p| 国产精品美女久久久久av超清| 亚洲天堂成人在线视频| 91经典在线视频| 欧美日韩国产91| 精品亚洲男同gayvideo网站| 国产欧美一区二区| 亚洲性av在线| 国内精品久久久久伊人av| 欧美成aaa人片在线观看蜜臀|