【php類與對象】重載

來源:互聯網
上載者:User

本篇文章給大家分享的內容是關於【php類與對象】重載,有著一定的參考價值,有需要的朋友可以參考一下

重載(overloading)

定義:指動態地”建立”類屬性和方法。

實現:魔術方法。

當調用當前環境下未定義或不可見的類屬性或方法時,重載方法會被調用。

所有的重載方法都必須被聲明為 public

這些魔術方法的參數都不能通過引用傳遞。

屬性重載

public void __set ( string $name , mixed $value )在給不可訪問屬性賦值時,__set() 會被調用。public mixed __get ( string $name )讀取不可訪問屬性的值時,__get() 會被調用.public bool __isset ( string $name )當對不可訪問屬性調用 isset() 或 empty() 時,__isset() 會被調用。public void __unset ( string $name )當對不可訪問屬性調用 unset() 時,__unset() 會被調用。

參數 $name 是指要操作的變數名稱。__set() 方法的 $value 參數指定了 $name 變數的值。

屬性重載只能在對象中進行。從 PHP 5.3.0 起, 將這些魔術方法定義為 static 會產生一個警告。在靜態方法中,這些魔術方法將不會被調用。所以這些方法都不能被 聲明為 static。

【未懂】在除 isset() 外的其它語言結構中無法使用重載的屬性,這意味著當對一個重載的屬性使用 empty() 時,重載魔術方法將不會被調用。為避開此限制,必須將重載屬性賦值到本地變數再使用 empty()。
Example #1 使用 __get(),__set(),__isset() 和 __unset() 進行屬性重載<?phpclass PropertyTest {     /**  被重載的資料儲存在此  */    private $data = array();     /**  重載不能被用在已經定義的屬性  */    public $declared = 1;     /**  只有從類外部存取這個屬性時,重載才會發生 */    private $hidden = 2;    public function __set($name, $value)     {        echo "Setting '$name' to '$value'\n";        $this->data[$name] = $value;    }    public function __get($name)     {        echo "Getting '$name'\n";        if (array_key_exists($name, $this->data)) {            return $this->data[$name];        }        $trace = debug_backtrace();        trigger_error(            'Undefined property via __get(): ' . $name .            ' in ' . $trace[0]['file'] .            ' on line ' . $trace[0]['line'],            E_USER_NOTICE);        return null;    }    /**  PHP 5.1.0之後版本 */    public function __isset($name)     {        echo "Is '$name' set?\n";        return isset($this->data[$name]);    }    /**  PHP 5.1.0之後版本 */    public function __unset($name)     {        echo "Unsetting '$name'\n";        unset($this->data[$name]);    }    /**  非魔術方法  */    public function getHidden()     {        return $this->hidden;    }}echo "<pre>\n";$obj = new PropertyTest;$obj->a = 1;   //__set():  Setting 'a' to '1'echo $obj->a . "\n\n";     //__get():  Getting 'a'var_dump(isset($obj->a));  //__isset():    Is 'a' set? bool(true)unset($obj->a);        //__unset():    Unsetting 'a'var_dump(isset($obj->a));  //__isset():    Is 'a' set? bool(false)echo "\n";echo $obj->declared . "\n\n";  //可訪問,__get()不被調用:1echo "Let's experiment with the private property named 'hidden':\n";echo "Privates are visible inside the class, so __get() not used...\n";echo $obj->getHidden() . "\n"; //可訪問,__get()不被調用:2echo "Privates not visible outside of class, so __get() is used...\n";echo $obj->hidden . "\n";  //__get():  Notice:  Undefined property via __get(): hidden in D:\phpStudy2018\PHPTutorial\WWW\index.php on line 75 in D:\phpStudy2018\PHPTutorial\WWW\index.php on line 31?>

方法重載

public mixed __call ( string $name , array $arguments )在對象中調用一個不可存取方法時,__call() 會被調用。public static mixed __callStatic ( string $name , array $arguments )在靜態上下文中調用一個不可存取方法時,__callStatic() 會被調用。

相關推薦:

PHP中重載詳解

PHP的重載介紹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.