2013-09-26 127 views
2

不知道這是否甚至是一個問題。我對受保護/私有財產和方法的理解是,他們只能在課堂上進行訪問。我有一個靜態方法,這是一種將對象保存到數據庫的快速方法。我通過靜態方法創建對象並通過setter函數設置屬性。然而,一個屬性沒有setter,但我仍然可以訪問它。我有一個類,它看起來是這樣的:PHP從靜態方法訪問對象的受保護屬性

class Person { 

    protected $name; 
    protected $email; 
    protected $created; 

    //set name 
    public function set_name($name) { 
     $this->name = $name; 
    } 

    //set email 
    public function set_email($email) { 
     $this->email = $email; 
    } 

    //add new person 
    static function add($data) { 

     $person = new Person; 
     $person->set_name($data['name']); 
     $person->set_email($data['email']); 

     //set created date 
     $person->created = date('Y-m-d h:ia', time()); 

     //save to db 
     $db->add($data); 

     return $person; 

    } 

} 

實施看起來是這樣的:

$person = Person::add(array(
    'name' => 'Bob Barker', 
    'email' => '[email protected]' 
)); 

此代碼的工作。通過作品我的意思是創建日期成功設置。爲什麼?

+0

不是你的'add'方法是寫另一個構造函數的方法嗎? – Barmar

+0

當然。只是一種不同的方法。該類在整個應用程序中有更多的用途,所以我選擇將我的方法保存到DB中。 – Chris

回答

1

受保護的屬性可以通過類內的代碼進行修改,而不僅僅是來自該類的實例。

+0

即使這個方法是靜態的嗎?這看起來像一個bug。 – Chris

+1

如果你認爲封裝的意義在於對類的數據進行操作的所有邏輯都在類本身之內,這是有道理的。靜態方法仍然在類中定義,我們可以假設一個班級知道如何在自己的實例上進行操作,那是我的反應。 –

0

因爲你在課堂上設置它。這些設置器通常用於設置來自類外部的變量,如Person :: set_name('Bob Barker')。但是如果你嘗試過Person-> created = date(),它會失敗。

+0

我同意。它應該失敗。它不是。我可以在靜態方法中成功設置對象的創建屬性。 – Chris

+0

不,靜態方法在類中,所以它可以訪問類中的變量。這些變量只能從類的外部訪問。 Person-> created I引用將來自類之外的實現,在$ person = Person :: add之下(array(...行 – aynber

+0

好吧,我誤解了你,有道理。 – Chris

相關問題