php類和對象--重載

來源:互聯網
上載者:User
PHP所提供的"重載"(overloading)是指動態地"建立"類屬性和方法。我們是通過魔術方法(magic methods)來實現的。

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

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

注意:

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

2)PHP中的"重載"與其它絕大多數物件導向語言不同。傳統的"重載"是用於提供多個同名的類方法,但各方法的參數類型和個數不同。

屬性重載

public void__set(string$name, mixed$value)publicmixed__get(string$name)publicbool__isset(string$name)publicvoid__unset(string$name)

在給不可訪問屬性賦值時,__set() 會被調用。

讀取不可訪問屬性的值時,__get() 會被調用。

當對不可訪問屬性調用 isset() 或 empty() 時,__isset() 會被調用。

當對不可訪問屬性調用 unset() 時,__unset() 會被調用。

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

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

注意:

因為 PHP 處理賦值運算的方式,__set() 的傳回值將被忽略。類似的, 在下面這樣的鏈式賦值中,__get() 不會被調用:

$a = $obj->b = 8;

注意:

在除 isset() 外的其它語言結構中無法使用重載的屬性,這意味著當對一個重載的屬性使用 empty() 時,重載魔術方法將不會被調用。

為避開此限制,必須將重載屬性賦值到本地變數再使用 empty()。

Example #1 使用 __get(),__set(),__isset() 和 __unset() 進行屬性重載

class PropertyTest{    /*被重載的資料儲存在此*/    private $data = array();    /*重載不能被用在已經定義的屬性*/    public $declared = 1;    /*只有從類外部存取這個屬性時,重載才會發生*/    private $hidden = 2;    public function __set($name,$value)    {        echo "Setting '$name' to '$value'<br>";        $this->data[$name] = $value;    }    public function __get($name)    {        echo "Getting '$name'<br>";        if(array_key_exists($name,$this->data)){            return $this->data[$name];        }        $trace = debug_backtrace();        trigger_error('未知屬性 via __get():'.$name.' in '.$trace[0]['file'].' on line '.$trace[0]['line'],            E_USER_NOTICE);          return null;    }    /*PHP5.1.0之後的版本*/    public function __isset($name){        echo "Is '$name' set?<br>";        return isset($this->data[$name]);    }    /*PHP5.1.0之後的版本*/    public function __unset($name){        echo "Unsetting '$name'<br>";        unset($this->data[$name]);    }    /*非魔術方法*/    public function getHidden(){        return $this->hidden;    }}echo '<pre>';$obj = new PropertyTest;$obj->a = 1;echo $obj->a.'<br>';var_dump(isset($obj->a));unset($obj->a);echo '<br>';echo $obj->declared.'<br>';echo "Let's experiment with the private property named 'hidden':<br>";echo "Privates are visible inside the class,so __set() not used...<br>";echo $obj->getHidden().'<br>';echo "Privates not visible outside of class,so __get() is used...<br>";echo $obj->hidden;

輸出結果:

Setting 'a' to '1'

Getting 'a'

1

Is 'a' set?

bool(true)
Unsetting 'a'

1

Let's experiment with the private property named 'hidden':

Privates are visible inside the class,so __set() not used...

2

Privates not visible outside of class,so __get() is used...

Getting 'hidden'

方法重載

public mixed __call ( string$name , array$arguments )public static mixed __callStatic ( string$name , array$arguments )

在對象中調用一個不可存取方法時,__call() 會被調用。

用靜態方式中調用一個不可存取方法時,__callStatic() 會被調用。

$name 參數是要調用的方法名稱。$arguments 參數是一個枚舉數組,包含著要傳遞給方法 $name 的參數。

Example #2 使用 __call() 和 __callStatic() 對方法重載

class MethodTest{    public function __call($name,$arguments)    {        //注意:$name的值區分大小寫        echo "Calling object method '$name' ".implode(',',$argument).'<br>';    }    //PHP5.3.0之後的版本    public static function __callStatic($name,$arguments)    {        //注意:$name的值區分大小寫        echo "Calling static method '$name' ".implode(',',$argument).'<br>';    }}$obj = new MethodTest;$obj -> runTest('in object context');MethodTest::runTest('in static context');

輸出結果:

Calling object method 'runTest'

Calling object method 'runTest'

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.