2011-10-23 4 views
4

메서드 체인을 사용하는 유효성 검사 클래스가 있습니다. 이 같은체인 방법을 사용할 때 false를 반환하는 방법

또한
if ($obj->checkSomething()) {} 

그러나 체인 방법 : :이 같은 TRUE/FALSE와 함께 하나의 검사를 할 수 있도록하고 싶습니다

if ($obj->checkSomething()->checkSomethingElse()) {} 
하나 개의 방법이 FALSE을 반환하는 경우

문제는 그러나 즉, 그것은하지 않습니다 객체를 다시 보내면이 오류로 끝나는 메소드 연결이 끊어집니다.

Fatal error: Call to a member function checkSomething() on a non-object in ... 

하나의 메소드 return ca lls 또는 메소드 체인 또는 해결 방법이 있습니까?

+2

이것은 메서드 체이닝을 사용하지 말아야하는 이유를 나타내는 좋은 표기입니다. – NikiC

답변

8

하나의 아이디어는 성공 또는 실패를 나타내는 내부 플래그를 설정하고 다른 메소드를 통해 액세스하는 것입니다. 각 메소드에서 해당 플래그를 확인하고 설정되면 아무 것도하지 않습니다. 예컨대 :

class A { 
    private $valid = true; 

    public function check1() { 
     if (!$this->valid) { 
      return $this; 
     } 
     if (!/* do actual checking here */) { 
      $this->valid = false; 
     } 
     return $this; 
    } 
    public function check2() { 
     if (!$this->valid) { 
      return $this; 
     } 
     if (!/* do actual checking here */) { 
      $this->valid = false; 
     } 
     return $this; 
    } 
    public function isValid() { 
     return $this->valid; 
    } 
} 

// usage: 

$a = new A(); 

if (!$a->check1()->check2()->isValid()) { 
    echo "error"; 
} 

은 각 기능에 체크 상용구를 최소화하기 위해, 당신은 또한 마법의 방법 __call()를 사용할 수 있습니다. 예컨대 :

class A { 
    private $valid; 
    public function __call($name, $args) { 
     if ($this->valid) { 
      $this->valid = call_user_func_array("do" . $name, $args); 
     } 
     return $this; 
    } 
    private function docheck1() { 
     return /* do actual checking here, return true or false */; 
    } 
    private function docheck2() { 
     return /* do actual checking here, return true or false */; 
    } 
    public isValid() { 
     return $this->valid; 
    }  
} 

사용법은 상기와 같은 것이다 :

$a = new A(); 

if (!$a->check1()->check2()->isValid()) { 
    echo "error"; 
} 
+0

+1은 저를 때리려 고합니다. –

+0

이 문제에 대해 생각해 보았지만 아마도 문제를 해결할 수있는 더 쉬운 방법이되기를 바랍니다. 일부 PHP 전문가가 쉬운 해결책을 제시하는지 확인합니다. 그렇지 않으면 대답이 받아 들여집니다. 감사! – Seralize

1

내가 평가는 인스턴스를 가지고 찾고 믿고 검증의 결과에 따라 허위/참으로.

일부 언어에서는 인스턴스의 부울 값을 재정의 할 수 있지만 php는 문자열에 캐스팅하는 경우를 제외하고는 PHP의 을 참조하십시오.

또한 PHP 설명서의 the booleans page에는 false로 평가되는 목록이 있지만 동작을 재정의하는 방법도 제공하지 않습니다.

그렇다면 JRL의 아이디어로 가서 유효성 검사 규칙 체인을 만든 다음 if 문에 필요한 부울을 반환하는 함수로 '실행'하십시오.

0

아마도 하위 클래스로 묶을 수 있습니다.

당신이

class Validate { 
    public function checkSomething($data) { 
     if ($data === $valid) { 
      return true; 
     } 
     return false; 
    } 
    public function checkSomethingElse($data) { 
     if ($data === $valid) { 
      return true; 
     } 
     return false; 
    } 
} 

이있는 경우이 작업을 수행 할 수 있습니다 :

class ValidateChain extends Validate { 
    protected $valid = true; 

    public function checkSomething($data) { 
     if (false === parent::checkSomething($data)) { 
      $this->valid = false; 
     } 
     return $this; 
    } 
    public function checkSomethingElse($data) { 
     if (false === parent::checkSomethingElse($data)) { 
      $this->valid = false; 
     } 
     return $this; 
    } 
    public function getIsValid() { 
     return $this->valid; 
    } 
} 

$v = new ValidationChain(); 
$valid = $v->checkSomething()->checkSomethingElse()->getIsValid(); 

신속하고 더러운, E & OE를. 그리고 아마도 어떤 비트가 유효하지 않은지 알아내는 방법을 추가해야 할 것입니다.

관련 문제