tom*_*tom 96 php oop constructor overloading
我已经放弃了所有希望能够在PHP中重载我的构造函数,所以我真正想知道的是为什么.
有没有理由呢?它是否会产生固有的错误代码?它是否被广泛接受的语言设计不允许它,或者其他语言比PHP更好?
Ale*_*ein 132
你不能在PHP中重载任何方法.如果希望能够在传递几个不同的参数组合时实例化PHP对象,请将工厂模式与私有构造函数一起使用.
例如:
public MyClass {
private function __construct() {
...
}
public static function makeNewWithParameterA($paramA) {
$obj = new MyClass();
// other initialization
return $obj;
}
public static function makeNewWithParametersBandC($paramB, $paramC) {
$obj = new MyClass();
// other initialization
return $obj;
}
}
$myObject = MyClass::makeNewWithParameterA("foo");
$anotherObject = MyClass::makeNewWithParametersBandC("bar", 3);
Run Code Online (Sandbox Code Playgroud)
为了完整起见,我建议使用Fluent接口。这个想法是,通过return $this;在方法的末尾添加代码,可以将调用链接在一起。所以代替
$car1 = new Car('blue', 'RWD');
$car2 = new Car('Ford', '300hp');
Run Code Online (Sandbox Code Playgroud)
(这根本行不通),您可以执行以下操作:
$car = (new Car)
->setColor('blue')
->setMake('Ford')
->setDrive('FWD');
Run Code Online (Sandbox Code Playgroud)
这样,您可以准确选择要设置的属性。在很多方面,这类似于将一系列选项传递给您的初始调用:
$car = new Car(['make' => 'Ford', 'seats' => 5]);
Run Code Online (Sandbox Code Playgroud)
我只是通过使用函数参数的默认值来克服这个问题。在 中__constuct,首先列出所需的参数。在一般形式之后列出可选参数$param = null。
class User
{
private $db;
private $userInput;
public function __construct(Database $db, array $userInput = null)
{
$this->db = $db;
$this->userInput = $userInput;
}
}
Run Code Online (Sandbox Code Playgroud)
这可以实例化为:
$user = new User($db)
Run Code Online (Sandbox Code Playgroud)
或者
$user = new User($db, $inputArray);
Run Code Online (Sandbox Code Playgroud)
这不是一个完美的解决方案,但我已经通过将参数分成绝对强制参数来完成这项工作,无论对象何时构造,并且作为一个组,按重要性顺序列出可选参数。
有用。