2013-08-30 93 views
1

考慮下面的類PHP方法鏈接:允許其他方法之前調用一個方法,要鏈接

class myClass { 

    private $model; 

    public function update($input) { 
     return $this->model->update($input); 
    } 

    public function find($id) { 
     $this->model = ORMfind($id); 
    } 
} 

如何防止

$myClass = new myClass; 
$myClass->update($input); 

的問題不是如何使用上面的代碼但如何使update()方法僅在find()後可調用。

編輯:我改變什麼我的方法這樣做,這是更清楚地理解,我需要在另一個之前做的一個方法(找到())(更新())

+2

呀,不要濫用國家那樣。如果你離開班級,問題就會消失。這通常是更好的處理方式...... – ircmaxell

回答

1

要通過get命令返回空值阻止:

public function get() { 
    if (isset($this->value)) return $this->value; 
    else echo "please give me a value "; 

} 

您還可以創建一個結構:

function __construct($val){ 
    $this->value=$val; 
} 

,然後給一個價值,你的$value不使用set()方法:

$myClass=new myClass(10); 
2

你可以標記添加到您的代碼如下所示:

class myClass { 

    private $model; 
    private $canUpdate = 0; 

    public function update($input) { 
    if ($canUpdate === 0) return; // or throw an exception here 
    return $this->model->update($input); 
    } 

    public function find($id) { 
    $this->model = ORMfind($id); 
    $canUpdate = 1; 
    } 

}

設置標誌$canUpdate會告誡update()方法做出相應的反應。如果調用update(),則可以拋出異常或退出該方法,如果該標誌仍爲0.

0

輸出文本,返回void,我認爲所有這些都是錯誤的。如果你不希望事情發生,你應該拋出一個異常:

class MyClass { 
    private $canUpdate = false; 

    public function find($id) { 
     // some code... 
     $this->canUpdate = true; 
    } 

    public function canUpdate() { 
     return $this->canUpdate; 
    } 

    private function testCanUpdate() { 
     if (!$this->canUpdate()) { 
      throw new Exception('You cannot update'); 
     } 
    } 

    public function update($inpjut) { 
     $this->testCanUpdate(); 

     // ... some code 
    } 
} 

現在你可以這樣做:

$obj = new MyClass(); 

try { 
    $obj->update($input); 
} catch (Exception $e) { 
    $obj->find($id); 
    $obj->update($input); 
} 
0

的正確方法,以確保->update()只能被稱爲當模特已經初始化是把它變成一個依賴性:

class myClass 
{ 
    private $model; 

    public function __construct($id) 
    { 
     $this->model = ORMfind($id); 
    } 

    public function update($input) { 
     return $this->model->update($input); 
    } 
} 

$x = new myClass('123'); 

或者,如果您有多個查找操作,你可以介紹他們爲靜態構造方法:

class myClass 
{ 
    private $model; 

    private function __construct($model) 
    { 
     $this->model = $model; 
    } 

    public function update($input) { 
     return $this->model->update($input); 
    } 

    public static function find($id) 
    { 
     return new self(ORMfind($id)); 
    } 
} 

$x = myClass::find('123'); 

更新

搶斷立即解決問題可以通過一個簡單的檢查來完成:

public function update($input) { 
     return $this->model ? $this->model->update($input) : null; 
    }