Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
建议如何更懒散地设置php对象?_Php_Oop - Fatal编程技术网

建议如何更懒散地设置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函数,以使构造函数更具可读性。