문제
최근 업데이트 PHP,그들은 추가된 다양한 인터페이스에서 허용하는 개체를 취급 배열로,같은 ArrayAccess,반복기,셀,etc.
나의 질문은 것,그것은 다 의미는 다음과 같은 작업해야 합:
function useArray(array $array)
{
print_r($array);
}
useArray(new ArrayObj(array(1,2,3,4,5));
바로 지금,PHP 가 발생 입력-암시 오류,로 $array
기술적으로 훌륭한 기능들을 가지고 있습니다.그러나,그것을 구현하는 모든 인터페이스는 기본적으로 동일하다 배열입니다.
echo $array[0]; // 1
$array[0] = 2;
echo $array[0]; // 2
논리적으로,개체할 수 있어야 하는 곳에 사용되는 배열을 사용할 수 있습니다,그것이 동일한 인터페이스를 구현하으로 훌륭한 기능들을 가지고 있습니다.
내가 혼란에 나의 논리,또는 않습니다 그것이 의미가 있는 경우 객체를 구현하고 동일한 인터페이스는 배열로,그것을 할 수 있어야에 사용되는 모든 동일한 장소는?
해결책
내가 혼란에 나의 논리,또는 의미가 있는 경우에는 개체 동일한 인터페이스를 구현하는 배열할 수 있어야에 사용되는 모두 동일한 장소는?
인 array
특별한 PHP 변수 유형 지 개체-등으로 구현하지 않는 모든 인터페이스가 있습니다. ArrayObject
본격적인 개체를 구현하는 수많은 인터페이스(Countable
, ArrayAccess
, 등.) 할 수 있는 객체처럼 행동하는 배열에 특정한 경우(다음과 같 foreach loop).하는 동안 그래서 그들이 구현하지 않 동일한 인터페이스 때때로 동일하게 동작합니다.
는 이상적인 솔루션을 위한 PHP 을 지원하는 여러 기능을 서명:
function useArray(array $array) { }
function useArray(ArrayObject $array) { }
그러나 우리는(있다면 우리는 이제까지는)당신은 단지 확인해야변수 유형 외부의 함수 정의:
function useArray($array) {
if (is_array($array) || $array instanceof ArrayObject) {
// Do some stuff
} else {
throw new Exception('I require an array or an array-like structure!');
}
}
거나 시도 할 array
형은 물건과 $array
수 및 처리하는 경고/는 오류를 useArray
을 생성할 수 있습니다.
다른 팁
당신의 유형에 암시를 알리는 그의 유형"배열"하지만 당신의 전달하는"ArrayObj"
function useArray(array $array)
...
useArray(new ArrayObj
그래서 그가는 불평하고 있습니다.
내가 혼란에 나의 논리,또는 의미가 있는 경우에는 개체 동일한 인터페이스를 구현하는 배열할 수 있어야에 사용되는 모두 동일한 장소는?
을 경우 객체를 구현하고 동일한 인터페이스로 다른 클래스,네 당신이 그들을 사용할 수 있는 교대로,하지만 그것은 여전히 유효한 컴파일러에 대해 불평하는 당신의 유형을 암시하기 때문지의 동일한 유형이 있습니다.
기 때문에 그냥 두 개체 동일한 인터페이스를 구현은 의미하지 않은 그들의 동일한 유형이 있습니다.