2012-01-02 43 views
0

我應該使用__construct選項創建新記錄嗎?以下是我稱之爲「課程」的課程。我只會在25%的時間內「創造」一個課程,剩下的時間我會想要查找課程,而不是什麼。PHP OOP:使用構造創建新記錄

class Course { 
    private $db; 

    function __construct($db, $data) { 
     global $error, $mysqli; 

     $this->db = $db; 

     requireOrError($data['course_type_id'], "Course Type Required"); 
     requireOrError($data['instructor_id'], "Instructor Required"); 
     requireOrError($data['dz_name'], "DZ Name Required"); 
     requireOrError($data['dz_address'], "DZ Address Required"); 
     requireOrError($data['dz_city'], "DZ City Required"); 
     requireOrError($data['dz_state'], "DZ State Required"); 
     requireOrError($data['dz_zip'], "DZ Zip Required"); 
     requireOrError($data['dz_email'], "DZ Email Required");  
     requireOrError($data['start_date'], "Course Start Date Required"); 
     requireOrError($data['end_date'], "Course End Date Required"); 
     requireOrError($data['student_slots'], "Number Of Student Slots Required"); 

     if(! is_numeric($data['student_slots'])) { 
      $error[] = "Invalid Student Slots - Must be a number"; 
     } 

     setError($error); 

     if(empty($error)) { 
      $add = $mysqli->query("INSERT INTO " . $this->db['courses'] . " (course_type_id, instructor_id, dz_name, dz_address, dz_city, dz_state, dz_zip, dz_email, start_date, end_date, student_slots, notes) VALUES ('$data[course_type_id]', '$data[instructor_id]', '$data[dz_name]', '$data[dz_address]', '$data[dz_city]', '$data[dz_state]', '$data[dz_zip]', '$data[dz_email]', '$data[start_date]', '$data[end_date]', '$data[student_slots]', '$data[notes]')"); 
      redirectTo("instructors.php"); 
     } 
    } 
} 

我打算創建一個名爲「getCourseInfo」的函數,我可以傳遞一個ID並返回課程對象。這是做這件事的最好方式,或者,我應該改變__construct行爲來創建。另外,你能否給我一個我將如何創建/查找的例子?

謝謝!

+0

這是太忙了一個構造函數,並假定你總是想要插入一條記錄。爲什麼不簡單地讓構造函數做一些基本的設置,然後提供「createRecord」和「validateData」方法? – 2012-01-02 19:11:49

回答

1

不。你應該有一個單獨的方法來創建一個記錄您要麼將參數作爲函數參數傳遞,要麼作爲數組傳遞。例如:

<?php 
class Course { 

    protected $db;  

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

    public function fetchById($id) { 
     // perform database query; look-up on ID 
    } 

    public function create($data) { 
     // validate your $data 
     // create your record 
     // return either boolean true or the ID of the newly-created record 
     // and errors, either return boolean false or throw an exception 
    } 
} 

然後,您可以使用你的類如下:

<?php 

// create PDO instance in $pdo variable 

$course = new Course($pdo); 

$data = array(
    'course_type_id' => $_POST['course_type_id'], 
    'instructor_id' => $_POST['instructor_id'], 
    // and so on... 
); 

if ($course->create($data)) { 
    echo 'Course created.'; 
} 
else { 
    echo 'Error creating course.'; 
} 

確保逃生和消毒任何發佈的數據。

2

編號構造函數的主要目的是使新創建的對象進入穩定狀態。它應該從來沒有「做」任何事情。

-1

做在構造函數中的一些操作是一件好事,如果類本身的目的是operation..in換句話說,當從該類需要任何功能,在數據庫中的情況下,插入需...

所以,如果你班級的獨奏目的是將數據插入到數據庫中,那麼做... ..爲相同的定義一個功能... :)

1

我寧願將創建功能留在構造函數之外,因爲它的目的應該是建立對象的存在......而不是執行一堆切向操作。

$obj = new Course; 
$obj->setDb($db)->setData($data); 

如果

此外,你可以通過返回的setter方法$this(這幾乎完全無效的虛假「代碼縮短效率」從填充在構造對象的屬性收益)實現方法鏈接做實現了一個__construct(),它允許你快捷地使用其他對象方法,你至少應該爲參數定義默認值。允許默認的NULL值將顯着提高代碼的可測試性。

所以,如果你沒有傳遞參數給構造它看起來應該像下面......雖然你可能不應該

class Course { 

    private $db; 

    private $data; 

    function __construct($db=NULL, $data=NULL) 
    { 
    if ($db) { 
     $this->setDb($db); 
    } 
    if ($data) { 
     $this->setData($data); 
    } 
    } 

    function setDb(DbConn $db) 
    { 
    $this->db = $db; 
    return $this; 
    } 

    function setData($data) 
    { 
    if ($data !== (string)$data) { 
     throw new InvalidArgumentException('data argument must be a string'); 
    } 
    $this->data = $data; 
    return $this; 
    } 
}