1

假设在OOP(有益用途)中我想为购物卡上的物品创建账单,我将 Bill 对象传递给篮子的 handleInvoice() 函数(全部用 PHP 编写):

class Basket {
    // -- other code 

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

这里 Bill 类中不需要构造函数,因为目前不存在计费数据。

但是,如果我还想使用相同的 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

    }

}

现在我如何“告诉”程序在前一种情况下不应该执行构造函数,而在后一种情况下应该执行?

4

3 回答 3

1

我在条件__construct营。

public class Bill {

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

工厂模式也有效;new Bill只要你想打电话,你就不能偷懒。您需要调用特定于情况的方法。

于 2012-05-01T13:18:04.623 回答
0

PHP 不支持构造函数重载。所以你可以使用“工厂模式”。

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;
  }
}
于 2012-05-01T12:46:20.120 回答
0

构造函数应该只初始化变量,而不应该做任何“真正的工作”。
因为类的接口中的所有方法都应该是可测试的,并且不应该在接口中声明构造函数(否则该接口将无用)。
更多信息: http: //misko.hevery.com/code-reviewers-guide/flaw-constructor-does-real-work/

于 2012-05-01T13:32:56.690 回答