2011-01-29 2 views
4

CakePHP에는 find이라는 매우 기본적인 메서드가 있습니다. 대부분이 메서드는 배열을 반환하지만, count을 첫 번째 매개 변수로 전달하면 메서드는 정수가 아닌 다른 데이터 형식을 반환합니다.다양한 데이터 형식을 반환하는 함수

이 메서드는 다양한 데이터 형식을 반환 할 수 있습니다.

나쁘지 않습니까?

답변

1

스크립팅 언어는 입력 매개 변수 유형 또는 매개 변수 값에 따라 여러 유형을 반환하는이 패턴을 사용하는 경향이 있습니다.

혼란 스러울 수 있지만 좋은 문서가 있으면 문제가되지 않으며 매우 강력 할 수 있습니다.

강력한 형식의 언어는 함수 오버로드를 사용하여 동일한 작업을 수행합니다.

1

아니요. 유연한 방식입니다. PHP에서는 표준 함수도 다른 유형을 반환합니다. 예 : strpos(). integer 위치와 boolean false를 반환 할 수 있습니다.

+0

Alexander, strpos는 아마 정수 나 false를 반환하기 때문에 좋은 예가 아닐 것입니다. false == 0은 참이지만 false === 0은 false입니다. 이것은 문자열의 첫 글자와 일치 할 수 있습니다. 문제. 그러나 여러 유형을 반환하는 스크립팅 언어의 일반적인 규칙은 동작이 허용됩니다. –

+2

내장 함수가 올바르게 수행하지 못하기 때문입니다. PHP 내장 함수는 내가 멍청하다고 생각하는 많은 일을합니다. – sberry

+0

@Toby, -1을 반환하는 방법에 대해? – sberry

1

이것은 의도적으로 설계된 동작입니다. PHP는 동적 유형의 언어이므로 다양한 데이터 유형을 반환하는 함수 (Java와 달리 함수가 반환하는 내용을 확인할 수 있음)에 대해 자신을 보호 할 수는 없습니다. 매우 유연합니다 (또한 좋지 않을 수도 있습니다). 그래서 단위 테스트를 작성하여 예상치 못한 결과를 방지하는 것이 좋습니다. You can see phpunit for a Unit Testing framework.

+0

Java가 동적으로 형식화 된 언어라는 것을 알지 못했습니다 ... o.O Python은 더 나은 예제 또는 JavaScript 일 것입니다. – netcoder

+0

당신은 더 잘 읽어야합니다. "그래서 당신은 자신을 보호 할 수 없다. (자바에서와 같이 동적으로 타입이 지정되지 않았기 때문에 자신을 보호 할 수있다.) –

+0

나는 적절한 문구가"Java와는 다르다 "라고 생각한다. :) – netcoder

1

동작이 문서화되어있는 한 은 나쁜 것이 아닙니다..

// returns a "const char*" if c == 0 
// returns a "string*" if c == 1 
const void* foo(int c) { 
    const void* a; 
    if (c == 0) { 
     a = (const void*)"foo"; 
    } else if (c == 1) { 
     string* b = new string("bar"); 
     a = (const void*)b; 
    } 
    return a; 
} 

그런 다음이 작업을 수행 할 수 있습니다 :

const char* x = (const char*)foo(0); // get a const char* 
string* y = (string*)foo(1);   // get a string* 
std::cout << x << *y;    // prints "foobar" 

을 그러나 강력한 형식의 언어입니다 예를 당 C/C++에서는, 당신은 무효 포인터를 사용하여 유사한 결과 (void*)을 달성 할 수 제대로 문서화하지 않으면 예기치 않은 동작이 발생할 수 있습니다. 포인터가 있다면 때문에 예상치 못한 유형으로 캐스팅 한 후 사용되는 :

string* y = (string*)foo(0);   // get a const char*, bad type cast 
std::cout << *y;      // Segmentation fault 

는 위의 잘 컴파일하지만 런타임에 실패합니다. 물론, PHP에서 비슷한 일을하는 것이 segfault는 아니지만 대부분 프로그램의 나머지 부분을 망칠 것입니다.

관련 문제