Por que as assinaturas de função PHP são tão inconsistentes? [fechadas]

17

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?

Shamim Hafiz
fonte
2
+1 bravo, esta é uma das primeiras coisas que eu observei sobre php e sempre achei chato
Kevin
Meh. Use um IDE.
Ben Dubuisson

Respostas:

10

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?

StasM
fonte
4
+1 É difícil quando você inicia algo da maneira errada, mas tem uma base de usuários tão grande usando-a em seu estado atual.
Andy Fleming
4
Este é um bom ponto. Eu estava realmente ciente disso, mas meu ponto principal é que eles deveriam estar cientes disso em primeiro lugar.
Shamim Hafiz
7
@ Shamim True, que é parte do motivo pelo qual o PHP tem uma má reputação;) #
Andy Fleming
1
O PHP, como muitas coisas, começou como uma pequena ferramenta para resolver um pequeno problema, se alguém o tivesse projetado "adequadamente" naquela época, poderia ser mais agradável do que, mas talvez não tivesse atingido a tração, então ninguém o usaria ... e outra pequena ferramenta teria "ganhou", uma ferramenta com diferentes inconsistências ...
Johannes
3
É por isso que existe deprecação. Você cria nomes novos e padronizados e desaprova a antiga "barra de salada" dos nomes das funções, mas deixa-os disponíveis para alguns lançamentos. Em algum momento bem divulgado, você lança um novo lançamento de versão principal que acaba com eles. É assim que isso é feito. É pura covardia da parte dos desenvolvedores do PHP que eles não fizeram isso. Eles estão enfrentando a baixa barreira à entrada que dá ao PHP uma vantagem sobre outras linguagens da web, e são bem-sucedidas por causa disso, portanto não precisam continuar melhorando a linguagem principal.
Dan
10

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.

ts01
fonte
nem todos podem adicionar funções
StasM
@StasM: Quem pode, o grupo DEV? Algum link onde eu possa encontrar como esse grupo opera?
Shamim Hafiz
@StasM: ok, eu exagerei um pouco. O verdadeiro problema é a falta de convenções desde o início ou uma pessoa responsável pela coesão do código. Agora é tarde demais. Duvido que isso possa ser alterado sem literalmente bifurcar o PHP como outra linguagem.
ts01
Os princípios de operação do grupo @Shamim Dev são dois: consenso e confiança. O que é legal, mas eu tenho medo não é suficiente para o bom desenvolvimento da linguagem
ts01
@ Shamim: comece com php.net e wiki.php.net.
StasM
4

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.

Andy Fleming
fonte
depreciar a função é uma coisa, a mais fácil. Mudar a ordem dos argumentos é mais, mais difícil
ts01
@ ts01 identifica o problema essencial. Com apenas parâmetros posicionais, não há como saber que o seu existente foo(a,b)agora deve ser foo(b,a)porque alguém mudou a assinatura de foo.
Frank Shearar
@ ts01, @Frank: Você teria que mudar o nome da função, também ... não é uma idéia especialmente boa para coisas como "property_exists" onde não é nenhum outro nome decente. Pessoalmente, eu gostaria que as matrizes se tornassem objetos reais, para que você pudesse dizer $array->key_exists('whatever'), mas, meh :-) #
295 Dean Harding
Na verdade, o que qualquer desenvolvedor PHP pode fazer é criar suas próprias novas funções para envolvê-las. Observe também que isset () possui uma sintaxe universal para os dois exemplos mencionados, mas eles simplesmente não são preteridos como parte das especificações compiladas.
user1122069
3

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.

James Anderson
fonte
Eles também mantiveram os nomes das funções C que estavam agrupando em alguns casos (as funções str em particular), divergindo amplamente das convenções de nomenclatura de C (como são) para outros nomes de funções.
Dan
2

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)

Jesse
fonte
1
Em outros idiomas, eu posso escrever sem referência constante aos documentos. Sempre preciso me preocupar com PHP ... essa função está escrita "str_" ou apenas "str"? É esse "array _" - algo ou não mencionamos matrizes? O que "length ()" faz quando recebe uma string? Oh inferno, não, é "strlen ()" Eu realmente queria ... É "agulha, palheiro" ou "palheiro, agulha"? Nenhuma outra língua me leva a tudo isso.
Dan
Como você, eu estava constantemente incomodado com esse @DanRay. Comecei a usar o NetBeans PHP IDE agora, o que me fornece as informações exatas necessárias no editor.
Deed02392