婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫 > PHP面向?qū)ο蟪绦蛟O(shè)計(jì)重載(overloading)操作詳解

PHP面向?qū)ο蟪绦蛟O(shè)計(jì)重載(overloading)操作詳解

熱門標(biāo)簽:400電話蘭州申請(qǐng)請(qǐng) 開發(fā)地圖標(biāo)注類網(wǎng)站 廣東廣州在怎么申請(qǐng)400電話 余姚電話機(jī)器人 外呼系統(tǒng)能給企業(yè)帶來哪些好處 百度地圖標(biāo)注偏差 百度地圖怎樣標(biāo)注圖標(biāo) 電銷機(jī)器人問門薩維品牌my 咸寧銷售電銷機(jī)器人系統(tǒng)

本文實(shí)例講述了PHP面向?qū)ο蟪绦蛟O(shè)計(jì)重載(overloading)操作。分享給大家供大家參考,具體如下:

重載

PHP中的”重載”與其它絕大多數(shù)面向?qū)ο笳Z言不同,只是他們都是用的相同的名詞而已。傳統(tǒng)的”重載”是用于提供多個(gè)同名的 類方法,但各方法的參數(shù)類型和個(gè)數(shù)不同。 PHP所提供的”重載”(overloading)是指動(dòng)態(tài)地”創(chuàng)建”類屬性和方法。當(dāng)調(diào)用當(dāng)前環(huán)境下未定義不可見的類屬性或方法時(shí),重載方法會(huì)被調(diào)用。是通過魔術(shù)方法(magic methods)來實(shí)現(xiàn)的。

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

屬性重載

對(duì)一個(gè)對(duì)象不存在的屬性進(jìn)行使用時(shí),這個(gè)類中預(yù)先設(shè)定好的應(yīng)對(duì)辦法(處理機(jī)制)。

屬性,本質(zhì)就是變量,其只有4個(gè)操作:

取值:

當(dāng)對(duì)一個(gè)對(duì)象不存在(未定義或不可見)的屬性進(jìn)行“取值”時(shí),就會(huì)自動(dòng)調(diào)用方法:__GET()方法不區(qū)分大小寫。

賦值:

當(dāng)對(duì)一個(gè)對(duì)象不存在(未定義或不可見)的屬性進(jìn)行“賦值”時(shí),就會(huì)自動(dòng)調(diào)用方法:__SET()

判斷(isset):

當(dāng)對(duì)一個(gè)對(duì)象不存在(未定義或不可見)的屬性進(jìn)行isset()判斷時(shí),就會(huì)自動(dòng)調(diào)用方法:isset()

銷毀(unset):

當(dāng)對(duì)一個(gè)對(duì)象不存在的(未定義或不可見)屬性進(jìn)行unset()判斷時(shí),就會(huì)自動(dòng)調(diào)用方法:unset()

以上4個(gè)方法,被稱為魔術(shù)方法。

魔術(shù)方法

__GET($屬性名):

在對(duì)一個(gè)對(duì)象不存在的屬性進(jìn)行“取值”的時(shí)候,會(huì)自動(dòng)調(diào)用的方法,其中該方法可以帶一個(gè)形參,表示要對(duì)之取值而又不存在的屬性名(字符串),可以使用該方法對(duì)意外情況進(jìn)行某種特殊的處理。

例如:

?php
class A{
  public $p1 = 1;
}
$a1 = new A();
echo $a1->p1; //1
echo $a1->p2; //未定義$p2,會(huì)報(bào)錯(cuò), Notice: Undefined property: A::$p2
?>

php的重載,使用__get()方法對(duì)上面的出錯(cuò)作“優(yōu)雅處理”。

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

這里舉一個(gè)對(duì)所用私有屬性獲取的操作的例子。

例子:

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

運(yùn)行結(jié)果為:

name=yeoman, sex=男, age=23

__SET($屬性名, 值):

當(dāng)對(duì)一個(gè)對(duì)象不存在的屬性進(jìn)行“賦值”時(shí),就會(huì)自動(dòng)調(diào)用這個(gè)內(nèi)部的魔術(shù)方法;其有2個(gè)形參,分別代表要對(duì)不存在的屬性進(jìn)行賦值的“屬性名”和“屬性值”。
這個(gè)方法,結(jié)合_GET方法,往往可以使我們定義的類,有一種可擴(kuò)展的特性。即:類或?qū)ο蟮膶傩裕梢愿鼮榉奖阕杂伞?/p>

例子:

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

運(yùn)行結(jié)果為:

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

__ISSET($屬性名):

當(dāng)對(duì)一個(gè)對(duì)象不存在的屬性進(jìn)行isset()判斷時(shí),就會(huì)自動(dòng)調(diào)用內(nèi)部方法:isset();

用法:

$v1 = isset($對(duì)象->不存在的屬性);  //此時(shí)會(huì)調(diào)用這個(gè)對(duì)象所屬類中的魔術(shù)方法:isset()

例子:

?php
class A{
  //定義一個(gè)屬性,
  protected $prop_list = array();  //初始為空數(shù)組
  //這個(gè)方法會(huì)在A的對(duì)象使用一個(gè)不存在的屬性進(jìn)行賦值時(shí)調(diào)用
  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()是系統(tǒng)函數(shù)
    $re = isset($this->prop_list[$prop]);
    return $re;
  }
}
$a1 = new A();
$a1->p1 = 1;//不存在的屬性名賦值,此時(shí)會(huì)調(diào)用_set(),并傳過去"p1"和1
$a1->p2 = 2;
$a1->ac = 'avc';
echo "br />輸出這些“不存在的屬性”的值";
echo "br />a1->p1:" . $a1->p1;//不存在的屬性名取值,此時(shí)會(huì)調(diào)用_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);
?>

運(yùn)行結(jié)果:

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

__UNSET($屬性名)

當(dāng)對(duì)一個(gè)對(duì)象不存在的屬性進(jìn)行unset()銷毀時(shí),就會(huì)自動(dòng)調(diào)用內(nèi)部方法:unset();

?php
class A{
  //定義一個(gè)屬性,
  protected $prop_list = array();  //初始為空數(shù)組
  //這個(gè)方法會(huì)在A的對(duì)象使用一個(gè)不存在的屬性進(jìn)行賦值時(shí)調(diào)用
  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;//不存在的屬性名賦值,此時(shí)會(huì)調(diào)用_set(),并傳過去"p1"和1
echo "br />a1->p1:" . $a1->p1;//不存在的屬性名取值,此時(shí)會(huì)調(diào)用_get(),并傳過去"p1"
//下面演示unset銷毀一個(gè)不存在的屬性
unset($a1->p1);
echo "br />a1->p1:" . $a1->p1;
?>

運(yùn)行結(jié)果為:

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

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

?php
class 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){  //需要一個(gè)參數(shù),是測(cè)定的私有屬性的名稱
    if($propertyName == 'name'){
      return false;  //返回假,不允許在類外部測(cè)定name屬性
    }
    return isset($this->$propertyName);  //這里propertyName要加$符,因?yàn)檫@是參數(shù),不是屬性
  }
  private function __unset($propertyName){
    if($propertyName == 'name')
      return; //退出方法,不允許刪除對(duì)象中的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),不允許測(cè)定name屬性
var_dump(isset($person->sex)); //輸出bool(true),存在sex私有屬性
var_dump(isset($person->age)); //輸出bool(true),存在age私有屬性
var_dump(isset($person->id)); //輸出bool(false),測(cè)定對(duì)象中不存在id屬性
unset($person->name); //刪除私有屬性name,但在 __unset()中不允許刪除
unset($person->sex);  //刪除對(duì)象中的私有屬性sex,刪除成功
unset($person->age);
$person->say();  //對(duì)象中的sex和age屬性被刪除,輸出:名字:yeoman,性別:,年齡:
?>

運(yùn)行結(jié)果:

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

方法重載

當(dāng)對(duì)一個(gè)對(duì)象不存在的實(shí)例方法進(jìn)行“調(diào)用”時(shí),會(huì)自動(dòng)調(diào)用類中的__call()這個(gè)魔術(shù)方法;

當(dāng)對(duì)一個(gè)類不存在的靜態(tài)方法進(jìn)行“調(diào)用”時(shí),會(huì)自動(dòng)調(diào)用類中的__callstatic()這個(gè)魔術(shù)方法。

例子:直接調(diào)用不存在的方法

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

會(huì)報(bào)錯(cuò),報(bào)錯(cuò)內(nèi)容為:

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

對(duì)上面報(bào)錯(cuò)作“優(yōu)雅處理”:

?php
class A{
  //當(dāng)對(duì)這個(gè)類的對(duì)象不存在的實(shí)力方法進(jìn)行調(diào)用時(shí),會(huì)自動(dòng)調(diào)用本方法
  //這個(gè)方法必須帶2個(gè)形參:
  //$methodName:表示要調(diào)用的不存在的方法名;
  //$argument:表示要調(diào)用該不存在的方法時(shí),所使用的實(shí)參數(shù)據(jù),是一個(gè)數(shù)組。
  function __call($methodName, $argument){
    //echo "__call被調(diào)用了!";
    echo $methodName . "()方法不存在!";
  }
}
$a = new A();
$a->f1(); //不存在的方法,但經(jīng)過處理
?>

運(yùn)行結(jié)果為:

f1()方法不存在!

當(dāng)對(duì)一個(gè)類不存在的靜態(tài)方法進(jìn)行“調(diào)用”時(shí),會(huì)自動(dòng)調(diào)用類中的__callstatic()這個(gè)魔術(shù)方法。和上面的處理類似。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • php面向?qū)ο蟮姆椒ㄖ剌d兩種版本比較
  • php繼承中方法重載(覆蓋)的應(yīng)用場(chǎng)合
  • PHP使用方法重載實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建屬性的get和set方法
  • PHP利用func_get_args和func_num_args函數(shù)實(shí)現(xiàn)函數(shù)重載實(shí)例
  • php中拷貝構(gòu)造函數(shù)、賦值運(yùn)算符重載
  • PHP小技巧之函數(shù)重載
  • PHP實(shí)現(xiàn)重載的常用方法實(shí)例詳解
  • PHP面相對(duì)象中的重載與重寫
  • PHP面向?qū)ο蟪绦蛟O(shè)計(jì)模擬一般面向?qū)ο笳Z言中的方法重載(overload)示例
  • php魔術(shù)函數(shù)__call()用法實(shí)例分析
  • PHP __call()方法實(shí)現(xiàn)委托示例
  • php 使用 __call實(shí)現(xiàn)重載功能示例

標(biāo)簽:鷹潭 臨沂 銅陵 巴彥淖爾 麗江 重慶 衡陽 十堰

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP面向?qū)ο蟪绦蛟O(shè)計(jì)重載(overloading)操作詳解》,本文關(guān)鍵詞  PHP,面向,對(duì)象,程序設(shè)計(jì),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP面向?qū)ο蟪绦蛟O(shè)計(jì)重載(overloading)操作詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于PHP面向?qū)ο蟪绦蛟O(shè)計(jì)重載(overloading)操作詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    美女视频一区二区| 亚洲免费观看高清完整版在线 | 懂色av一区二区三区蜜臀| 欧美三级午夜理伦三级中视频| 中文字幕一区二区三区四区不卡| 激情成人午夜视频| 欧美精品一区二区三区一线天视频| 视频在线观看国产精品| 欧美日本一区二区三区四区| 亚洲精品乱码久久久久久日本蜜臀| 成人国产精品免费观看| 最新热久久免费视频| 东方aⅴ免费观看久久av| 中文在线一区二区| 中文字幕欧美国产| 粉嫩久久99精品久久久久久夜| 国产日韩欧美麻豆| 91原创在线视频| 亚洲午夜在线视频| 韩国成人福利片在线播放| 中文字幕国产一区| 91激情在线视频| 成人福利视频网站| 一区二区三区欧美激情| 91.成人天堂一区| 国产另类ts人妖一区二区| 18欧美亚洲精品| 日本一区二区三区dvd视频在线| 色94色欧美sute亚洲13| 五月婷婷色综合| 日韩精品最新网址| 成人免费看黄yyy456| 亚洲一区二区三区四区五区中文 | 日韩午夜av电影| 99视频有精品| 亚洲午夜一二三区视频| 精品99999| 北条麻妃一区二区三区| 九九**精品视频免费播放| 樱花草国产18久久久久| 欧美不卡一二三| 99在线精品视频| 激情综合一区二区三区| 一区二区三区国产精品| 久久久久99精品国产片| 91福利资源站| 蜜臀av一级做a爰片久久| 国产人伦精品一区二区| 欧洲在线/亚洲| 久久精品理论片| 国产精品嫩草影院com| 国产精品综合久久| 在线观看91精品国产入口| 国产电影精品久久禁18| 国产精品白丝在线| 欧美精三区欧美精三区| 国产成人av资源| 亚洲成人精品一区| 久久精品一区二区三区不卡牛牛| 九九久久精品视频| 亚洲一区av在线| 国产偷国产偷精品高清尤物| 在线观看欧美日本| 久久国产婷婷国产香蕉| 亚洲精品视频观看| 久久夜色精品一区| 7777精品伊人久久久大香线蕉的| 国产91在线|亚洲| 亚洲va欧美va人人爽| 国产女人aaa级久久久级| 成人免费三级在线| 图片区小说区国产精品视频| 国产精品麻豆久久久| 欧美久久久一区| xvideos.蜜桃一区二区| 欧美日本一道本| 99综合电影在线视频| 亚洲一区二区三区视频在线 | 日本不卡的三区四区五区| 国产精品国产自产拍高清av王其| 自拍视频在线观看一区二区| 欧美va亚洲va国产综合| 91精品麻豆日日躁夜夜躁| 经典一区二区三区| 亚洲综合色成人| 成人欧美一区二区三区小说 | 91精品国产91久久久久久一区二区| 国产麻豆精品久久一二三| 青青草精品视频| 午夜亚洲国产au精品一区二区| 欧美国产日本韩| 久久精品在线观看| 久久中文娱乐网| 日韩欧美123| 4438x亚洲最大成人网| 欧美性猛片xxxx免费看久爱| 色吊一区二区三区 | 午夜精品福利在线| 一区二区在线观看av| 亚洲女人的天堂| 欧美国产日韩a欧美在线观看| 99re热视频精品| 99精品欧美一区二区三区综合在线| 国产成人av电影在线| 国产91精品欧美| 99在线精品免费| youjizz国产精品| gogo大胆日本视频一区| 成人午夜电影久久影院| 99re亚洲国产精品| 色综合一区二区三区| 在线观看不卡视频| 欧美电影免费观看完整版| 国产精品一区二区视频| 欧美自拍丝袜亚洲| 91网站最新网址| 欧美网站一区二区| 欧美成人在线直播| 久久品道一品道久久精品| 国产精品家庭影院| 亚洲精品美腿丝袜| 日韩电影免费在线观看网站| 男男视频亚洲欧美| 国产成人综合亚洲91猫咪| 日本道精品一区二区三区| 欧美精品123区| 久久久亚洲综合| 日韩一区在线看| 美脚の诱脚舐め脚责91| 欧美亚一区二区| 欧美日韩高清一区二区| 久久视频一区二区| 久久久综合视频| 亚洲欧洲国产专区| 日本视频中文字幕一区二区三区| 天天av天天翘天天综合网| 图片区日韩欧美亚洲| 懂色中文一区二区在线播放| 欧美色精品天天在线观看视频| 欧美v亚洲v综合ⅴ国产v| 亚洲欧美另类在线| 国内欧美视频一区二区| 欧美在线观看你懂的| 欧美大片在线观看一区二区| √…a在线天堂一区| 国产精品夜夜爽| 欧美一区二区三区男人的天堂| 日韩一区中文字幕| 91久久精品日日躁夜夜躁欧美| 久久色视频免费观看| 婷婷综合另类小说色区| 国产乱码字幕精品高清av| 在线不卡a资源高清| 国产精品拍天天在线| 亚洲制服丝袜av| 欧美日韩免费视频| 亚洲精品在线三区| 国产精品国产三级国产aⅴ无密码| 日本韩国视频一区二区| 欧美日本国产视频| 伊人婷婷欧美激情| 成人国产精品免费网站| 亚洲女爱视频在线| 婷婷亚洲久悠悠色悠在线播放| 国产一区在线精品| 91精品国产综合久久婷婷香蕉| 久久精品综合网| 喷水一区二区三区| 日韩午夜小视频| 久久国产精品一区二区| 51精品国自产在线| 美女www一区二区| 精品国产网站在线观看| av午夜一区麻豆| 亚洲人成影院在线观看| 日本伦理一区二区| 石原莉奈在线亚洲二区| 日韩一区二区在线观看视频| 国产精品国产三级国产aⅴ无密码| 色伊人久久综合中文字幕| 亚洲图片激情小说| 一本大道av伊人久久综合| 一区二区三区在线播| 欧美日韩国产高清一区二区 | 日韩中文字幕一区二区三区| 欧美疯狂性受xxxxx喷水图片| 亚洲一区二区三区四区在线| 欧美日韩成人综合天天影院 | 日韩一区中文字幕| 国产精品一区二区91| 国产精品久久一卡二卡| 国产成人av一区二区| 69久久夜色精品国产69蝌蚪网| 国产激情一区二区三区四区 | 欧美日本一区二区三区四区| 天天综合网天天综合色| 欧美xxxx老人做受| 在线观看欧美日本| 狠狠久久亚洲欧美| 精品亚洲成a人|