'我对处理类属性的最佳方法有疑问。
为了便于解释,假设我有一个叫做公司的课程。 “公司”有单一的财产,如“名称”,“地址”等。除了这些单一的财产,“公司”还有多个员工,多个办事处,&多台咖啡机。 (不好的例子,但我能想到的最好)。
初始化类时,我可以在构造函数方法中运行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'];
}
}
}
对于它的价值,我怀疑后者,但可以使用其他意见。
由于
答案 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());
?>
哪些好处?员工的行为大于检索公司的信息。它本身就是一个实体。那么,为什么要将它的逻辑扩展到你的代码?将逻辑保留在自己的类中,如果其他类需要它,只需使用。请注意,公司有一种方法来检索其员工。但公司没有理由得到它。
如果您不需要,仍然无法加载员工。当需要员工时,请做出决定,并在需要时加载它。
当然,我用你的例子引导我完成答案。但这种方法可以扩展到您的所有需求。