只是想知道你是否可以对最佳做法有所了解?
在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;
}
}
第二个选项对我来说似乎更合乎逻辑,因为它是一个较少的方法而且它被自动调用等,但是,我更经常地看到第一个选项。是否有一个原因?任何帮助将不胜感激!
答案 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,它是一种更干净,更健壮的方法。
此外,正如其他答案所述 - 它提供了更好的可重用性,能够使用空值让对象清理数据,但这完全取决于您的类的意图!