2013-08-30 3 views
1

Рассмотрим следующий классPHP Метод Chaining: Вызов один метод, прежде чем разрешить другие методы, чтобы быть прикован

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().

EDIT: Я изменил то, что мой метод не так это было более понятно, что мне нужно сделать один метод (найти()) перед другим (обновление())

+2

Да, не злоупотребляйте состояние, как это. Проблема исчезает, если вы покинете штат из своего класса. Как правило, это лучший способ обработки ... – ircmaxell

ответ

1

Для предотвращения возвращения нулевого значения, получит:

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

Вывод текста, возвращающий пустоту, я думаю, все это неправильно. Когда вы не ожидаете, что-то случится, вы должны бросить исключение:

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'); 

Update

Tackling ваша ближайшая задача может быть сделано путем простой проверки:

public function update($input) { 
     return $this->model ? $this->model->update($input) : null; 
    } 
Смежные вопросы