PHP的Overloading

許久之前閱讀PHP手冊,對於Overloading並沒有很強烈的概念,還不清楚這個功能能夠發揮哪些功能,只是最近看Zend Framework的有關於DB的開發手冊,才忽然明白這個功能的作用在哪裡,Overloading能有效封裝物件,避免不相關的物件屬性存取。

 

 

Overloading是什麼?
PHP中,Overloading能動態建立物件的屬性及方法,靠著PHP內建的方法,當設定物件的不可存取的屬性或方法時,就會觸發PHP內建的Overloading方法,設定或是動態建立物件原先不能存取的屬性或方法。

 

關於PHP物件屬性 Overloading的方法
__set()
__get()
__isset()
__unset()

 

Overloading的功能
建立物件與資料表的欄位對應,就能夠清楚的知道資料表的結構,使用及操作上比較直覺,而不是使用sql語法作對應,不但語法冗長也容易出錯,使用物件的對映方法,提供一套標準化的方式存取資料庫,在操作上避免直接下sql語法,提高程式可讀性。

 

實作目標:
1.建立Guestbook物件,代表留言紀錄,物件內有三個protected屬性,分別是id,title,comment。
2.能夠以setId,setTitle,setComment方法直接設定Guestbook物件的id,title及comment屬性。
3.設定id,title,comment三個屬性外,無法設定其他屬性,確保Guestbook物件的屬性未被修改,能夠與資料表的欄位對應。
4.unset及isset物件屬性時能夠正確判斷,如果屬性並非內建的三個屬性,拋出例外訊息。

 

程式碼

#!/usr/bin/php
<?php
class Guestbook {
    protected $_id;
    protected $_title;
    protected $_comment;
    public function __set($key, $value) {
        $method = 'set' . ucfirst($key);
        if (method_exists($this, $method)) {
            $this->$method($value);
        } else {
            throw new Exception('Invalid property');
        }
    }
    public function __get($key) {
        $method = 'get' . ucfirst($key);
        if (method_exists($this, $method)) {
            return $this->$method();
        } else {
            throw new Exception('Invalid property');
        }
    }
    public function setOptions(array $options) {
        $methods = get_class_methods($this);
        foreach ($options as $key => $value) {
            $method = 'set' . ucfirst($key);
            if (in_array($method, $methods)) {
                $this->$method($value);
            }
        }
        return $this;
    }
    public function setId($id) {
        $this->_id = (int) $id;
        return $this;
    }
    public function getId() {
        return $this->_id;
    }
    public function setTitle($title) {
        $this->_title = $title;
        return $this;
    }
    public function getTitle() {
        return $this->_title;
    }
    public function setComment($comment) {
        $this->_comment = $comment;
        return $this;
    }
    public function getComment() {
        return $this->_comment;
    }
    public function __isset($key) {
        $value = $this->__get($key);
        return isset($value);
    }
    public function __unset($key) {
        $this->__set($key, null);
        return $this;
    }
}
$options = array(
    'id' => 3,
    'title' => 'title',
    'comment' => 'comment'
);
$g = new Guestbook();
$g->setOptions($options);
;
echo $g->id;
echo "\n";
echo isset($g->title);
echo "\n";

 

參考資料:
http://www.php.net/manual/en/language.oop5.overloading.php
http://framework.zend.com/manual/en/learning.quickstart.create-model.html

分類:PHP