我应该使用__construct选项来创建新记录吗?以下是我称之为“课程”的课程。我只会在25%的时间里“创造”一门课程,剩下的时间我会想要查找课程而不是。
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 :(得分:2)
没有。构造函数的主要目的是使新创建的对象进入稳定状态。它应该从不“做”任何事情。
答案 1 :(得分: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)
我更喜欢将创建功能保留在构造函数之外,因为它的目的应该是建立对象的存在......而不是执行一堆切向操作。
此外,您可以通过在setter方法中返回$this
来实现方法链接(这几乎完全使构造函数中填充对象属性的人造“代码缩短效率”增益无效):
$obj = new Course;
$obj->setDb($db)->setData($data);
如果你做实现一个__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;
}
}
答案 3 :(得分:-1)
如果类本身的目的是操作,那么在构造函数中执行一些操作是很好的。换句话说,当需要从该类中执行任何操作时,在您的情况下需要在数据库中插入...
因此,如果你的类的独奏目的是在数据库中插入数据,那就去做..为这个定义一个函数......:)