建议如何更懒散地设置php对象?
我是这样做的:建议如何更懒散地设置php对象?,php,oop,Php,Oop,我是这样做的: $aNewObject = new MyObj(); $aNewObject->set_id($row->id); $aNewObject->set_user_id($row->user_id); $aNewObject->set_title($row->title); $aNewObject->set_url($row->url); $aNewObject->set_description($row->descript
$aNewObject = new MyObj();
$aNewObject->set_id($row->id);
$aNewObject->set_user_id($row->user_id);
$aNewObject->set_title($row->title);
$aNewObject->set_url($row->url);
$aNewObject->set_description($row->description);
$aNewObject->set_status($row->status);
如您所见,我遵循一个名称约定,对象和数据库字段是100%匹配的,我认为应该有一种方法可以帮助我做得更懒,有什么建议吗?您可以通过只写
$aNewObject = new MyObj($row);
拥有一个基于
$row
内容设置对象属性的构造函数,只需编写
$aNewObject = new MyObj($row);
并且有一个根据
$row
的内容设置对象属性的构造函数,您可以通过迭代字段动态地进行设置(如果这意味着更懒):
这取决于你想把代码放在哪里。可以是内联的,作为MyObj
(importRow($row)
)函数的一部分,也可以是全局辅助函数,该函数始终调用与对象属性匹配的所有setter
在类构造函数中:
$aNewObject = new MyObj($row);
class MyObj
{
public function __construct($row = null)
{
...
$this->importRow($row);
}
public function importRow($row = null)
{
if (null === $row)
return;
foreach($row as $field => $value)
{
$setter = "set_{$field}";
$this->$setter($value);
}
}
...
}
为了防止不同类之间的代码重复(PHP<5.4中缺少traits支持),可以使用全局静态函数或对象:
$aNewObject = new MyObj();
new Setter($aNewObject, $row);
# or
$aNewObject = Setter::fill('MyObj', $row);
class Setter
{
private $object;
public function __construct($class, $data)
{
// works on classnames or objects
if (is_string($class))
$object = new $class();
else
$object = $class;
$this->object = $this->import($object, $data);
}
private function import($object, $data)
{
foreach($data as $field => $value)
{
$setter = "set_{$field}";
$object->$setter($value);
}
return $object;
}
public function getObject()
{
return $this->object;
}
public static function fill($class, $data)
{
$self = new __CLASS__($class, $data);
return $self->getObject();
}
}
您可以通过在字段上迭代来动态地进行设置(如果这意味着更懒惰): 这取决于你想把代码放在哪里。可以是内联的,作为
MyObj
(importRow($row)
)函数的一部分,也可以是全局辅助函数,该函数始终调用与对象属性匹配的所有setter
在类构造函数中:
$aNewObject = new MyObj($row);
class MyObj
{
public function __construct($row = null)
{
...
$this->importRow($row);
}
public function importRow($row = null)
{
if (null === $row)
return;
foreach($row as $field => $value)
{
$setter = "set_{$field}";
$this->$setter($value);
}
}
...
}
为了防止不同类之间的代码重复(PHP<5.4中缺少traits支持),可以使用全局静态函数或对象:
$aNewObject = new MyObj();
new Setter($aNewObject, $row);
# or
$aNewObject = Setter::fill('MyObj', $row);
class Setter
{
private $object;
public function __construct($class, $data)
{
// works on classnames or objects
if (is_string($class))
$object = new $class();
else
$object = $class;
$this->object = $this->import($object, $data);
}
private function import($object, $data)
{
foreach($data as $field => $value)
{
$setter = "set_{$field}";
$object->$setter($value);
}
return $object;
}
public function getObject()
{
return $this->object;
}
public static function fill($class, $data)
{
$self = new __CLASS__($class, $data);
return $self->getObject();
}
}
不建议使用更懒惰的方法,因为这会使其他程序员难以维护 如果您仍想这样做,则应使用PHP reflaction:http://www.php.net/manual/en/intro.reflection.php
或者,正如@hakre回答的那样,不建议使用它,因为它会使其他程序员难以维护 如果您仍想这样做,则应使用PHP reflaction:http://www.php.net/manual/en/intro.reflection.php
或者正如@hakre所回答的那样你说的懒惰是什么意思?不要打字那么多?你说的懒惰是什么意思?不打那么多?是不是很难维持?你的意思是,通过手动设置它更容易维护?通过“Magic”发生的事情会让其他程序员更难理解。这并不是那么糟糕,但在设计它时你应该三思而后行。这是一个正确的观点。如果您的代码中有动态解决问题的神奇线索,那么在调试过程中跟踪可能会更困难。如果你进行了大量的调试,你以后就不会更懒了:)但是ppl总是说要干代码,如果我手动干的话,这似乎有点违背这个想法。是不是很难维护?你的意思是,通过手动设置它更容易维护?通过“Magic”发生的事情会让其他程序员更难理解。这并不是那么糟糕,但在设计它时你应该三思而后行。这是一个正确的观点。如果您的代码中有动态解决问题的神奇线索,那么在调试过程中跟踪可能会更困难。如果你进行了大量的调试,你以后就不会懒惰了:)但是ppl总是说要干燥代码,如果我手动这么做,这似乎与这个想法有一些冲突。对此的额外调整可以是:构造函数可以接受$row作为数组,直接使用数组的内容,或者接受一个ID从数据库中获取数据并从数据库中加载内容。它们应该只初始化新对象,不应该包含太多代码。不要过度使用构造函数。@hakre正在看他正在编写的代码,它只是一个复制构造函数,这是一个非常标准的构造函数。@Dan:是的,更多的是指建议在构造函数中放置数据库访问权限的注释。对于复制,我建议在对象中使用一个helper函数,以使构造函数更具可读性。这方面的其他调整可以是:构造函数可以接受$row作为数组直接使用数组的内容,或者接受ID从数据库获取数据并从数据库加载内容。只是说:你应该简化构造函数,不复杂。它们应该只初始化新对象,不应该包含太多代码。不要过度使用构造函数。@hakre正在看他正在编写的代码,它只是一个复制构造函数,这是一个非常标准的构造函数。@Dan:是的,更多的是指建议在构造函数中放置数据库访问权限的注释。对于复制,我建议在对象中使用helper函数,以使构造函数更具可读性。