php中經常使用的一些魔術方法的使用介紹

1、__set和__get

一、__set()方法:這個方法用來爲私有成員屬性設置值的,有兩個參數,第一個參數爲你要爲設置值的屬性名,第二個參數是要給屬性設置的值,沒有返回值。這個方法一樣不用咱們手工去調用,它也能夠作成私有的,是在直接設置私有屬性值的時候自動調用的,一樣屬性私有的已經被封裝上.php

二、__get()方法:這個方法用來獲取私有成員屬性值的,有一個參數,參數傳入你要獲取的成員屬性的名稱,返回獲取的屬性值,這個方法不用咱們手工的去調用,由於咱們也能夠把這個方法作成私有的方法,是在直接獲取私有屬性的時候對象自動調用的。html

使用方式:數組

<?php

class Object
{
	protected $array = array();

	function __set($key,$value)
	{
		$this->array[$key] = $value;
	}

	function __get($key)
	{
		return $this->array[$key];
	}
}

首先咱們定義一個Object類,其中包含了兩個魔法函數,__set和__get,以及一個叫作$array的數組。bash

__set方法當該類的一個實例化對象給其中的屬性賦值的時候調用。
__get方法當獲取該屬性值的時候調用,效果以下:函數

$obj = new Object();
$obj->name = "I'm name";//此時調用__set方法,而且參數中,%key爲name,$value爲"I'm name";
echo $obj->name; //此時調用__get方法,輸出"I'm name"

 

2、__construct和__destruct

1. 構造函數__construct(),PHP 5 允行開發者在一個類中定義一個方法做爲構造函數。具備構造函數的類會在每次建立新對象時先調用此方法,因此很是適合在使用對象以前作一些初始化工做。this

2. 析構函數__destruct(),PHP 5 引入了析構函數的概念,這相似於其它面向對象的語言,如 C++。析構函數會在到某個對象的全部引用都被刪除或者當對象被顯式銷燬時執行。析構函數即便在使用 exit() 終止腳本運行時也會被調用。在析構函數中調用 exit() 將會停止其他關閉操做的運行。spa

<?php
class MyDestructableClass {
   function __construct() {
       print "In constructor\n";
       $this->name = "MyDestructableClass";
   }

   function __destruct() {
       print "Destroying " . $this->name . "\n";
   }
}

$obj = new MyDestructableClass();
?>

效果以下:code

In constructor
Destroying MyDestructableClass

 

3、__clone() 對象複製調用方法

在多數狀況下,咱們並不須要徹底複製一個對象來得到其中屬性。但有一個狀況下確實須要:若是你有一個 GTK 窗口對象,該對象持有窗口相關的資源。你可能會想複製一個新的窗口,保持全部屬性與原來的窗口相同,但必須是一個新的對象(由於若是不是新的對象,那麼一個窗口中的改變就會影響到另外一個窗口)。還有一種狀況:若是對象 A 中保存着對象 B 的引用,當你複製對象 A 時,你想其中使用的對象再也不是對象 B 而是 B 的一個副本,那麼你必須獲得對象 A 的一個副本。htm

對象複製能夠經過 clone 關鍵字來完成(若是可能,這將調用對象的 __clone() 方法)。對象中的 __clone() 方法不能被直接調用。對象

<?php
class SubObject
{
    static $instances = 0;
    public $instance;

    public function __construct() {
        $this->instance = ++self::$instances;
    }

    public function __clone() {
        $this->instance = ++self::$instances;
    }
}

class MyCloneable
{
    public $object1;
    public $object2;

    function __clone()
    {
      
        // 強制複製一份this->object, 不然仍然指向同一個對象
        $this->object1 = clone $this->object1;
    }
}

$obj = new MyCloneable();

$obj->object1 = new SubObject();
$obj->object2 = new SubObject();

$obj2 = clone $obj;


print("Original Object:\n");
print_r($obj);

print("Cloned Object:\n");
print_r($obj2);

?>

以上例程會輸出:

Original Object:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 1
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)
Cloned Object:
MyCloneable Object
(
    [object1] => SubObject Object
        (
            [instance] => 3
        )

    [object2] => SubObject Object
        (
            [instance] => 2
        )

)
相關文章
相關標籤/搜索