2011-08-18 2 views
1

Form이라는 클래스가 있다고 가정합니다. 이 클래스는과 같이 자체에 필드를 추가하는 마법의 방법 __call()를 사용PHP 처리 함수의 과부하 오류를 어떻게 만들 수 있습니까?

<?php 
class Form { 

    private $_fields = array(); 

    public function __call($name, $args) { 

    // Only allow methods which begin with 'add' 
    if (preg_match('/^add/', $name)) { 

     // Add a new field 

    } else { 

     // PHP throw the default 'undefined method' error 

    } 

    } 

} 

내 문제는 내가 그것을 기본 방법에 PHP가 정의되지 않은 방법으로 통화를 처리하는 방법을 알아낼 수 있다는 것입니다. 물론, 기본 동작, 예를 들어 내가 지금 다음 코드를 사용, 여러 가지 방법으로 모방 할 수 있습니다

trigger_error('Call to undefined method ' . __CLASS__ . '::' . $function, E_USER_ERROR); 

을하지만 오류 자체 또는 그 수준은 향후 변경 될 수 있기 때문에이 솔루션을 좋아하지 않는다 , PHP에서 이것을 처리하는 더 좋은 방법이 있습니까? 내 질문이 좀 모호처럼

업데이트 은 어떻게 PHP가 정의되지 않은 방법 오류 및 오류의 레벨을 제공 할 필요없이 의 기본 오류가 발생 할 수 있습니다 ... 그래서 더 명확하게, 보인다? 다음 코드는 PHP에서 작동하지 않습니다,하지만 내가 할 노력하고있어 무엇 : 사람이 루비에 익숙한

// This won't work because my class is not a subclass. If it were, the parent would have    
// handled the error 
parent::__call($name, $args); 

// or is there a PHP function like... 
trigger_default_error(E_Undefined_Method); 

경우,이 method_missing 내부의 super 메소드를 호출하여 달성 될 수있다. PHP에서 어떻게 복제 할 수 있습니까?

답변

0

당신이 오류 수준을 변경하려면 필요한 경우, 단지 그것을 변경하거나 문 대신 E_USER_ERROR

1

를 사용하여 예외의 경우 추가, 그것은이 다음에 하찮게 쉽게 그들이

public function __call($name, $args) { 
    // Only allow methods which begin with 'add' 
    if (preg_match('/^add/', $name)) { 
     // Add a new field 
    } else { 
     throw new BadMethodCallException('Call to undefined method ' . __CLASS__ . '::' . $name); 
    } 
} 

에 대한있어 무엇 catch

try { 
    $form->foo('bar'); 
} catch (BadMethodCallException $e) { 
    // exception caught here 
    $message = $e->getMessage(); 
} 
+0

고마워요,하지만 여전히 오류 메시지가 나타납니다. PHP가 기본 PHP를 사용하기를 원합니다. – Maher4Ever

+0

@ Maher4Ever 왜? 그것은 당신의 클래스이지 PHP가 아닙니다. 당신은 항상 메시지를 모두 함께 생략 할 수 있습니다. 그 예외는 꽤 자기 설명 적입니다. – Phil

+0

클래스가 어떻게 구현되는지 숨기고 싶다면, PHP가 사용하는 것과 똑같은 메시지를 생성해야합니다. 그래서 정의되지 않은 메소드를 호출합니다. 기본 오류가 표시됩니다. PHP가 이미하는 것을 반복하는 것처럼 보입니다 ... 나는 단지 기본 메시지에 액세스하여 보여주고 싶습니다! – Maher4Ever

관련 문제