PHP类的load()方法好/坏做法?

时间:2013-12-02 20:56:19

标签: php oop

只是想知道你是否可以对最佳做法有所了解?

在Class中使用load方法是正确/最好的方法吗?

Class Test extends Foo{

    public $id;
    public $name;

    public function __construct()
    {
        parent::__construct();

    }

    public function load($id, $name)
    {
        $this->id = $id;
        $this->name = $name;
    }
}

或者,如果在构造函数中使用加载方法逻辑,是否会更好地理解?

Class Test extends Foo{

    public $id;
    public $name;

    public function __construct($id, $name)
    {
        parent::__construct();

        $this->id = $id;
        $this->name = $name;
    }
}

第二个选项对我来说似乎更合乎逻辑,因为它是一个较少的方法而且它被自动调用等,但是,我更经常地看到第一个选项。是否有一个原因?任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:3)

第二种选择是最好的。构造函数旨在准备要使用的对象。它是初始化属性等的理想场所。除非你有充分的理由使用load()而不是构造函数,否则请使用第二个例子。

答案 1 :(得分:1)

我想,第一个选项使用稍微抽象。

我可以看到您可能需要复制代码并将变量赋值分离为load()init()函数的情况,这可能会使您的代码更容易更新以用于新目的。

答案 2 :(得分:0)

第一个选项的优点是您不需要开发人员立即提供信息。虽然它更容易出错,因为人们可能会忘记调用load函数。如果所有其他函数都需要设置$ id和$ name,则最好在创建新对象时要求参数。

另一方面,没有加载功能会阻止您稍后在代码中使用新值重新加载对象。

您可以通过从构造函数调用load函数来组合这两者:

Class Test extends Foo{

    public $id;
    public $name;

    public function __construct( $id, $name )
    {
        parent::__construct();
        $this->load( $id, $name );
    }

    public function load($id, $name)
    {
        $this->id = $id;
        $this->name = $name;
    }
}

如果你不需要在创建时设置值,你可以使用PHP的时髦函数重载:

Class Test extends Foo{

    public $id;
    public $name;

    public function __construct()
    {
        parent::__construct();
        if( func_num_args() === 2 ){
            call_user_func_array(array($this, 'load'), func_get_args() );
        }
    }

    public function load($id, $name)
    {
        $this->id = $id;
        $this->name = $name;
    }
}

答案 3 :(得分:-2)

您可以扩展每个特定成员的load()。

使每个属性受保护或私有,并为其中一个提供set / get函数。 这是一种可接受的方式,有时比使用依赖项和逻辑重载构造函数更好。

试试这个,看看它是否对你有帮助:

    Class Test extends Foo{

    protected $id;
    protected $name;

    public function __construct()
    {
        parent::__construct();
    }

    public function setId($id) {
        $this->id = $id;
    }

    public function setName($name) {
        $this->name = $name;
    }

    public function getId() {
        return $this->id;
    }

    public function getName() {
        return $this->name;
    }
}

它被称为getter和setter,它是一种更干净,更健壮的方法。

此外,正如其他答案所述 - 它提供了更好的可重用性,能够使用空值让对象清理数据,但这完全取决于您的类的意图!