课程的最佳实践

时间:2013-05-13 23:46:17

标签: php class constructor

'我对处理类属性的最佳方法有疑问。

为了便于解释,假设我有一个叫做公司的课程。 “公司”有单一的财产,如“名称”,“地址”等。除了这些单一的财产,“公司”还有多个员工,多个办事处,&多台咖啡机。 (不好的例子,但我能想到的最好)。

初始化类时,我可以在构造函数方法中运行SQL查询以检索名称,地址等。但是,“Employees”,“Offices”和“Coffee Machines”都存储在单独的数据库表中,并且返回多个结果,立即设置我需要再运行三个SQL查询的属性。

这是最好的方法吗,或者最好的做法是创建三种方法“getEmployees”,“getOffices”& “getCoffeeMachines”并在需要时运行查询?

不确定是否清楚。这是两个例子。最好这样做,从而在初始化时调用四个SQL查询,以便所有信息立即可用:

Class Company
{
    private $name;
    private $address;
    private $employees;
    private $offices;
    private $coffeeMachines;

    public function __construct()
    {
        $this->employees = array();
        $this->offices = array();
        $this->coffeeMachines = array();

        ... SQL to get name and address ...
        $this->name = $rs['name'];
        $this->address = $rs['address'];

        ... SQL to get employees ...
        while ($rs = mysql_fetch_array)
        {
            $this->employees[$rs['id']] = $rs['name'];
        }

        ... SQL to get offices ...
        while ($rs = mysql_fetch_array)
        {
            $this->offices[$rs['id']] = $rs['office'];
        }

        ... SQL to get coffee machines ...
        while ($rs = mysql_fetch_array)
        {
            $this->coffeeMachines[$rs['id']] = $rs['coffeeMachine'];
        }
    }
}

或者最好这样做,只在初始化时运行一个SQL查询并在需要时运行未来的查询

Class Company
{
    private $name;
    private $address;
    private $employees;
    private $offices;
    private $coffeeMachines;

    public function __construct()
    {
        ... SQL to get name and address ...
        $this->name = $rs['name'];
        $this->address = $rs['address'];
    }

    public function getEmployees()
    {
        ... SQL to get employees ...
        while ($rs = mysql_fetch_array)
        {
            $this->employees[$rs['id']] = $rs['name'];
        }
    }

    public function getOffices()
    {
        ... SQL to get offices ...
        while ($rs = mysql_fetch_array)
        {
            $this->offices[$rs['id']] = $rs['office'];
        }
    }

    public function getCoffeeMachines()
    {
        ... SQL to get coffee machines ...
        while ($rs = mysql_fetch_array)
        {
            $this->coffeeMachines[$rs['id']] = $rs['coffeeMachine'];
        }
    }
}

对于它的价值,我怀疑后者,但可以使用其他意见。

由于

4 个答案:

答案 0 :(得分:0)

我认为这是偏好和表现的问题。如果您可以阅读具有可接受的启动性能的子集合,则可以选择这样做。延迟初始化将在开始时加载更快,但您需要防止尝试多次填充集合。

答案 1 :(得分:0)

我认为在需要时运行查询是最好的方法,这将使代码比第一种方法更易读和易懂。第二种方法也很容易修改。

答案 2 :(得分:0)

这取决于您的需求。

$company = new Company();
$company->addOffice();
$company->getOffices();

此代码将在每种方式上产生不同的结果。延迟加载是一种很好的做法。

答案 3 :(得分:0)

当我面对这样的情况时,我更喜欢将对象分开。所以,我不会查询公司类内部员工的数据。我会有一个员工实例,该实例将被定义为:

company.php

<?php
require_once "employee.php";
class company{
    protected $employee;
    protected $company_name;
    protected $company_id;
    function company($id_company,$employee=null){
        if($employee){
            {
                $this->employee = $employee;
            }
            //setting company methods values. Here I have the company query
            //...
        }
    }
    function get_company_employees(){
        if($this->employee){
            return $this->employee->get_employees_by_company_id($this->company_id);
        }else{
            //throw same exception
        }
    }

}

employee.php

 <?php
class employee{
    //employee class attribs
    function employee($employee_id=null){
        if($employee_id){
            //load data from db to class attribs. Here I have a query to get one employee
        }
    }
    function get_employees_by_company_id($company_id){
        //select employees from db and populate collection to return. Here I have a query to return employees from one company
        return array();
    }
}

所以,当我需要公司与员工,我会这样做:

<?php
    require_once "company.php";
    require_once "employee.php";
    $comp_id = 1; 
    $company = new company($comp_id, new employee);
    print_r($company->get_company_employees());

?>

哪些好处?员工的行为大于检索公司的信息。它本身就是一个实体。那么,为什么要将它的逻辑扩展到你的代码?将逻辑保留在自己的类中,如果其他类需要它,只需使用。请注意,公司有一种方法来检索其员工。但公司没有理由得到它。

如果您不需要,仍然无法加载员工。当需要员工时,请做出决定,并在需要时加载它。

当然,我用你的例子引导我完成答案。但这种方法可以扩展到您的所有需求。