Вызов другого конструктора из конструктора в PHP
Я хочу несколько конструкторов, определенных в классе PHP. Тем не менее, мой код для конструкторов в настоящее время очень похож. Я бы не стал повторять код, если это возможно. Есть ли способ вызвать другие конструкторы из одного конструктора в классе php? Есть ли способ иметь несколько конструкторов в классе PHP?
function __construct($service, $action)
{
if(empty($service) || empty($action))
{
throw new Exception("Both service and action must have a value");
}
$this->$mService = $service;
$this->$mAction = $action;
$this->$mHasSecurity = false;
}
function __construct($service, $action, $security)
{
__construct($service, $action); // This is what I want to be able to do, so I don't have to repeat code
if(!empty($security))
{
$this->$mHasSecurity = true;
$this->$mSecurity = $security;
}
}
Я знаю, что мог бы решить эту проблему, создав, например, некоторые методы Init. Но есть ли способ обойти это?
2 ответа
Решение
Вы не можете перегружать такие функции в PHP. Если вы делаете это:
class A {
public function __construct() { }
public function __construct($a, $b) { }
}
ваш код не скомпилируется с ошибкой, которую вы не можете переопределить __construct()
,
Способ сделать это с необязательными аргументами.
function __construct($service, $action, $security = '') {
if (empty($service) || empty($action)) {
throw new Exception("Both service and action must have a value");
}
$this->$mService = $service;
$this->$mAction = $action;
$this->$mHasSecurity = false;
if (!empty($security)) {
$this->$mHasSecurity = true;
$this->$mSecurity = $security;
}
}
И если вам действительно нужны совершенно разные аргументы, используйте шаблон Factory.
class Car {
public static function createCarWithDoors($intNumDoors) {
$objCar = new Car();
$objCar->intDoors = $intNumDoors;
return $objCar;
}
public static function createCarWithHorsepower($intHorsepower) {
$objCar = new Car();
$objCar->intHorses = $intHorsepower;
return $objCar;
}
}
$objFirst = Car::createCarWithDoors(3);
$objSecond = Car::createCarWithHorsePower(200);