Вызов другого конструктора из конструктора в PHP - PullRequest
3 голосов
/ 11 ноября 2009

Я хочу несколько конструкторов, определенных в классе 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 ]

5 голосов
/ 11 ноября 2009

Вы не можете перегружать подобные функции в 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;
  }
}
3 голосов
/ 11 ноября 2009

А если вам действительно нужны совершенно разные аргументы, используйте шаблон 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...