2010-07-14 4 views
3

PHP에서는 동일한 메소드에서 다른 유형을 반환하는 것이 좋지 않은 것으로 간주됩니다. 어쩌면 거기에 가장 좋은 패턴이 있지만 근본적으로 뭔가를 할 내 방법을 원한다면 실패하고 문자열 오류 메시지를 반환하지만 작동한다면 true를 반환합니다. 이 doesnt는 나에게 아주 바르게 보인다. 그러나 내가이 일을 만들기 위해 볼 수있는 유일한 다른 방법은 오류 메시지를위한 문자열과 '괜찮은'경우 '유효'또는 무언가와 같은 문자열을 반환하는 것이 될 것이다. 다시 말하지만,이 방법을 사용하면 더 많은 결합 방법이 있다는 것을 의미합니다.이 방법을 사용하면 false를 true로 확인하지만 메서드에서 유효한 응답을 나타내는 단어를 알아야합니다.PHP - 동일한 메소드에서 다른 유형의 값을 반환하는 경우

답변

0

음, 배열을 반환 할 수 있습니다. 첫 번째 인덱스에는 부울 true/false가 포함되고 두 번째 인덱스에는 필요한 경우 추가 정보가 포함됩니다.

+0

나는 그것에 대해서도 알았지 만 호출하는 메서드는 어떤 식으로 인덱스를 찾을 필요가 있으므로 더 많이 결합됩니다. – David

2

함수가 작동하는지 여부를 모니터링하려는 경우 예외를 사용하는 것이 가장 좋습니다. 프로그램 언어를 제공하는 모든 프로그래밍 언어에서와 마찬가지로, 이는 예상 된 프로그램 흐름 범위 밖의 "예외적 인"사례를 나타내며 문제가 발생했음을 나타 내기 위해 어떠한 유형의 반환도 필요하지 않습니다. PHP 사양은 아래 링크 된 관련 설명서를 참조하십시오.

PHP Exceptions

+0

5는 PHP 예외 개념을 도입 한 첫 번째 버전이므로 PHP5를 사용한다고 가정합니다. 이를 보충하는 PHP4의 해결 방법은 trigger_error 함수를 사용했습니다. http://www.php.net/manual/en/function.trigger-error.php – apiri

+0

네,하지만 별도의 코드로 코드를 분할하고 싶습니다. 그래서 예를 들어 내가 말하는 방법은 문자열의 유효성을 검사하는 데 사용될 것입니다. 문자열에 오류가있는 경우 오류가 무엇인지 반환하고 싶지만 ok 일 경우 true를 반환합니다. – David

+0

그런 다음 PHP 기반 Exception을 서브 클래 싱하여 고유 한 StringValidationException 클래스를 가질 수 있습니다. 그런 다음 메서드는 String을 사용하여 유효성 검사를 수행하고 유효한 경우 true를 반환하고 필드가없는 경우 예외를 throw합니다. 원래의 의도에 더 가까운 또 다른 옵션은 오류를 설명하는 문자열을 반환하는 isInvalid 메서드 또는 false로 평가되는 빈 문자열 ""을 갖는 것입니다. 예제 사용은 isInvalid ($ myString)이며 지정된 메시지에서 유효하지 않은 경우 true를 반환하고 PHP에서 정의한 false와 같으면 "false"를 반환합니다. – apiri

2

당신이 클래스의 방법 언급하는 것을 가정하면, 단순히 방법에서 TRUE 또는 FALSE를 반환하지만 배열을 포함 할 수있는 클래스에 $의 _error 속성을 사용하는 것이 좋을 것이다 오류 메시지.

그런 다음 결과가 false이면 메서드를 반환하기 전에 $ _error 속성에 오류 메시지를 설정할 수 있으며 get_error() 메서드를 사용하여 메시지를 검색 할 수 있습니다.

+0

+1 이것은 PHP와 함께 제공되는 대부분의 OOP 라이브러리와 프레임 워크가 IMO를 수행하는 최선의 방법입니다. 또는, 일부 라이브러리는 마지막 작업에서 발생한 에러를 반환하는'mysql_error()'또는'curl_error()'와 같은 함수를 가지고있다. 그러나 객체로 작업하고 예외를 사용하고 싶지 않거나 사용할 수 없다면'error' 속성을 사용하십시오. –

+0

예, 나는 oop을 언급하고있었습니다. 액 톨 오류 개체를 제안 해주십시오. 나는 비교적 프로그래밍에 익숙하지 않지만이 유형의 문제에 사용되는 일종의 표준 디자인 패턴이 있다고 확신했다. – David

+0

내 일반적인 충고는 KISS 원리라고하는 "단순하게 유지"하는 것이다. 여러 오류를 추적하려면 배열을 사용하십시오. 오류가 하나 인 경우 문자열로 저장하십시오. 오류 메시지의 추가 속성이나 동작을 확인한 다음 실제 개체 사용에 대한 걱정을 시작하십시오. 고유 한 필요성을 확인하면 개체를 사용하는 것이 좋습니다. 그렇지 않으면 네이티브 형식과 해당 기능을 사용하십시오. –

0

PHP로 도망 갈 수는 있지만 문제가 발생할 수 있습니다. 당신이나 다른 누군가가 앞으로 앱을 유지해야 할 때 Esp. 일반적으로 변수의 whats에 대한 모호함을 만드는 이와 같은 접근을 피하는 것이 좋습니다.

당신이하고있는 일을 달성하는 한 가지 방법은 결과 코드 또는 메시지를 반환하고 참조 된 매개 변수를 사용하여 반환 된 실제 값을 가져 오는 것입니다.

예 :

$msg = MyFunc($o); 
    if ($msg == 'OK') //or ($msg == 0) 
    { 
     //use the returned object or value 
     $o->Foo(); 
    } 
    else 
    { 
     //respond to error 
    } 
0

사실 반환 또는 다른 어떤 좋은 해결책이 될 수 있습니다. 때때로. 반환 된 값을 변경하기로 결정하면 중단 될 수 있습니다. 개인적으로, 나는 그것을 좋아한다.

배열을 반환 할 수 있습니다. 비어있는 경우 오류가 없습니다. 모든 오류는 배열의 개별 항목입니다.

게다가, exception을 던집니다.

0

PHP는 느슨한 언어이므로 PHP와는 다른 유형의 함수를 반환하는 것이 일반적입니다.

예를 들어 mysql_query()은 성공시 리소스를 반환하고 오류시 부울 false을 반환합니다. 오류 상태를 테스트 한 다음 mysql_error()과 같은 다른 함수를 호출하여 오류의 특성에 대한 특정 정보를 얻습니다.OO 코드를 작성할 때

$query = mysql_query($sql); 
if ($query === false) { 
    die(mysql_error()); 
} 

그러나, 나는 함수에서 다른 관련이없는 개체 유형을 반환에 대한주의 것입니다. 그것은 지루한 타입 검사 코드를 많이 작성하는 개발자가 필요합니다

$result = $search->find($keyword); 

if ($result === null) { 
    // no entry matches $id 
} elseif ($result instanceof ResultClass) { 
    // one row found; do something with the result 
    print $result; 
} elseif ($result instanceof ResultCollection) { 
    foreach ($result as $element) { 
    print $element; 
    } 
} else { 
    // are there other types for $result? 
} 

어떤 고통을 때마다 당신이 find()를 호출 모든 코드를 를 작성!

find() 메서드가 항상 ResultCollection을 반환하면 위의 예가 더 좋습니다. 결과가 없으면 콜렉션에 항목이 없을 것입니다. 함수가 일관되게 주어진 형식을 반환한다고 가정하면 코드가 더 간단합니다.

$result = $search->find($keyword); 
foreach ($result as $element) { 
    print $element; 
} 
관련 문제