Pergunta

alterações recentes para PHP, eles adicionado em diversas interfaces para permitir que um objecto a ser tratado como uma matriz, tal como ArrayAccess, Repetidor, Countable, etc

A minha pergunta é, será que então faz sentido que o seguinte deve funcionar:

function useArray(array $array)
{
    print_r($array);
}

useArray(new ArrayObj(array(1,2,3,4,5));

A partir de agora, PHP lança um erro de insinuando tipo, como $array não é tecnicamente um array. No entanto, a aplicação de todas as interfaces que faz com que seja basicamente idêntica a uma matriz.

echo $array[0]; // 1
$array[0] = 2;
echo $array[0]; // 2

Logicamente, o objectivo deve ser capaz de ser usado em qualquer lugar uma matriz pode ser utilizada, uma vez que implementa a mesma interface como uma matriz.

Am I confuso na minha lógica, ou não faz sentido que se um objeto implementa a mesma interface como uma matriz, que deve ser capaz de ser usado em todos os mesmos lugares?

Foi útil?

Solução

Am I confuso na minha lógica, ou não Faz sentido que se um objeto implementa a mesma interface como um matriz, ele deve ser capaz de ser usado em todos os mesmos lugares?

Um array é um tipo de variável PHP especial - não um objeto - como tal, não implementa quaisquer interfaces. ArrayObject é um objecto completo que implementa numerosas interfaces (Countable, ArrayAccess, etc.) e permite que um objecto de actuar como uma matriz, em certos casos (como em um loop foreach). Então, enquanto eles não implementam as mesmas interfaces que às vezes se comportam da mesma.

A solução ideal seria para PHP para suportar múltiplas assinaturas de função:

function useArray(array $array) { }
function useArray(ArrayObject $array) { }

Mas até chegarmos que (se alguma vez isso) você só tem que verificar tipos de variáveis ??fora da definição da função:

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!');
 }
}

Ou tentar fazer-type array coisas com o argumento $array e lidar com quaisquer avisos / erros que useArray pode gerar.

Outras dicas

Sua indicação de tipo está declarando seu tipo de "array", mas sua passagem em um "ArrayObj"

function useArray(array $array)
...
useArray(new ArrayObj

Então, sim a sua vai reclamar.

Am I confuso na minha lógica, ou não Faz sentido que se um objeto implementa a mesma interface como um matriz, ele deve ser capaz de ser usado em todos os mesmos lugares?

Se os implementos objeto a mesma interface que outra classe, sim, você pode usá-los como sinônimos, mas ainda válida para o compilador para reclamar sobre sua indicação de tipo, uma vez que não é do mesmo tipo.

Apenas porque dois objetos implementar a mesma interface não significa que eles são do mesmo tipo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top