2017-06-14 69 views
0

我想知道,如果是一個很好的做法來聲明像一個對象的屬性:聲明一個對象的屬性了__construct功能

$this->name = $name; 

出功能__construct

我想用數據庫表中的數據構建一個對象。但是這個對象只會在註冊時生成。我知道__construct函數總是返回一個對象,所以我不能得到一個錯誤的回報。所以我嘗試了以下方法:

//test.php 

$mod = new item($id); 
if($mod->validate()) { 
$item = $mod; 
} 

class item { 

    protected $id; 
    public function __construct($id) { 
     $this->id = $id; 
    } 

public function validate() { 

     $db = new db('restaurants_items_modifiers'); 

     if($mod = $db->get($this->id)) { 
      $this->price = $mod['price']; 
      $this->name = $mod['name']; 
      $this->desc = $mod['desc']; 
      return true; 
     } else { 
      return false; 
     } 

    } 
} 

這樣做會很有效,但是這樣做是一種很好的做法嗎?或者我應該聲明__construct函數中的所有內容?

+0

我會做的一個改變是注入數據庫連接,而不是在'validate()'方法內部進行。 – Rasclatt

+0

這很好。你可以在這裏看到更多的問題[函數__construct用於什麼?](https://stackoverflow.com/questions/455910/what-is-the-function-construct-used-for) – lgflorentino

+0

此外,它可能更有意義的是將db注入'__construct($ db)'和'$ id'到'validate($ id)' – Rasclatt

回答

1

做你正在做的事情是好的,但我認爲注入數據庫到構造和id到驗證更有意義。創建setId()也可能有價值:

class item 
    { 
     protected $id, 
        $db; 
     # Inject the $db instead 
     public function __construct(db $db) 
      { 
       $this->db = $db; 
      } 
     # Inject the id here 
     public function validate($id = false) 
      { 
       if(!empty($id)) 
        $this->id = $id; 

       if($mod = $this->db->get($this->getId())) { 
        $this->price = $mod['price']; 
        $this->name = $mod['name']; 
        $this->desc = $mod['desc']; 
        return true; 
       } else { 
        return false; 
       } 
      } 
     # Create a method that can assign so you can reused the object 
     public function setId($id) 
      { 
       $this->id = $id; 
       # Return the object for chaining 
       return $this; 
      } 
     # Have a method to get current id 
     public function getId() 
      { 
       return $this->id; 
      } 
    } 

# Create instance, inject db class 
$mod = new item(new db('restaurants_items_modifiers')); 
# Inject the id here 
if($mod->validate($id)) { 
    $item = $mod; 
} 

您也可以重置這樣做的id。他們基本上是在做同樣的注入validate()但它取決於你多麼想能夠訪問$id上下行(也許private將其從直接訪問鎖定它關閉可能需要):

$mod->setId($id)->validate(); 
+0

這真棒對我來說有很多意義......我需要學習更多關於這個注射部分,但我一定會按照你的建議 –