Eu estava passando por algumas funções do PHP e não pude deixar de notar o seguinte:
<?php
function foo(&$var) { }
foo($a); // $a is "created" and assigned to null
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
Observe a função array_key_exists()
e property_exists()
. No primeiro, o nome da propriedade (chave para uma matriz) é o primeiro parâmetro, enquanto no segundo é o segundo parâmetro. Por intuição, seria de esperar que eles tivessem assinatura semelhante. Isso pode causar confusão e o tempo de desenvolvimento pode ser desperdiçado, fazendo correções desse tipo.
O PHP ou qualquer outra linguagem não deveria considerar a consistência das assinaturas de funções relacionadas?
Respostas:
O que você propõe é essencialmente alterar assinaturas para muitas funções existentes. Pense por um minuto que efeito isso teria no código existente. Agora, suponha que o grupo PHP tenha lançado a versão N do PHP que altera as assinaturas de 30% das funções. Agora imagine que você precise escrever um código que execute o PHP vN e o PHP v. {N-1} - o quanto isso seria divertido?
Agora imagine que você é um gerente de datacenter ou corporativo - que incentivo você teria para oferecer suporte ao PHP vN, desde que, ao mudar, todo o código seja quebrado e os usuários cheguem ao seu escritório com forquilhas e tochas?
fonte
Porque PHP é a linguagem sem qualquer especificação.
E literalmente todos poderiam adicionar algumas funções, e não havia questão de consistência no início. Então, a bagunça.
fonte
A maioria das boas línguas é e se esforça para ser consistente.
É apenas a realidade do estado do PHP. Como o StasM mencionou, seria um pesadelo tentar mudar coisas assim depois do fato. Isso afetaria muito código existente. Freqüentemente, o PHP simplesmente desaprova funções e cria novas funções melhores, mais consistentes, mas que podem levar muito tempo.
Acho que os programadores bem-sucedidos do PHP se lembram da sintaxe específica ou usam um software que automaticamente lhes diz a sintaxe.
fonte
foo(a,b)
agora deve serfoo(b,a)
porque alguém mudou a assinatura de foo.$array->key_exists('whatever')
, mas, meh :-) #A principal fonte de inconsistência é que muitos (a maioria?) Do php em funções construídas são realmente invólucros em torno de alguma biblioteca C. O pensamento inicial era "Estou encerrando a função C xxxx, portanto, devo manter a ordem dos parâmetros igual". Quando se tratava de escrever uma função "php puro", esse pensamento foi estendido para "xxxx pega arquivo e opções. A nova função pega um nome de arquivo e opções, então faz sentido que aaaa tome os mesmos parâmetros na mesma ordem.
A grande falha aqui é que as bibliotecas C subjacentes eram muito inconsistentes para começar.
fonte
O motivo (a?) Era permanecer compatível com as versões anteriores do PHP. Em vez de alterar os nomes das funções que quebrariam muitos aplicativos, as funções permanecem. No entanto, por intuição, sim, a nomeação consistente de funções deve ser levada em consideração para novos idiomas.
Eu tenho que discordar de você quanto ao fato de o tempo de desenvolvimento ser desperdiçado. Aprender PHP pode levar mais tempo para entender o nome de certas funções, mas depois de dominado (ou pelo menos ciente), isso se torna um problema.
Compatibilidade> Consistência (pelo menos para PHP)
fonte