2012-05-01 2 views
1

Предполагая, что, как и в OOP (beneficial usage), что я хочу, чтобы создать счет для элементов на торговой карте я прохожу Bill-объект handleInvoice корзины в() - функция (все написано в PHP):Выполнение конструктор да/нет

class Basket { 
    // -- other code 

    public function handleInvoice(Bill $invoice) { 
     $invoice->chargeFor($this->items); 
     $invoice->chargeTo($this->account); 
     return $invoice->process(); 
    } 
} 

Здесь не требуется конструктор в классе Bill, так как до сих пор не существует биллинговых данных.

Но если я хочу использовать один и тот же класс, Билл также для управления ранее счетами-фактурой мне нужен конструктор, загрузив все данные счетов из базы данных:

class Bill { 
    private $date; 
    // --- other stuff 

    function __construct($bill_id) { 

     $result = mysql("select * from invoices where id = $bill_id"); 
     $this->date = $result['date']; 
     // --- other stuff 

    } 

} 

Как я могу «сказать» программу сейчас, что в прежний случай, когда конструктор не должен выполняться, а в дальнейшем он должен?

+0

Возможно иметь два разных конструктора. Тот, который принимает «$ bill_id», а другой - нет. Если для конструктора нет аргумента $ bill_id, вы знаете, что данных еще нет, и он будет использовать 'function __construct()', если есть аргумент $ bill_id, он будет использовать 'function __construct ($ bill_id)' – Prediluted

+1

или вы можете добавить простое условие в конструкторе – satin

+1

, к сожалению, это невозможно в PHP ... – Tom

ответ

0

PHP не поддерживает перегрузку конструктора. Таким образом, вы можете использовать «Factory Pattern».

public class Bill(){ 

    private function __construct(){ 
    //prevent new Bill() called from outside the class 
    } 

    public static function createEmptyBill(){ 
    return new Bill(); 
    } 

    public static function createBillFromData($bill_id){ 
    $bill = new Bill(); 
    //assign any var.. 
    return $bill; 
    } 
} 
+0

singleton is antipattern –

+0

Наличие частного конструктора не является одиночным. шаблон выше позволяет создавать несколько мгновений. вызов 'Bill :: createEmptyBill();' 10 раз, тогда вы получили 10 мгновений. – aifarfa

+0

, но у вас всегда будет один «экземпляр» класса Bill, и он приведет к скрытой зависимости ко всему вашему коду, где будет использоваться Bill ::. –

1

Я нахожусь в состоянии __construct лагерь.

public class Bill { 

    public function __construct($bill_id = ''){ 
     if (!empty($bill_id)) { 
      $result = ... 
     } 
    } 
} 

Заводская модель работает; вы просто не можете лениться с вызовом new Bill, когда захотите. Вам нужно будет вызвать метод, специфичный для ситуации.

0

Конструктор должен только инициализировать переменные и не должен выполнять «настоящую работу».
Поскольку все методы из интерфейса класса должны быть тестируемыми, а конструктор не должен быть объявлен в интерфейсе (или этот интерфейс будет бесполезен).
Дополнительная информация: http://misko.hevery.com/code-reviewers-guide/flaw-constructor-does-real-work/

Смежные вопросы