Quais recursos você gostaria de ter em PHP? [fechadas]


88

Como agora é a temporada de festas e todo mundo está fazendo pedidos, eu me pergunto - quais recursos de linguagem você gostaria que o PHP tivesse adicionado? Estou interessado em algumas sugestões / desejos práticos para o idioma. Por prática, quero dizer:

  1. Algo que pode ser feito na prática (não: "Gostaria que o PHP adivinhasse o que meu código significa e corrigisse bugs para mim" ou "Gostaria que qualquer código fosse executado em menos de 5 ms")
  2. Algo que não requer a mudança do PHP para outra linguagem (não: "Eu gostaria que eles deixassem sinais $ e usassem espaço em vez de chaves" ou "Eu gostaria que o PHP fosse compilado, digitado estaticamente e tivesse # em seu nome")
  3. Algo que não exigiria a quebra de todo o código existente (não: "Vamos renomear 500 funções e alterar a ordem dos parâmetros para elas")
  4. Algo que faz alterar o idioma ou algum aspecto interessante do que (não: "Eu gostaria que houvesse extensão do suporte para o protocolo XYZ" ou "Desejo bug # 12345 foram finalmente fixo")
  5. Algo que é mais do que um discurso retórico (não: "Eu gostaria que o PHP não fosse tão ruim")

Alguém tem bons desejos?

Mod Edit: Stanislav Malyshev é um desenvolvedor de PHP básico.


9
@ Stan: Por muito que você gostaria de evitar esse tipo de comentário, você vai conseguir de qualquer maneira. Os problemas que as pessoas têm com o PHP estão principalmente nas categorias de coisas que você está descartando em sua postagem. [...]
Fishtoaster,

24
[...] Você está dizendo "Como podemos melhorar a experiência de levar um soco na cara sem realmente bater na sua cara?" Quero dizer, sim, tomar café de graça enquanto estamos sendo atingidos na cara pode ser bom, ele realmente não resolve muitos dos problemas subjacentes com, bem, ser atingido na cara. Portanto, enquanto espero que você obtenha algumas respostas úteis aqui (como já parecem existir), não se surpreenda com as improdutivas.
Fishtoaster

5
@ FishTaster: se o PHP associa-se a ser atingido na cara por você, por todos os meios, mantenha-se afastado dele. Definitivamente, você não está interessado em melhorá-lo. Acontece que existem pessoas que são. Este tópico é para eles, não para você. Tenho certeza de que este site também contém muitos tópicos, este não é apenas um deles.
StasM

5
Estou usando um golpe na cara como exemplo - uma situação em que melhorias superficiais não são tão importantes; quando os problemas da maioria das pessoas estão com a coisa subjacente. Não estou nem empolgando sua tentativa de obter sugestões para essas melhorias superficiais - apenas estou apontando por que você provavelmente obterá algumas respostas inúteis, dada a situação.
Fishtoaster

6
@ Fishtoaster: Nem todo mundo, surpreendentemente , odeia PHP - eu sempre gostei. Muito flexível e rápido (codificar).
Orbling

Respostas:


119

Eu não me importaria com parâmetros nomeados.

getData(0, 10, filter => NULL, cache => true, removeDups => true);
// instead of:
getData(0, 10, NULL, true, true);

// or how about:
img(src => 'blah.jpg', alt => 'an albino platypus', title => 'Yowza!');

Infelizmente, os desenvolvedores do PHP já derrubaram essa idéia .


1
É a lista de 2005. Muitas idéias foram encerradas e depois renasceram. Na verdade, se uma boa implementação vier, há uma chance decente de que ela seja aceita.
StasM

21
É o meu recurso python favorito. Torna o código muito auto-documentado.
Keyo

7
@ Josh K: É possível tudo bem, mas a chamada de 'matriz' é lixo inútil, se você quiser. Apenas ofusca o que você realmente está tentando fazer. Outra opção seria uma sintaxe abreviada para matrizes: make_img (['src' => 'blah.jpg', ...]);
Erik van Brakel

2
@Erik: Isso também não é uma opção ruim, estou dizendo por que adicionar essa desordem a um idioma quando você já pode fazê-lo com um invólucro de matriz menor.
Josh K

4
@ Erik: Sintaxe mais relaxada para matrizes (como o []operador do JavaScript ) seria um recurso apreciado.
Josh K

93

Mais desreferenciamento:

echo something_that_returns_array()[4];

Outros mencionaram parâmetros nomeados e sintaxe de matriz mais curta. Eu não me importaria com sintaxe de objeto mais curta também.

$a1 = array(1, 2, 3, 4);
$a2 = [1, 2, 3, 4];

$b1 = (object)array('name' => 'foo');
$b2 = {'name' => 'foo'}; // or something?

18
() [] a sintaxe já está no tronco. Infelizmente, os atalhos da matriz foram rejeitados, mas espero pela ressurreição.
StasM

2
Eu adoraria esse recurso. Por que podemos ter algo_que_retorna_objeto () -> 4, mas não com matrizes?
Bala Clark

4
Javascript, como notações de matriz e objeto, seria ótimo. Como desenvolvedor front-end, isso é o que mais me incomoda no código php.
Bleep Bloop

1
@DisgruntledGoat Sim, veja: #function something_that_returns_array() { return array( 'a', 'b', 'c', 'd', 'e' ); }
Annika Backstrom

2
@DisgruntledGoat: O problema com a ()->sintaxe é que ele só funciona quando um objeto é retornado. Para piorar a situação, é necessário que o objeto tenha uma propriedade / método com o nome especificado, que, idealmente, faz o que você espera que ele faça , ao aceitar os parâmetros que você deu-lo, e rezando para que ele não requer qualquer mais ... etc etc
phant0m

72

Depois de trabalhar com PHP por cerca de 13 anos, e pesadamente com JS por cerca de 4, há algumas coisas que acho que o PHP faria bem em pegar emprestado do JS:

1) notação abreviada de Arrays e Objetos. Acredito que isso possa ter sido discutido e abatido no Internals (pelo que ouvi dizer - não gosto de ver como a lingüiça é feita), mas realmente acho que a notação literal para matrizes e objetos em JS é uma grande vitória na produtividade.

Por exemplo:

$arr     = [1,2,3,4];
$assoc   = [foo=>'bar', baz=>'boo'];
$stdobj  = {foo->'bar', baz->'boo'};

É (IMHO) apenas muito mais fácil de escrever e mais limpo do que

$arr     = array(1,2,3,4); // not too bad
$assoc   = array("foo"=>'bar', baz=>'boo'); // not too bad either
$stdobj  = new stdClass; // this gets pretty rough
$stdobj->foo = 'bar';
$stdobj->baz = 'boo';

Ouvi dizer que surgiram algumas preocupações sobre possíveis confusões, mas, na verdade, isso é mais confuso do que, digamos, a notação heredoc? Pelo menos, criar um objeto stdClass no PHP é detalhado o suficiente para desencorajar a prática, eu acho.

2) Ser capaz de redefinir funções e métodos definidos anteriormente seria realmente útil. Em particular, simplificaria situações que estendem uma classe e instanciar a nova classe é excessivamente complexa ou impraticável. Eu acho que devemos evitar a redefinição de funções e métodos essenciais / não-espaço no usuário.


Além desses dois, acho que o PHP deve suportar transparentemente o unicode . Isso está se tornando cada vez mais um problema para os desenvolvedores, e as soluções atualmente oferecidas no PHP são confusas e freqüentemente não são de bom desempenho. Tornar todas as funcionalidades padrão de cordas compatíveis com unicode fora da caixa seria uma grande vitória para os programadores de PHP.

Obrigado por perguntar!


(2) veja o runkit. (3) o unicode é difícil, principalmente porque a maior parte do mundo exterior não é unicode. Teríamos que diminuir o desempenho ou exigir que as pessoas fizessem muito trabalho extra (como o Java faz). É por isso que o esforço unicode do php6 não deu certo.
StasM

8
Quanto ao unicode: pode ser difícil, mas seria extremamente útil (certamente o desenvolvimento do próprio PHP é difícil, mas oferece grandes benefícios, certo?) Talvez uma solução seria ativar o unicode transparente por meio de uma extensão com a troca de desempenho compreendida, muito parecido com XHP? Obrigado novamente.
Funkatron

5
$ object = array (object) ("foo" => 'bar', baz => 'boo');
Mercantio

3
Não vejo como você pode ver "a maior parte do mundo exterior não é unicode"? Você está falando de pessoas? Ou alguma outra coisa? Porque a grande maioria das pessoas no mundo (por uma margem enorme ) fala idiomas que são melhor representados pelo Unicode.
perfil completo de Dean Harding

1
Definitivamente suporte unicode. O envio de qualquer tipo de aplicativo usado globalmente não é necessário para iniciantes. Se os desenvolvedores do PHP acham que a engenharia no suporte decodificado a unicode é fácil ou não, isso não é relevante. As pessoas precisam disso e estão explorando as falhas da plataforma para fazer isso. O Delphi fez isso adicionando outro tipo de string e tornando-o padrão, com conversão implícita, e uma opção global para recuperar o comportamento antigo. Por que o PHP não pode fazer da mesma maneira?
Joeri Sebrechts

48

Coisas que eu gostaria, como ex-apologista de longa data do PHP:

  1. Sintaxe mais curta para matrizes. As matrizes PHP são um dos recursos mais impressionantes da linguagem devido à sua flexibilidade, mas é um problema para escrever some_array_method($argity, array('key' => $value));. Acredito que essa proposta já tenha sido eviscerada na lista de discussão do PHP, infelizmente.
  2. finally Apoio, suporte
  3. Atributos / anotações. Isso permite adicionar comportamento personalizado a um método de maneira a permitir a reutilização de código. Por exemplo, em uma estrutura MVC, pode-se definir um AuthorizeAttributeque indique que um controlador ou método de ação exige que o usuário seja autorizado. A estrutura em si seria responsável por procurar os atributos e agir de acordo com eles. Eu acredito que o PHPUnit já usa um tipo de atributo colocando-os nos comentários do docblock, que podem ser lidos usando reflexão, mas colocar a funcionalidade real nos comentários do docblock certamente é um hack.
  4. Sintaxe lambda mais curta. Em vez de ter que escrever function($x){ return $x*2;}, talvez eu pudesse escrever $x => return $x*2, ou algo assim. Novamente, isso é algo que dificulta o uso desse recurso. Por exemplo, $results = array_filter(array(1,2,3), function($a) { return $a % 2; }):vs $results = array_filter(array(1,2,3), $a => return $a % 2 );O primeiro tem muito mais encanamento, que é basicamente irrelevante para o trabalho real que você está tentando realizar.
  5. Uma Decimalmatemática interna (ponto fixo) que suporta operações matemáticas por meio dos operadores normais seria bem legal, já que não temos sobrecarga de operador.
  6. MÉTODOS MÁGICOS DO MOAR. Métodos mágicos são ótimos. Eu pude ver o PHP adicionando sobrecarga de operador por meio de métodos mágicos (eu sei que isso nunca acontecerá basicamente.) Mas, em geral, eles oferecem ótimas maneiras de se conectar à linguagem e fazer coisas legais.

48

Torne o PHP verdadeiramente orientado a objetos. A slap on another global functionevolução do PHP precisa terminar.

array_merge(array_filter(array_intersect_key($arr1, $arr2), "is_int"), $arr3);

É difícil para mim ler. Eu tenho que fazer minha própria pilha mental e meio que compilá-la. Basicamente, ele deve ler no verso. $dog->wakeup()->bark();é fácil de ler em comparação combark(wakeup($dog))

$arr1->array_intersect_key($arr2)->array_filter("is_int")->array_merge($arr3);

Você deu o passo para habilitar o suporte a objetos / métodos agora, use-o nas funções principais do PHP.

Vamos renomear 500 funções e alterar a ordem dos parâmetros para elas.

Mudar essa funcionalidade para métodos permitiria que eles fossem renomeados usando alguns de forma consistente. Quebraria alguma compatibilidade com versões anteriores se strings e matrizes tivessem seus próprios métodos?


3
Eu acho que array não sendo um tipo de objeto é um grande erro no PHP. Leva a todos os tipos de problemas. Infelizmente, é uma coisa evolutiva. Você pode fazer o que quiser aqui com extensão ou espaço no usuário. Provavelmente caberia bem no SPL.
StasM

3
O mesmo argumento se aplica a seqüências de caracteres. Estou apenas me referindo à falta de métodos em geral. Idiomas como Java, Python, C # etc, todos têm código muito mais legível. Eu acho que você está procurando recursos, mas corrigir o que está quebrado na IMO seria um melhor resultado.
Keyo

6
Não, não seja bobo. Seriadog_wake_up($dog); bark_dog($dog);
Matchu

2
IMHO, qualquer novo método de string deve esperar e emitir UTF-8 e lançar exceções se a entrada não for UTF-8 válida. Isso reduziria bastante a necessidade de uma grande reformulação do suporte a Unicode.
Rjmunro

1
@luiscubal No. Um parâmetro extra significa que não podemos adicionar parâmetros mais tarde se inventarmos coisas novas para adicionar à função. Por exemplo, se $ string => trim () apenas fizesse espaços em branco (como antes da 4.1.0), seu sistema diria $ string => trim ('ISO-8859-1') espaço em branco cortado a partir das cadeias ISO-8859-1 . Se quiséssemos ser capazes de aparar coisas que não eram espaços em branco, não poderíamos adicionar o parâmetro para isso, a menos que façamos as pessoas especificarem a codificação primeiro. Deveríamos incentivar as pessoas a acreditarem que qualquer texto em qualquer lugar que não seja UTF-8 está errado .
Rjmunro 17/04

40

Um mecanismo de consulta integrado à linguagem seria ótimo. Mais ou menos como o que está disponível no .NET chamado LINQ. Isso ajudaria a classificar arrays maciços de dados e padronizar o acesso ao banco de dados, para que menos ataques de injeção de SQL tenham êxito.


2
Qualquer coisa que facilite consultas parametrizadas recebe meu voto!
Dean Harding

1
Eu acho que o acesso ao banco padronizado é realmente um benefício muito importante de algo como LINQ, porque eu acho que faz o teste de unidade com simulações de seu banco de dados objetos mais fácil (desde que você está zombando de código PHP em vez de consultas SQL.)
davidtbernal

não acho que algo assim deva entrar no núcleo. seria melhor se encaixam em uma extensão pecl
Harald

38

Oh. Digite dicas para primitivas. Isso seria legal.


1
Embora eu goste do princípio KISS do PHP (em certa medida), eu fortemente o sustento. O motivo é que, se você quer ser realmente defensivo, acaba com o mesmo código de verificação de tipo em cada método setter. Poderíamos facilmente deixar isso se o idioma o suportasse nativamente.
MicE

4
"Dica de tipo" era um nome muito infeliz, pois não é "dica", é digitação estrita. Eu acho que a digitação estrita primitiva estaria fora do lugar em linguagem dinâmica como PHP. Digitação coercitiva (a mesma coisa que as funções internas - tente strlen (123)) pode estar OK.
StasM

6
+1 para isso. Digite dica (ou digitação estrita) nas declarações de funções seria incrivelmente útil e reduziria muito se (! Is_int ()) porcaria no método EACH AND TODOS.
Phil Sturgeon

5
@StasM Eu discordo. É perfeitamente dentro do escopo de uma linguagem dinâmica permitir que o usuário opte por usar a linguagem de maneira estaticamente digitada. E isso permitiria uma captura de erro muito melhor. Você não precisaria usá-lo se não quisesse, mas, pessoalmente, estou farto de passar as strings para onde eu queria um int e, em seguida, ter que pesquisar no código para descobrir onde a string estúpida está sendo passada. Ou então, digite verificar tudo o tempo todo.
Daniel Bingham

2
@StasM Não há absolutamente nenhuma razão para você ter que introduzir variáveis ​​totalmente estaticamente tipadas. Sim, você alteraria os erros no seu código. Esse seria o ponto principal. O erro ocorreria no momento da chamada da função, e não dentro da função - o que deixa você sem ideia de onde o erro está realmente ocorrendo. Quanto aos erros de conversão de tipo, o erro ocorreria - sim no tempo de execução - na chamada da função. Corrija o problema convertendo para o tipo correto. Muito melhor do que ter uma string aparecendo em uma função esperando um int e sem saber de onde.
Daniel Bingham

34

Eu realmente desejo um melhor suporte unicode pronto para uso. A maioria das linguagens se move nessa direção, mas o PHP ainda tem comandos estranhos espalhados por toda parte.

Strings PHP são apenas matrizes simples de bytes. Seu conteúdo não é portátil, pois depende da codificação padrão atual.

O mesmo se aplica à representação criada por serialize. Ele contém uma representação de bytes com prefixo de comprimento da cadeia de caracteres sem armazenar realmente nenhuma informação de codificação.

A maioria das funções PHP (string) não tem idéia sobre Unicode. Para obter uma lista detalhada incluindo o nível de risco de cada função, consulte: http://www.phpwact.org/php/i18n/utf-8

http://blog.ginkel.com/2010/03/php-unicode-support-or-the-lack-thereof/


O suporte ao Unicode se mostrou muito mais difícil do que se pensava. É por isso que o esforço php6 foi interrompido. Por enquanto, temos o utf-8 e acho que o melhor caminho a seguir seria adicionar suporte ao utf-8 para funções de string, talvez como parte da extensão intl.
StasM

3
Entre, a cotação está incorreta. As strings PHP são matrizes de bytes, mas seu conteúdo é tão portátil quanto você as cria e não depende da "codificação padrão" - é apenas uma matriz de bytes, você as deseja em utf8, put utf8, utf16 - put utf16. O link phpwact.org parece estar morto.
StasM

1
Eu realmente espero que a extensão intl seja ativada por padrão, para que as pessoas que precisam de UTF-8 (não todos?) Não precisem lutar contra seus hosts para que as funções de string se comportem como o esperado.
Emil Stenström

Além disso, obrigado pelo esclarecimento sobre as strings. Estou longe do PHP há um tempo, então estou um pouco enferrujado. Eu em vez lutou a guerra unicode com Python, que tem problemas semelhantes como PHP faz, mas resolve-los em Python 3. Ter um "O" sueco em seu nome é uma bagunça :)
Emil Stenström

Esta é definitivamente uma área em que eu gostaria de ver uma melhoria.
Nathan Osman

32

Crie strings como objetos, com métodos internos para substituir os que não são objetos com nome e parâmetro inconsistentes. por exemplo

$subject->replace($search,$replace);
$string->split($separator);
$string->trim();

etc.

Edit: mais uma coisa: Esses métodos sempre devem esperar e emitir UTF-8, exceto aqueles especificamente destinados a lidar com codificações. Se a entrada for UTF-8 inválida, uma exceção deve ser lançada, mesmo que a saída da função não seja afetada pela codificação.


é exatamente o que eu pretendo.
Kemo

1
subject->verb(object), facilita a ordem dos parâmetros.
Ming-Tang

Eu brinquei com a criação de minha própria classe de cordas para fazer esse tipo de coisa, facilita muito a codificação e você nunca esquece a ordenação dos parâmetros.
usar o seguinte código

2
Então, o que is_object($string)retornaria? Isso quebraria a compatibilidade com versões anteriores em grande escala ou resultaria na introdução de objetos quase não muito intuitivos, mas não muito.
Tgr

@ Tgr: is_object () deve ser descontinuado - Não deve haver algo como "não um objeto". No curto prazo, teria que ser uma propriedade que você pode desativar em qualquer objeto, e os construtores de cadeias de caracteres padrão a desativariam.
Rjmunro

24

1) Gostaria que objetos recém-instanciados retornassem "$ this" para que eu possa usar o método chain, $ user = new User ('john') -> setLastName ('Doe') -> save ();

2) Se você já usou o ruby ​​e, mais recentemente, o nó, eles têm um ótimo shell interativo (IRB). Eu adoraria que o PHP tivesse um que fosse realmente útil.

3) Traits / Mixins, mas ouvi dizer que estão a caminho.

4) Eu quero a segunda matriz curta $ myArray = ['my', 'array'];

5) Nomenclatura / ordem consistente (ou seja, palheiro de agulhas)


Eu odeio ter que criar um create()método que não faça nada de especial apenas para solucionar o problema nº 1!
Alan Pearce

Eu faço o mesmo, mas, usando ligação estática tardia e uma superclasse de objeto, dessa forma, toda classe que estende minha superclasse tem o método, por exemplo: SomceClass estende SuperObject {}; SomeClass :: create () -> somemethod ();
Dukeofgaming

Dê uma olhada em github.com/philsturgeon/php-ps É apenas um começo, mas com alguma ajuda, pode ser bastante útil.
Phil Sturgeon

1
Há também um pacote PEAR que oferece um shell interativo para codificar experimentos rápidos em PHP - disponível em pear.php.net/package/PHP_Shell
kguest

(new Foo ()) -> bar () faz parte do 5.4. 3) e 4) também.
StasM

20

1) por favor, livre-se do includes (). As referências a outros arquivos devem ser referências e, na verdade, não colocar o conteúdo de um arquivo de código-fonte em outro. Muitos programadores PHP usam o include () como um tipo de chamada de função e não como um meio de referenciar uma biblioteca. Isso leva a todos os tipos de ambiguidade no estado variável e no código instável. Substitua por um comando 'use' semelhante ao Perl.

2) forneça um fora da caixa método de compilação de um aplicativo PHP em um único arquivo bytecode distribuível ou executável. Isso aumentará bastante o apelo do PHP como uma linguagem de desenvolvimento comercial. Este deve ser um componente básico da linguagem. Não se preocupe com os arquivos html usados ​​na GUI de um aplicativo, porque ...

3) libere a capacidade de incorporar tags PHP em HTML. Ou, pelo menos, forneça um modo "sem incorporação". Essa é uma bagunça absoluta e incentiva o mau design, misturando a lógica e a apresentação do aplicativo. Os desenvolvedores devem usar modelos para exibição e não bater arquivos PHP juntos e esperar o melhor.

Assinado,

GrandmasterB

ps: não escute o que os outros dizem aqui, fui legal o ano todo


37
1) Inclui são ótimos. Tudo tem inclui. 2) Isso é bom. 3) O modelo é a característica mais forte do PHP . Forçar você a usar outras besteiras de modelos seria uma péssima jogada.
Josh K

8
Eu gosto de (1) e (2), mas (3) parece um passo retrógrado. O PHP oferece a você o poder de modelar, depende de você usá-lo com sabedoria ou não.
geekbrit

11
3 não faz sentido - a incorporação de tags é necessária para qualquer V nas estruturas MVC.
18710 Alex

9
Eu li esta resposta como "Querido Papai Noel, por favor, faça o PHP não ser PHP".
Stephen

1
3 está certo, pois o PHP é uma linguagem de modelagem.
Andrew

18

Uma diretiva ini para E_ERRORconstantes indefinidas, em vez de assumir que é uma string E_NOTICE.


1
Constantes de classe fazem isso, btw.
StasM

4
Sério, eu não entendo por que eles fazem o PHP assumir cadeias não citadas. É a coisa mais estúpida de todas. Eu escolheria E_ERRORou E_PARSE.
BoltClock

14

Normalize o espaço para nome global com uma convenção de nomenclatura bem pensada que faça sentido para os novatos!

Para citar nosso amado Jeff Atwood: PHP é péssimo, mas não importa !


1
Concordo, em princípio, mas não têm idéia de como fazê-lo na prática :)
StasM

3
@StasM: Eu imagino que o primeiro passo seria tornar as novas versões das bibliotecas no namespace e permitir que os programadores (por meio de configurações ini) desativem as bibliotecas globais atualmente. Eu acho que um pacote de compatibilidade estaria em ordem para versões mais antigas, mas não deve ser muito difícil de escrever.
Michał T


13

1) Sintaxe mais curta de matriz / objeto, como JavaScript (como mencionado anteriormente)

2) Permitir que constvariáveis ​​permitam o resultado de um cálculo como o define()faz.

3) Encadeamento diretamente do construtor: new User()->name('Ryan');

4) Desreferenciamento de matriz: something_that_returns_array()[4];

5) Suporte expandido a SPL. O SPL faz um trabalho decente ao reimaginar funções de string e array (entre outras coisas) como objetos. A expansão do SPL poderia resolver muitas queixas sobre o idioma ser tão superficial.

6) O uso ArrayObject()deve ser tão transparente quanto o uso array(). Você deve ser capaz de fazer coisas como array_filter($array_object_instance)sem fazer array_filter($array_object_instance->getArrayCopy()). Melhor ainda, é claro, seria $array_object_instance->filter().

7) Unicode completo seria bom.

8) Pare de fazer conversões de tipo automáticas estranhas. Por exemplo, você não deve conseguir echoum objeto SimpleXMLElement sem primeiro digitá-lo explicitamente como uma string. Ou pelo menos, jogue alguma coisa quando isso acontecer (por exemplo, no modo estrito, ou seja o que error_reporting(-1)for).

9) Suporte para vários threads ou algum tipo de retorno de chamada assíncrono / evento. Isso é mais importante ao tentar fazer upload de arquivos grandes via cURL. Em vez de tópicos antigos, algo como o Grand Central Dispatch da Apple seria bom. Ou até algo semelhante ao JavaScript, onde você pode fazer solicitações assíncronas e definir retornos de chamada.

10) Nomenclatura / ordem consistente (ou seja, palheiro de agulhas) seria bom, mas acho que isso poderia ser melhor resolvido com o SPL.

11) Um shell PHP interativo com suporte oficial, como o IRB. O Facebook tem um chamado phpshque foi escrito em Python, mas falta o polonês que eu gostaria de ver.

12) Para a API do Reflection, adicione suporte para (a) comentários do docblock em constantes (global e classe) e (b) suporte para analisar comentários semelhantes ao PHPDoc em uma estrutura de dados sensível. Há um pacote PECL chamado "docblock" que tenta fazer isso, mas não parece que o autor tenha ido muito longe.

Edição: 13) Eu também adoraria ver a capacidade de usar !e ?em nomes de funções - como Ruby pode.


concordo que esse arrayobject deve ser suportado pelas funções array_ *. mas qual seria o resultado esperado para algo como "array_merge" se você considerar subclasses de arrayobject. você só teria permissão para mesclar instâncias da mesma classe e o que array_merge retornaria? uma matriz php ou uma instância de arrayobject (respectivamente é subclasse)?
Harald

Eu diria que, como os dados internamente são uma matriz, e ArrayObject os agrupa com funcionalidade, mesmo as subclasses de ArrayObject ainda estão trabalhando com matrizes internamente. Eu esperaria poder mesclar outra matriz padrão ou ArrayObject (ou subclasse). Quanto ao que retornaria, eu argumentaria que ele também deveria retornar um novo ArrayObject, mas siga o precedente que simplexml_load_string () define onde você pode especificar o nome da classe da qual o resultado deve ser uma instância.
Ryan Parman

12

1) Compreensão de matrizes no estilo de compreensão de lista Python:

$newlist = array($x->something for $x in $oldlist);

//with short array syntax:
$newlist = [$x->something for $x in $oldlist];

2) Sintaxe de matriz curta

$newlist = [1,2,3,4,...];

3) Tornar vazio () não considerar a sequência '0' como verdadeira


2
Eu acho que (1) algo cozido a partir do iterador e do fechamento seria melhor.
StasM

+1 IMHO, isso deve ser incluído em todos os idiomas, bem como nos iteradores. Eles são muito úteis para não ter.
Evan Plaice

empty()é o oposto lógico de if ($x), então faz sentido que empty('0')seja verdadeiro, porque if ('0')é falso. A única diferença é empty()que não lança um aviso se a variável não estiver definida.
Andrew

12

Eu gostaria de ver um método legítimo de criar / definir matrizes CONSTANT. Existem algumas maneiras imprudentes de simular esse tipo de funcionalidade, mas seria bom se fosse apenas um recurso direto do PHP. Seria bom se você pudesse criar uma matriz de maneira semelhante à declaração "final" do Java.

Eu criei um sistema de login que é muito rápido de configurar. Tudo o que você precisa fazer é alterar o conteúdo de uma matriz em um arquivo de texto para especificar os campos que você deseja obter informações do usuário. Utilizando uma variedade de loops, ele lida com tudo, desde geração de formulários e sensibilização de entrada até chamadas de banco de dados, mas tudo depende dessa matriz original.

O arquivo com a matriz é bloqueado com permissões, mas uma vez que a matriz está se movendo no éter, é mutável. Embora eu sinta que o sistema é bastante seguro, não gosto de deixar nada ao acaso. Um método para finalizar matrizes seria bom para uma situação como essa.

Nova ideia!!

Ohhh, pensei em outra coisa que eu realmente gostaria em php. Gostaria de algum tipo de sistema para controlar operações de arquivos php e operações de diretório semelhantes à maneira como o .htaccess funciona.

O arquivo .phpaccess deve acionar algum tipo de mesmo domínio / mesma política de origem.

Por exemplo, se eu estivesse hospedando muitos sites com hosts virtuais, poderia ter um arquivo .phpaccess em um diretório que instruiria o php a verificar a organização de todos os scripts em execução que estão tentando operar no meu diretório protegido. Se o script não vier desse diretório ou de seus subdiretórios, as operações de arquivo / ou operações de soquete serão negadas.

Eu acho que um sistema como esse tornaria a hospedagem virtual um ambiente muito mais seguro. Se você pudesse colocar uma delas na parte superior de cada host virtual, isso diminuiria a chance de alguém encontrar uma maneira de se infiltrar em um host virtual vizinho.

Além disso, se seria bom ter um método de protegê-lo no sentido inverso dessa maneira. ou seja, restringindo o alcance dos scripts em um único diretório para esse diretório.

É o yin e o yang que você sabe!


+1 para final. Para esclarecer: finalsignifica que o valor de uma variável pode ser definido em tempo de execução (ao contrário de constantes, que precisam ser expressões constantes), mas pode ser definido apenas uma vez. Veja também C # 's readonly.
Davidtbernal

1
existe uma proposta de getters / setters para o tronco que substituiria somente a leitura, etc. Arrays imutáveis, porém, provavelmente seriam difíceis de fazer.
StasM

No phpaccess, o PHP já possui um "modo de segurança" que faz o que você descreve.
usar o seguinte

11

Meus dois maiores desejos como programador PHP hardcore:

  1. Suporte finalmente. É uma grande confusão ficcionalmente contornar isso através de bandeiras ou meios semelhantes.
  2. Eu adoraria ver o suporte na sintaxe do C # para getters e setters. Quando você tem muitos getters e setters, uma sintaxe simples, como C #, é um ótimo impulsionador de desempenho, em vez de fazê-lo da maneira Java e escrever métodos getter e setter. Os métodos mágicos são impressionantes nos casos em que você deseja criar membros dinamicamente (por exemplo, se você deseja fornecer algumas variáveis ​​a um representante de modelo para usar), mas não são boas para propriedades normais nas quais você gostaria que o IDE preenchesse automaticamente, conheça tipos e assim por diante. isso ajudaria a tornar o código menor e ainda mais legível e fácil de usar.

1
1. infelizmente, é difícil de fazer, mas definitivamente é um bom item de tarefa
StasM:

@StasM: que tal fazê-lo através de anotações? Algo parecido com: / ** @get getFoo; @set setFoo; * / private $ foo;
Michał T

9

Sintaxe da linguagem : Existem algumas dicas boas em pihipi e phpreboot sobre o que os desenvolvedores estão interessados ​​(embora o phpreboot vá muito longe tornando-se JS).

Metodologia de desenvolvimento : Melhoraria muito a vida útil do PHP.net se essas pesquisas fossem realmente levadas em consideração. Não tome mais decisões de sintaxe da sessão do IRC da tarde à toa ou à tarde.

Recursos individuais : alguns já foram mencionados antes, mas felizmente queimarei algum karma para ser mais franco aqui:

  • Tipo de seqüência de caracteres Unicode.
  • Bigint (consulte Python).
  • Runkit interno para remover / renomear / substituir funções e classes internas, que nem sempre são bem projetadas.
  • OOP moderno
    • herança múltipla (em vez de complexidade para suportar casos extremos com sintaxe de características desajeitadas)
    • escalares podem dobrar como objetos (consulte Python), por exemplo, array () funciona como ArrayObject ou strings como SplString (precisa de métodos utilizáveis, todas as funções de string devem estar disponíveis como str::toupper())
  • Preterir a \sintaxe de namespace de merda , fixar o analisador e adotar ::como alternativa. Você sabe, como uma linguagem real.
  • Qualquer variação do LINQ (embora eu não confie em vocês, crie uma sintaxe sensata)
  • literais ou XML.
  • Livre-se do comportamento do tempo de execução do php.ini e das opções semânticas. Isso tira parte da emoção, é verdade, mas beneficiaria os desenvolvedores e a base de usuários.
  • Sim, as magic_quotes ainda não se foram.
  • Conversão bytecode do Zend Engine para PBC

Embora isso não seja óbvio, eu financiaria com prazer qualquer outra pessoa para fazer o último e eliminaria o php.net como principal implementação. :P
Ah, acabei de notar, é um wiki da comunidade. Portanto, há uma chance de você não estar realmente aqui pelo karma, mas por um interesse genuíno. Nesse caso, examine a <b> questão </b> que prejudica seriamente a linguagem (directorite).


5
Eu odeio a sintaxe \ namespace, mas é uma história longa e triste por que se tornou assim e provavelmente não vai mudar ... Provavelmente, se eu pudesse mudar apenas uma coisa no PHP que seria meu candidato principal. Mas é o que é.
StasM

@StasM: Obrigado pelo feedback e desculpe por ser rude com algumas coisas do PHP, mas eu me preocupo com o PHP; portanto, muito opinativo. - Eu li um pouco sobre o raciocínio. O dilema da barra invertida ainda não é um problema muito grande, mas se tornará no próximo ano, quando as bibliotecas se espalharem. Então, espero que alguém escreva um analisador que reescreva \ cargo \ culto \ classe \ nomes de volta aos esquemas de sublinhado.
mario

Talvez eu seja idiota, mas qual é a diferença se usamos '::' ou '\' para namespaces?
Michał T

@ Tortas: ::Teria sido mais natural para qualquer linguagem fechada de sintaxe C / C ++. E `\` não é apenas anormal entre todas as linguagens de programação, mas possui conotações não testadas. Algumas discussões anteriores: stackoverflow.com/questions/238550/… ou developers.slashdot.org/article.pl?sid=08/10/26/1610259 e reddit.com/r/programming/comments/79cut/… - mas em Em particular, decidir isso sem feedback e sinalizar para a comunidade de desenvolvedores não ser uma ação muito bem-vinda.
mario

1
+ 1000000 para herança múltipla.
ts01

8

Eu adoraria ver a unificação de erros e exceções em um único conceito (exceções). É ótimo poder capturar exceções e gravá-las em um log, para encontrar e corrigir erros dessa maneira. Mas se houver algo fundamentalmente errado (leia-se: Erro do PHP) em um caminho de código que raramente é atingido, não há uma boa maneira de canalizar essas informações para o mesmo banco de dados de problemas.

Por favor, Papai Noel, introduza uma opção no php.ini que transforma todos os erros em exceções - idealmente, exceções que eu posso pegar no meu código.


1
Já existe suporte no mecanismo para isso e muitas extensões o utilizam. Você também pode fazer isso facilmente com set_error_handler () e ErrorException. Cuidado com E_STRICT / E_NOTICE / E_DEPRECATED embora ...
StasM

Estou bem ciente desses métodos e eles são realmente hacky. Eu adoraria uma maneira unificada - aquela que inclui E_STRICT / E_NOTICE e tal.
22410 Alex

7

O PHP combina comigo muito bem, pois é para acessar sites pequenos e médios; Devo ser um pouco sem imaginação, a única coisa que eu poderia pensar como resposta a essa pergunta seria algo que a tornasse melhor para sites de alto tráfego.

Estou pensando em termos de geração de processos para outros núcleos, por exemplo, atualizando um banco de dados em um processo enquanto cria a página de saída em outro processo. Uma rápida pesquisa no Google indica que isso pode ser simulado, mas atualmente não é suportado diretamente no php.


1
Na verdade, pensando mais sobre ele, descarregando banco de dados parece ser cenário interessante, para +1 em que :)
StasM

1
@Stasm, presumo que você queira dizer que solicitações separadas são executadas como processos separados. Estou falando de uma página complexa que requer geração de páginas e computação em segundo plano. Eu posso estar errado, mas acho que não há uma maneira de gerar (por exemplo) operações de atualização de banco de dados em um processo separado. O motivo para fazer isso seria enviar a página ao solicitante mais rapidamente, em vez de esperar por todo o processamento que não está diretamente relacionado à produção da página para seriado em série. PS .. Obrigado pela atualização!
Geekbrit

7

Eu realmente senti falta de que os tipos escalares não sejam tratados como objetos, e objetos reais não podem agir como qualquer outro tipo ou objeto (exceto a string devido a __toString ()).


Sim, métodos mágicos para a tipografia, por favor.
Michał T

7
  • suporte para enumerações (como java 1.5+)
  • Ser capaz de definir tipos de retorno de método, em interfaces e classes
  • suporte para definição de anotações / metadados em propriedades e métodos.
  • ser capaz de fazer sugestões de tipo estritas para argumentos escalares de métodos.

+1 Como eu gostaria de ver todas essas coisas em PHP.
Jeremy

6

Limpe "Notas contribuídas pelo usuário" em http://php.net . Eles são uma verdadeira bagunça às vezes, embora sejam um grande valor em geral.


1
Algum tipo de funcionalidade de votação para cima / para baixo e a capacidade de vincular ao comentário original na resposta certamente seria bom.
Tgr

5

Existem algumas funções de matriz bastante decentes no PHP, fornecendo capacidade de processamento de lista, com retornos de chamada e create_function()fornecendo um cálculo lambda básico.

O principal problema com isso é que, em PHP, é muito detalhado, um sistema de taquigrafia seria excelente, principalmente no que diz respeito aos comandos de mapear / reduzir.

Mais importante, as funções da lista não estão totalmente completas:

  • não há foldrfunção, array_reduce()fornecefoldl
  • array_map()deve passar a chave no segundo argumento, como array_walk()faz
  • um array_map_keys()poderia ser útil para modificação de chave
  • compreensão da lista é muito desajeitado, range(), array_fill()e array_fill_keys()apenas lidar com tantos casos, e array_filter()é separado

Não pretendo transformar o PHP no Haskell, mas o PHP é frequentemente usado para manipulação da estrutura de dados do tipo lista e ter um conjunto completo de ferramentas nesse sentido seria útil.


1
Um colega meu também acha que poderia / deveria haver outras adições nas funções relacionadas à matriz; como mencionado em sua conta do github: Estes são a falta de array_all () e array_any (), que verificam se * uma condição representada por um retorno de chamada é válida para todos ou alguns dos elementos em uma matriz. gist.github.com/44350
kguest

5

Sobrecarga do operador:

$result = $MatrixA + $MatrixB * $MatrixC;

1
Não tenho certeza de quão bem isso seria possível se o PHP fosse uma linguagem de tipo dinâmico.
BoltClock

5
Talvez isso deve ser feito através de métodos mágicos, como __add ($ obj), __times ($ obj) etc.
Michał T

ele já existe como um ext PECL: pecl.php.net/package/operator . Não deve ser muito trabalho para mesclá-lo com a fonte principal
Xananax

4

Adicione exceções em vez de produzir E_WARNING ... É muito irritante não poder usar algo como:

try{
   $f = fopen('asd', 'r');
   flock($f, LOCK_SH);

   while(!feof($f)){
       echo fread($f, 512);
   }

   fclose($f);

}catch(IOException $ex){
   echo 'Oops, something wrong: '.$ex->getCode();
}

Obviamente, atualmente não é muito prático, mas é muito chato receber:

AVISO

AVISO

AVISO

e não consigo controlar o fluxo de código sem escrever meu próprio error_handler e string sniffing que erro foi produzido (permissão, nome de arquivo incorreto ou qualquer outra coisa; não me importo com outras fontes de erros aqui) para gerar a exceção correta .

Espero não ter que explicar por que é importante.

O PHP tornou-se Orientado a Objetos há um tempo e nós, programadores que usamos PHP, estamos ansiosos por recursos de OO, não apresentando "goto" ... Quando eu descobri que realmente aconteceu, pensei que era o dia da mentira.


A menos que capturada, a exceção matará o script. O aviso, em um servidor de produção, será registrado e nunca será exibido ao usuário. Alterar essa funcionalidade agora quebraria muitos scripts porque eles não foram projetados para capturá-la. (Observe que eu escrevo manipuladores de erro para lançar exceções). Agora, as coisas que a DOP pode lançar avisos ou exceções: o programador decide em tempo de execução. Essa funcionalidade é provavelmente uma que deve ser adicionada a mais dos módulos.
precisa saber é o seguinte

4
  1. Consolide o modelo de objeto - faça com que todos os objetos estendam a classe Object básica. A classe Object (entre outras coisas) implementaria todos os métodos mágicos (para que não fossem mais mágicos!)

  2. Mova extensões para seus próprios namespaces - organize o namespace global $conn = new \MySQLi\Connection();

  3. Desfaça a spl_autoload()função! Sério, esse é possivelmente um dos maiores recursos do PHP e também o mais inútil ao mesmo tempo. spl_autoloadé o carregador automático padrão, que suporta namespaces e várias extensões de arquivo, mas, por algum motivo desconhecido, exige que os nomes dos arquivos sejam minúsculos. Há um relatório de bug preenchido para isso , mas a equipe respondeu que não o corrigirá devido à compatibilidade com versões anteriores. Certo ... não é como todo framework é fornecido com seu próprio carregador automático, já que o padrão está aleijado!



4

Traga o suporte ao contaminação para a versão mais recente e inclua-o nas compilações padrão, de preferência ativadas na configuração padrão http://wiki.php.net/rfc/taint

Isso impediria ataques de injeção XSS e SQL, fazendo com que as pessoas codificassem corretamente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.