1. 程式人生 > >面向物件之魔術方法__get()和__set()

面向物件之魔術方法__get()和__set()

__get()方法:這個方法用來獲取私有成員和保護成員屬性值的,有一個引數,引數傳入你要獲取的成員屬性的名稱,返回獲取的屬性值,這個方法不用我們手工的去呼叫,因為我們也可以把這個方法做成私有的方法,是在直接獲取私有屬性的時候物件自動呼叫的。因為私有屬性已經被封裝上了,是不能直接獲取值的,但是如果你在類裡面加上了這個方法,在使用“echo $p1->name”這樣的語句直接獲取值的時候就會自動呼叫__get(name)namename,通過這個方法的內部執行,返回我們傳入的私有屬性的值。如果成員屬性不封裝成私有的,物件本身就不會去自動呼叫這個方法。

__set()方法:

這個方法用來為私有和保護成員成員屬性設定值的,有兩個引數,第一個引數為你要為設定值的屬性名,第二個引數是要給屬性設定的值,沒有返回值。這個方法同樣不用我們手工去呼叫,它也可以做成私有的,是在直接設定私有屬性值的時候自動呼叫的,同樣屬性私有的已經被封裝上
了,如果沒有__set()這個方法,是不允許的,比如:$this->name=‘zhangsan’,這樣會出錯,但是如果你在類裡面加上了__set(propertyname,value)這個方法,在直接給私有屬性賦值的時候,就會自動呼叫它,把屬性比如name傳給propertyname,zhangsanvalue,通過這個方法的執行,達到賦值的目的。如果成員屬性不封裝成私有的,物件本身就不會去自動呼叫這個方法。為了不傳入非法的值,還可以在這個方法給做一下判斷。

<?php 
header("content-type:text/html;charset=utf-8");
class car{
    //private $ming;
    protected $ming;
    //public $ming;
    function __set($name,$value)
    {
        //另外可以加入判斷的程式碼
        $this->$name=$value;
    }
    function __get($name)
    {
        //另外可以加入判斷的程式碼
        return $this->$name
; } } $car1=new car(); $car1->ming='本田'; echo $car1->ming;