PHP OOP:使用构造来创建新记录

时间:2012-01-02 19:10:18

标签: php

我应该使用__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行为来创建。另外,你能给我一个如何创建/查找的例子吗?

谢谢!

4 个答案:

答案 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)

如果类本身的目的是操作,那么在构造函数中执行一些操作是很好的。换句话说,当需要从该类中执行任何操作时,在您的情况下需要在数据库中插入...

因此,如果你的类的独奏目的是在数据库中插入数据,那就去做..为这个定义一个函数......:)