Quali funzionalità vorresti avere in PHP? [chiuso]


88

Dal momento che è la stagione delle vacanze ora e tutti fanno i desideri, mi chiedo: quali funzionalità linguistiche vorresti che PHP avrebbe aggiunto? Sono interessato ad alcuni suggerimenti / desideri pratici per la lingua. Per pratica intendo:

  1. Qualcosa che può essere praticamente fatto (no: "Vorrei che PHP indovinasse il mio codice e correggesse i bug per me" o "Vorrei che un codice venisse eseguito sotto i 5ms")
  2. Qualcosa che non richiede la modifica di PHP in un'altra lingua (non: "Vorrei che abbandonassero $ segni e usassero lo spazio invece di parentesi graffe" o "Vorrei che PHP fosse compilato, digitato staticamente e avesse # nel suo nome")
  3. Qualcosa che non richiederebbe la rottura di tutto il codice esistente (non: "Rinominiamo 500 funzioni e cambiamo l'ordine dei parametri per loro")
  4. Qualcosa che fa cambiare la lingua o di qualche aspetto interessante di esso (non: "Vorrei che ci fosse l'estensione per supportare il protocollo per XYZ" oppure "Vorrei bug # 12345 sono stati finalmente fisso")
  5. Qualcosa che è più di un rant (non: "Vorrei che PHP non facesse così schifo")

Qualcuno ha degli auguri?

Modifica mod: Stanislav Malyshev è uno sviluppatore principale di PHP.


9
@Stan: Per quanto desideri evitare quel tipo di commento, lo otterrai comunque. I problemi che le persone hanno con PHP sono in gran parte nelle categorie di cose che escludi nel tuo post. [...]
Fishtoaster il

24
[...] Stai dicendo "Come possiamo migliorare l'esperienza di essere colpiti in faccia senza realmente colpirti in faccia?" Voglio dire, sì, prendere un caffè gratis mentre veniamo colpiti in faccia potrebbe essere bello, in realtà non affronta molti dei problemi di fondo con, beh, essere colpiti in faccia. Quindi, mentre spero che tu ottenga alcune risposte utili qui (come già sembrano esserci), non essere sorpreso da quelle non produttive.
Fishtoaster,

5
@Fishtoaster: se PHP si associa ad essere colpito in faccia per te, tienilo lontano. Sicuramente non sei interessato a migliorarlo. Succede così anche se ci sono persone che lo sono. Questo argomento è per loro, non per te. Sono sicuro che questo sito ha molti argomenti anche per te, questo non è uno di questi.
StasM

5
Sto usando come esempio colpire in faccia, una situazione in cui i miglioramenti superficiali non sono così importanti; quando la maggior parte delle persone ha problemi con ciò che sta alla base. Non sto nemmeno bussando al tuo tentativo di ottenere suggerimenti per quei miglioramenti superficiali, sto solo sottolineando il motivo per cui è probabile che tu ottenga alcune risposte inutili, data la situazione.
Fishtoaster,

6
@Fishtoaster: Non tutti, a sorpresa , odiano PHP - Mi è sempre piaciuto. Molto flessibile e veloce (codificare).
Orbling

Risposte:


119

Non mi dispiacerebbe i parametri nominati.

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

Purtroppo gli sviluppatori di PHP hanno già abbattuto questa idea .


1
È la lista del 2005. Molte idee furono chiuse e poi rinate. In realtà, se arriva una buona implementazione, c'è una buona possibilità che venga accettata.
StasM il

21
È la mia funzione preferita di Python. Rende il codice molto auto-documentante.
Keyo,

7
@Josh K: È possibile, va bene, ma la chiamata 'array' è inutile spazzatura, se vuoi. Offusca solo ciò che stai VERAMENTE cercando di fare. Un'altra opzione sarebbe una sintassi abbreviata per gli array: make_img (['src' => 'blah.jpg', ...]);
Erik van Brakel,

2
@Erik: Non è neanche una cattiva opzione, sto dicendo perché aggiungere questo disordine a una lingua quando puoi farlo già con un wrapper di array minore.
Josh K,

4
@Erik: una sintassi più rilassata per le matrici (come l' []operatore JavaScript ) sarebbe una caratteristica apprezzata.
Josh K,

93

Più dereferenziazione:

echo something_that_returns_array()[4];

Altri hanno menzionato parametri nominati e sintassi dell'array più breve. Non mi dispiacerebbe anche la sintassi degli oggetti più corta.

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

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

18
() La sintassi [] è già nel trunk. Sfortunatamente, le scorciatoie di array sono state respinte, ma spero in una risurrezione.
StasM,

2
Mi piacerebbe questa funzionalità. Perché possiamo avere qualcosa_that_returns_object () -> 4, ma non con gli array?
Bala Clark,

4
Javascript come array e le notazioni degli oggetti oscillerebbero. Come sviluppatore front-end è quello che mi disturba di più nel codice php.
Bleep Bloop,

1
@DisgruntledGoat Lo fa, vedi:function something_that_returns_array() { return array( 'a', 'b', 'c', 'd', 'e' ); }
Annika Backstrom,

2
@DisgruntledGoat: Il problema con la ()->sintassi è che funziona solo quando viene restituito un oggetto, a peggiorare le cose, l'oggetto è anche richiesto avere una proprietà / metodo con il nome specificato, che, in modo ottimale, fa quello che speri faccia , pur accettando i parametri che gli hai dato e pregando che non richieda più ... ecc. ecc.
phant0m

72

Dopo aver lavorato con PHP per circa 13 anni, e pesantemente con JS per circa 4, ci sono un paio di cose che penso che PHP farebbe bene a prendere in prestito da JS:

1) notazione abbreviata per array e oggetti. Credo che questo potrebbe essere stato discusso e abbattuto su Internals (quindi sento - non mi piace vedere come è fatta la salsiccia), ma trovo davvero che la notazione letterale per array e oggetti in JS sia un grande vittoria della produttività.

Per esempio:

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

(IMHO) è solo molto più facile da scrivere e più pulito di

$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';

Ho sentito che è stata sollevata una certa preoccupazione per la potenziale confusione, ma in realtà è più confusa di, per esempio, la notazione ereditaria? Almeno, penso che creare un oggetto stdClass in PHP sia abbastanza dettagliato da scoraggiare la pratica.

2) Essere in grado di ridefinire funzioni e metodi precedentemente definiti sarebbe davvero utile. Semplificherebbe in particolare le situazioni estendendo una classe e creare un'istanza della nuova classe è eccessivamente complesso o poco pratico. Penso che dovremmo evitare la ridefinizione delle funzioni e dei metodi core / non-userspace.


Oltre a questi due, penso che PHP debba supportare in modo trasparente Unicode . Questo sta diventando sempre più un problema per gli sviluppatori e le soluzioni attualmente offerte in PHP sono confuse e spesso non performanti. Rendere la funzionalità di stringa standard unicode pronta all'uso sarebbe una grande vittoria per i programmatori PHP.

Grazie per avermelo chiesto!


(2) guarda runkit. (3) Unicode è difficile, soprattutto perché la maggior parte del mondo esterno non è Unicode. Dovremmo o uccidere le prestazioni o richiedere alle persone di fare molto lavoro extra (come fa Java). Ecco perché lo sforzo unicode di php6 non ha funzionato.
StasM il

8
Per quanto riguarda l'unicode: potrebbe essere difficile, ma sarebbe di grande utilità (sicuramente lo sviluppo di PHP stesso è difficile, ma offre grandi benefici, sì?) Forse una soluzione sarebbe quella di abilitare l'unicode trasparente tramite un'estensione con il perfetto compromesso, proprio come XHP? Grazie ancora.
Funkatron,

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

3
Non vedo come puoi vedere "la maggior parte del mondo esterno non è unicode"? Stai parlando di persone? O qualcos'altro? Perché la stragrande maggioranza delle persone nel mondo (con un enorme margine) parla lingue che sono meglio rappresentate da Unicode.
Dean Harding,

1
Sicuramente supporto Unicode. La spedizione di qualsiasi tipo di app utilizzata a livello globale non è un inizio senza di essa. Indipendentemente dal fatto che gli sviluppatori PHP pensino che l'ingegnerizzazione in un supporto unicode decente sia semplice o no, non è un problema. Le persone ne hanno bisogno e si stanno facendo strada tra i fallimenti della piattaforma per farlo. Delphi lo ha fatto aggiungendo un altro tipo di stringa e rendendolo predefinito, con casting implicito e un interruttore globale per ripristinare il vecchio comportamento. Perché PHP non può farlo allo stesso modo?
Joeri Sebrechts,

48

Cose che vorrei, come ex apologista PHP di lunga data:

  1. Sintassi più breve per le matrici. Gli array PHP sono una delle caratteristiche più sorprendenti del linguaggio a causa della loro flessibilità, ma è un tiro da scrivere some_array_method($argity, array('key' => $value));. Credo che questa proposta sia già stata sviscerata nella mailing list di PHP, sfortunatamente.
  2. finally supporto
  3. Attributi / annotazioni. Questi consentono di aggiungere un comportamento personalizzato a un metodo in modo da consentire il riutilizzo del codice. Ad esempio, in un framework MVC, si potrebbe definire un AuthorizeAttributeche indicherebbe che un controller o un metodo di azione richiede che l'utente sia autorizzato. Il quadro stesso sarebbe responsabile della ricerca degli attributi e della loro azione di conseguenza. Credo che PHPUnit utilizzi già una sorta di attributo inserendoli nei commenti di docblock, che possono essere letti usando la riflessione, ma inserire la funzionalità effettiva nei commenti di docblock è sicuramente un trucco.
  4. Sintassi lambda più breve. Invece di dover scrivere function($x){ return $x*2;}, forse potrei scrivere $x => return $x*2, o qualcosa del genere. Questo è ancora qualcosa che rende un po 'trascinabile usare questa funzione. Ad esempio $results = array_filter(array(1,2,3), function($a) { return $a % 2; }):vs $results = array_filter(array(1,2,3), $a => return $a % 2 );Il primo ha solo molto più impianto idraulico che è sostanzialmente irrilevante per il lavoro effettivo che stai cercando di realizzare.
  5. Un built-in Decimal(matematica a virgola fissa) che supportasse le operazioni matematiche attraverso gli operatori normali sarebbe abbastanza carino, dal momento che non abbiamo un sovraccarico da parte dell'operatore.
  6. METODI MAGICI DEL MOAR. I metodi magici sono fantastici. Ho potuto vedere PHP aggiungere un sovraccarico dell'operatore tramite metodi magici (so che questo non accadrà praticamente mai). Ma in generale, forniscono davvero ottimi modi per agganciarsi al linguaggio e fare cose interessanti.

48

Rendi PHP veramente orientato agli oggetti. L' slap on another global functionevoluzione di PHP deve finire.

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

Per me è difficile da leggere. Devo creare il mio stack mentale e compilarlo da solo. Fondamentalmente dovrebbe leggere al contrario. $dog->wakeup()->bark();è facile da leggere rispetto abark(wakeup($dog))

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

Hai fatto il passo verso l'abilitazione del supporto oggetto / metodo ora per favore usalo nelle effettive funzioni PHP di base.

Rinominiamo 500 funzioni e cambiamo l'ordine dei parametri per esse.

Lo spostamento di questa funzionalità sui metodi consentirebbe loro di essere rinominati usando alcuni in modo coerente. Romperebbe la retrocompatibilità se stringhe e array avessero i loro metodi?


3
Penso che l'array non sia un tipo di oggetto sia un grosso errore in PHP. Porta a tutti i tipi di problemi. Sfortunatamente, è una cosa evolutiva. Puoi fare quello che vuoi qui con l'estensione o lo spazio utenti però. Probabilmente si adatterebbe bene a SPL.
StasM il

3
Lo stesso argomento si applica alle stringhe. Mi riferisco solo alla mancanza di metodi in generale. Lingue come Java, Python, C # ecc. Hanno tutte un codice molto più leggibile. Immagino che tu stia cercando funzionalità, ma correggere ciò che è rotto dall'IMO sarebbe un miglior risultato.
Keyo,

6
No, non essere sciocco. Sarebbedog_wake_up($dog); bark_dog($dog);
Matchu, il

2
IMHO, tutti i nuovi metodi di stringa dovrebbero aspettarsi ed emettere UTF-8 e generare eccezioni se l'input non è valido UTF-8. Ciò ridurrebbe notevolmente la necessità di un'importante rielaborazione del supporto Unicode.
rjmunro,

1
@luiscubal No. Un parametro aggiuntivo significa che non possiamo aggiungere parametri in seguito se inventiamo cose nuove da aggiungere alla funzione. Ad esempio, se $ string => trim () facesse solo spazi bianchi (come prima della 4.1.0), il sistema direbbe $ string => trim ('ISO-8859-1') tagliato gli spazi bianchi dalle stringhe ISO-8859-1 . Se poi volessimo essere in grado di tagliare elementi che non erano spazi bianchi, non saremmo in grado di aggiungere il parametro per quello, a meno che non induciamo le persone a specificare prima la codifica. Dovremmo incoraggiare le persone a credere che qualsiasi testo che non sia UTF-8 sia sbagliato .
rjmunro,

40

Un motore di query integrato nella lingua sarebbe fantastico. Un po 'come quello che è disponibile in .NET chiamato LINQ. Aiuterebbe l'ordinamento attraverso enormi matrici di dati e standardizzerebbe l'accesso al database, in modo che meno attacchi SQL injection abbiano successo.


2
Tutto ciò che semplifica le query con parametri ottiene il mio voto!
Dean Harding,

1
Penso che l'accesso al database standardizzato sia in realtà un vantaggio molto importante di qualcosa come LINQ, perché penso che semplifichi i test di unità con simulazioni dei tuoi oggetti di database (dato che stai deridendo il codice PHP anziché le query SQL.)
davidtbernal

non penso che qualcosa del genere dovrebbe entrare nel vivo. sarebbe meglio adattarsi in un'estensione PECL
Harald

38

Oh. Tipo di suggerimento per i primitivi. Sarebbe carino.


1
Anche se mi piace il principio KISS di PHP (in larga misura), lo sostengo fortemente. Il motivo è che se vuoi essere davvero difensivo, finisci con lo stesso tipo controllando il codice in ogni metodo setter. Potremmo facilmente abbandonarlo se la lingua lo supportasse in modo nativo.
MicE

4
"Tipo di suggerimento" era un nome molto sfortunato, in quanto non è "un suggerimento", è una battitura rigorosa. Penso che la tipizzazione rigorosa primitiva sarebbe fuori posto in un linguaggio dinamico come PHP. La digitazione coercitiva (la stessa cosa che fanno le funzioni interne - prova strlen (123)) potrebbe essere OK.
StasM il

6
+1 per questo. Digitare un suggerimento (o una tipizzazione rigorosa) nelle dichiarazioni di funzioni sarebbe incredibilmente utile e ridurrebbe così tanto se (! Is_int ()) merda in OGNI E OGNI metodo.
Phil Sturgeon,

5
@StasM Non sono d'accordo. È perfettamente nell'ambito di un linguaggio dinamico per consentire all'utente di scegliere di utilizzare la lingua in modo tipicamente statico. E consentirebbe una cattura degli errori molto migliore. Non dovresti usarlo se non volessi, ma personalmente sono stufo di avere le stringhe passate dove volevo un int e quindi dover cercare nel codice per capire dove viene passata la stupida stringa Altrimenti, digita tutto per tutto il tempo.
Daniel Bingham,

2
@StasM Non c'è assolutamente alcun motivo per cui si debbano introdurre variabili tipicamente statiche. Sì, dovresti spostare gli errori nel tuo codice. Questo sarebbe il punto. L'errore si verificherebbe al momento della chiamata della funzione anziché all'interno della funzione, il che non lascia alcuna idea di dove si stia verificando l'errore. Per quanto riguarda gli errori di conversione del tipo, si verificherebbe l'errore - sì in fase di esecuzione - alla chiamata della funzione. Risolvi il problema convertendolo proprio nel tipo corretto. Molto meglio che avere una stringa apparire in una funzione in attesa di un int e non sapere da dove.
Daniel Bingham,

34

Vorrei davvero un supporto Unicode pronto all'uso. Molte lingue si muovono in quella direzione ma PHP ha ancora strani comandi disseminati dappertutto.

Le stringhe PHP sono solo array di byte semplici. Il loro contenuto non è portatile in quanto dipende dalla codifica predefinita corrente.

Lo stesso vale per la rappresentazione creata da serialize. Contiene una rappresentazione di byte con prefisso di lunghezza della stringa senza effettivamente memorizzare alcuna informazione di codifica.

La maggior parte delle funzioni di PHP (stringa) non ha idea di Unicode. Per un elenco dettagliato comprendente il livello di rischio di ciascuna funzione, fare riferimento a: http://www.phpwact.org/php/i18n/utf-8

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


Il supporto Unicode si è rivelato molto più difficile di quanto si pensasse. Ecco perché lo sforzo di php6 è stato bloccato. Per ora, abbiamo utf-8 e penso che la cosa migliore da fare sarebbe aggiungere il supporto utf-8 per le funzioni di stringa, forse come parte dell'estensione intl.
StasM,

3
A proposito, la citazione non è corretta. Le stringhe PHP sono array di byte, ma il loro contenuto è portatile come lo si crea e non dipende dalla "codifica predefinita" - è solo una matrice di byte, li vuoi in utf8, metti utf8, vuoi utf16 - metti utf16. Il link phpwact.org sembra essere morto.
StasM il

1
Spero davvero che l'estensione intl sia abilitata di default, quindi le persone che avevano bisogno di UTF-8 (non tutti?) Non hanno dovuto combattere i loro host per far sì che le funzioni di stringa si comportassero come previsto.
Emil Stenström,

Inoltre, grazie per il chiarimento sulle stringhe. Sono stato lontano da PHP per un po 'di tempo, quindi sono un po' arrugginito. Ho invece combattuto la guerra unicode con Python, che ha problemi simili a quelli di PHP, ma li risolve in Python 3. Avere un "ö" svedese nel tuo nome è un disastro :)
Emil Stenström,

Questa è sicuramente un'area in cui mi piacerebbe vedere un miglioramento.
Nathan Osman il

32

Crea stringhe come oggetti, con metodi integrati per sostituire quelli non nominati e parametrizzati in modo incoerente. per esempio

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

eccetera.

Modifica: un'altra cosa: questi metodi dovrebbero sempre prevedere ed emettere UTF-8, ad eccezione di quelli specificamente previsti per gestire le codifiche. Se l'input non è valido UTF-8, dovrebbe essere generata un'eccezione, anche se l'output della funzione non sarà influenzato dalla codifica.


su, è esattamente quello a cui sto puntando.
Kemo,

1
subject->verb(object), semplifica la memorizzazione dell'ordine dei parametri.
Ming-Tang,

+1 Ho giocato con la creazione della mia classe di stringhe per fare questo genere di cose, rende la codifica molto più semplice e non dimentichi mai l'ordinamento dei parametri.
SconcertatoGoat

2
Quindi cosa sarebbe is_object($string)tornato? Ciò interromperebbe alla grande la retrocompatibilità, o porterebbe all'introduzione di oggetti quasi non intuitivi quasi-ma-non-del-tutto.
Tgr

@Tgr: is_object () dovrebbe essere deprecato - Non ci dovrebbe essere qualcosa come "non un oggetto". A breve termine, dovrebbe essere una proprietà che è possibile disattivare su qualsiasi oggetto e i costruttori di stringhe predefiniti lo disattiverebbero.
rjmunro,

24

1) Mi piacerebbe che gli oggetti appena istanziati restituissero "$ this" in modo da poter eseguire il metodo chain, $ user = new User ('john') -> setLastName ('Doe') -> save ();

2) Se hai mai usato ruby ​​e il nodo più recente, hanno una grande shell interattiva (IRB). Mi piacerebbe che PHP ne avesse uno effettivamente utile.

3) Tratti / Mixin, ma ho sentito che stanno arrivando.

4) Voglio secondare l'array corto $ myArray = ['my', 'array'];

5) Denominazione / ordine coerenti (ad es. Pagliaio dell'ago)


Odio dover creare un create()metodo che non fa nulla di speciale solo per aggirare il n. 1!
Alan Pearce,

Faccio lo stesso ma, usando l'associazione statica tardiva e una superclasse di oggetti, in questo modo ogni classe che estende la mia superclasse ha il metodo, ad esempio: SomceClass estende SuperObject {}; SomeClass :: Create () -> someMethod ();
dukeofgaming il

Dai un'occhiata a github.com/philsturgeon/php-ps È solo l'inizio, ma con un po 'di aiuto potrebbe essere molto utile.
Phil Sturgeon,

1
C'è anche un pacchetto PEAR che offre una shell interattiva per la codifica di esperimenti rapidi in PHP - disponibile su pear.php.net/package/PHP_Shell
kguest

(new Foo ()) -> bar () fa parte di 5.4. 3) e 4) lo sono anche.
StasM,

20

1) si prega di sbarazzarsi di include (). I riferimenti ad altri file dovrebbero essere riferimenti e non posizionare effettivamente il contenuto di un file di codice sorgente in un altro. Troppi programmatori PHP usano include () come un tipo di chiamata di funzione piuttosto che un mezzo per fare riferimento a una libreria. Questo porta a ogni sorta di ambiguità nello stato variabile e nel codice instabile. Sostituiscilo con un comando "usa" simile al Perl.

2) Si prega di fornire un out of the box metodo di compilazione un'applicazione PHP in un unico file bytecode distribuibile o eseguibile. Ciò migliorerà notevolmente il fascino di PHP come linguaggio di sviluppo commerciale. Questo dovrebbe essere un componente di base della lingua. Non preoccuparti dei file html utilizzati per la GUI di un'applicazione perché ...

3) si prega di sbarazzarsi della possibilità di incorporare i tag PHP in HTML. O almeno fornire una modalità "no embed". Questo è un casino assoluto e incoraggia la cattiva progettazione mescolando insieme logica dell'applicazione e presentazione. Gli sviluppatori dovrebbero utilizzare i modelli per la visualizzazione e non mettere insieme i file PHP e sperare nel meglio.

firmato,

GrandmasterB

ps: non ascoltare ciò che dicono gli altri qui, sono stato carino tutto l'anno


37
1). Include sono fantastici. Tutto ha incluso. 2). Questo è buono. 3) Il templating è la caratteristica più forte di PHP . Costringerti ad usare qualche altra stronzata da templating sarebbe una mossa molto brutta.
Josh K,

8
Mi piacciono (1) e (2), ma (3) sembra un passo retrogrado. PHP ti dà il potere del modello, dipende da te se lo usi saggiamente o no.
geekbrit,

11
3 non ha senso: l'incorporamento dei tag è necessario per qualsiasi V nei framework MVC.
Alex,

9
Ho letto questa risposta come "Caro Babbo Natale, per favore fai in modo che PHP non sia PHP."
Stephen,

1
3 è subito, poiché PHP è un linguaggio di template.
Andrew,

18

Una direttiva ini E_ERRORsu costanti indefinite, piuttosto che assumere che sia una stringa E_NOTICE.


1
Le costanti di classe lo fanno, tra l'altro.
StasM,

4
Seriamente non capisco perché inducono PHP ad assumere stringhe non quotate. È la cosa più stupida di sempre. Vorrei scegliere E_ERRORo E_PARSE.
BoltClock,

14

Normalizza lo spazio dei nomi globale con una convenzione di denominazione ben ponderata che abbia senso per i nuovi arrivati!

Per citare il nostro amato Jeff Atwood: PHP fa schifo ma non importa !


1
Sono d'accordo in linea di principio, ma non ho idea di come farlo in pratica :)
StasM il

3
@StasM: Immagino che il primo passo sarebbe quello di rendere le nuove versioni delle librerie spaziate dai nomi e consentire ai programmatori (tramite le impostazioni ini) di disabilitare le librerie attualmente globali. Penso che un pacchetto di compatibilità sarebbe in ordine per le versioni precedenti, ma non dovrebbe essere molto difficile da scrivere.
Michał T,


13

1) Sintassi più breve di array / oggetti, come JavaScript (come menzionato in precedenza)

2) Consenti constalle variabili di consentire il risultato di un calcolo come define()fa.

3) Concatenare direttamente dal costruttore: new User()->name('Ryan');

4) Dereferenziazione di array: something_that_returns_array()[4];

5) Supporto SPL espanso. SPL fa un buon lavoro nel reinventare le funzioni stringa e array (tra le altre cose) come oggetti. L'espansione di SPL potrebbe risolvere molte lamentele sul fatto che la lingua sia così stravagante.

6) L'uso ArrayObject()deve essere trasparente come l'uso array(). Dovresti essere in grado di fare cose come array_filter($array_object_instance)senza farlo array_filter($array_object_instance->getArrayCopy()). Anche meglio, ovviamente, sarebbe $array_object_instance->filter().

7) Unicode completo sarebbe carino.

8) Smetti di fare strane conversioni di tipo automatico. Ad esempio, non dovresti essere in grado di echocreare un oggetto SimpleXMLElement senza prima averlo digitato in modo esplicito come stringa. O almeno, lancia qualcosa quando succede (ad es. In modalità rigorosa o qualunque sia la modalità error_reporting(-1)).

9) Supporto per più thread o una sorta di callback con evento / asincrono. Ciò è importante soprattutto quando si tenta di caricare file di grandi dimensioni tramite cURL. Invece di thread vecchio stile, qualcosa come Grand Central Dispatch di Apple sarebbe bello. O anche qualcosa di simile a JavaScript in cui è possibile effettuare richieste asincrone e definire callback.

10) La denominazione / ordine coerente (ad es. Pagliaio ad ago) sarebbe bello, ma penso che questo potrebbe essere risolto meglio con SPL.

11) Una shell PHP interattiva ufficialmente supportata, come IRB. Facebook ha una chiamata phpshche è stata scritta in Python, ma manca dello smalto che vorrei vedere.

12) Per l'API di Reflection, aggiungi il supporto per (a) commenti docblock su costanti (globale e di classe) e (b) supporto per l'analisi di commenti simili a PHPDoc in una struttura di dati sensibile. Esiste un pacchetto PECL chiamato "docblock" che tenta di farlo, ma non sembra che l'autore sia andato molto lontano.

EDIT: 13) Mi piacerebbe anche vedere la capacità di usare !e ?nei nomi delle funzioni - come può fare Ruby.


Sono d'accordo, che arrayobject dovrebbe essere supportato per le funzioni array_ *. ma quale sarebbe il risultato atteso per qualcosa come "array_merge" se si considerano le sottoclassi di arrayobject. ti sarebbe permesso di unire solo istanze della stessa classe e cosa restituirebbe array_merge? un array php o un'istanza di arrayobject (rispettivamente è una sottoclasse)?
harald

Direi che dal momento che i dati internamente sono un array e ArrayObject lo avvolge con funzionalità, anche le sottoclassi di ArrayObject funzionerebbero comunque con gli array internamente. Mi aspetterei di poter unire un altro array standard o ArrayObject (o sottoclasse). Per quanto riguarda ciò che restituirebbe, direi che dovrebbe anche restituire un nuovo ArrayObject, ma seguire il precedente set simplexml_load_string () in cui è possibile specificare il nome della classe di cui il risultato dovrebbe essere un'istanza.
Ryan Parman,

12

1) Comprensione dell'array nello stile di comprensione dell'elenco Python:

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

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

2) Sintassi dell'array breve

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

3) Rendi vuoto () non considerare la stringa '0' come vera


2
Penso che per (1) qualcosa di cucinato da iteratore e chiusura sarebbe meglio.
StasM il

+1 IMHO, questo dovrebbe essere incluso in tutte le lingue, così come gli iteratori. Sono solo un modo per non avere utile.
Evan Plaice,

empty()è l'opposto logico di if ($x), quindi ha senso che empty('0')è vero, perché if ('0')è falso. L'unica differenza è empty()che non lancia un avviso se la variabile non è impostata.
Andrew,

12

Vorrei vedere un metodo legittimo per creare / definire array COSTANTI. Ci sono alcuni modi per simulare questo tipo di funzionalità, ma sarebbe bello se fosse solo una caratteristica di PHP. Sarebbe bello se si potesse creare un array in modo simile alla dichiarazione "finale" di Java.

Ho creato un sistema di accesso che è molto veloce da configurare. Tutto quello che devi fare è cambiare il contenuto di un array in un file di testo per specificare i campi desiderati per le informazioni dell'utente. Utilizzando una serie di cicli for gestisce tutto, dalla generazione di moduli e sensibilizzazione dell'input, alle chiamate al database, ma tutto dipende da questo array originale.

Il file con l'array viene bloccato con autorizzazioni, ma una volta che l'array si sposta nell'etere è mutabile. Sebbene ritenga che il sistema sia piuttosto sicuro, non mi piace lasciare nulla al caso. Un metodo per finalizzare le matrici sarebbe utile per una situazione come questa.

Nuova idea!!

Ohhh, ho pensato a qualcos'altro che mi sarebbe davvero piaciuto in php. Vorrei un qualche tipo di sistema per controllare le operazioni dei file php e le operazioni di directory simili al modo in cui funziona .htaccess.

Il file .phpaccess dovrebbe attivare alcuni tipi di dominio / criteri di origine uguali.

Ad esempio, se ospitassi molti siti con host virtuali, potrei avere un file .phpaccess in una directory che direbbe a php di controllare l'origine di tutti gli script in esecuzione che stanno cercando di operare sulla mia directory protetta. Se lo script non proviene da quella directory o dalle sue sottodirectory, le operazioni sui file / o sui socket verranno negate.

Penso che un sistema come questo renderebbe l'hosting virtuale un ambiente molto più sicuro. Se si potesse collocare uno di questi nella parte superiore di ciascun host virtuale, si ridurrebbe la possibilità che qualcuno trovi un modo per intrufolarsi da un host virtuale vicino.

Anche se sarebbe bene avere un metodo per proteggerlo al contrario di questo modo. vale a dire, limitare la portata degli script in una singola directory a quella directory.

È lo yin e lo yang che sai!


+1 per final. Per chiarire: finalsignifica che il valore di una variabile può essere impostato in fase di esecuzione (a differenza delle costanti, che devono essere espressioni costanti), ma può essere impostato solo una volta. Vedi anche C # readonly.
davidtbernal,

1
c'è una proposta per getter / setter per trunk che supererebbe di sola lettura, ecc. Matrici immutabili sebbene probabilmente sarebbe difficile da fare.
StasM,

Per quanto riguarda il phpaccess, PHP ha già una "modalità sicura" che fa ciò che descrivi.
SconcertatoGoat

11

I miei due più grandi desideri come programmatore PHP hardcore:

  1. Sostieni finalmente. È un grande casino aggirare immaginariamente questo attraverso bandiere o mezzi simili.
  2. Mi piacerebbe vedere il supporto sulla sintassi di C # per getter e setter. Quando hai molti getter e setter, una semplice sintassi come quella di C # è un ottimo booster di prestazioni invece di farlo nel modo Java e scrivere metodi getter e setter. I metodi magici sono fantastici nei casi in cui si desidera creare membri in modo dinamico (ad esempio, se si desidera dare a un renderer di modelli alcune variabili da utilizzare), ma non sono utili per le proprietà normali su cui si desidera che l'IDE si completi automaticamente, conoscere i loro tipi e così via. ciò contribuirebbe a rendere il codice più piccolo, comunque leggibile e facile da usare.

1
1. sfortunatamente, è difficile da fare, ma sicuramente un buon elemento da fare 2. wiki.php.net/rfc/propertygetsetsyntax
StasM

@StasM: che ne dici di farlo tramite le anotazioni? Qualcosa sulla falsariga di: / ** @get getFoo; @set setFoo; * / private $ foo;
Michał T,

9

Sintassi del linguaggio : ci sono alcuni buoni indizi in pihipi e phpreboot di ciò che gli sviluppatori sono interessati (anche se phpreboot si spinge troppo oltre diventando JS).

Metodologia di sviluppo : migliorerebbe notevolmente la durata di vita di PHP.net se tali sondaggi fossero effettivamente presi in considerazione. Non prendere più decisioni sulla sintassi della sessione IRC pomeridiana.

Caratteristiche individuali : alcune sono state menzionate in precedenza, ma brucerò felicemente un po 'di karma per essere più schietto qui:

  • Tipo di stringa Unicode.
  • Bigint (vedi Python).
  • Runkit builtin per rimuovere / rinominare / sovrascrivere funzioni e classi integrate, che non sono sempre così ben progettate.
  • OOP moderno
    • ereditarietà multipla (anziché complessità per supportare raramente casi limite con sintassi di tratti goffi)
    • gli scalari possono raddoppiare come oggetti (vedi Python), ad esempio array () funziona come ArrayObject o stringhe come SplString (necessita di metodi utilizzabili, tutte le funzioni stringa dovrebbero essere disponibili come str::toupper())
  • Deprecare la \sintassi dello spazio dei nomi di merda di merda , correggere il parser e adottare ::come alternativa. Sai, come una vera lingua.
  • Qualsiasi variazione di LINQ (anche se non mi fido di voi ragazzi escogitate una sintassi ragionevole)
  • o letterali XML.
  • Sbarazzarsi del comportamento di runtime php.ini e degli switch semantici. Elimina un po 'di entusiasmo, vero, ma gioverebbe a sviluppatori e utenti.
  • Sì, i magic_quotes non sono ancora spariti.
  • Converti il ​​bytecode di Zend Engine in PBC

Anche se, se ciò non fosse ovvio, finanzerei felicemente chiunque altro per fare quest'ultimo, e uccidere php.net come implementazione principale. :P
Oh, ho appena notato, è wiki della community. Quindi c'è la possibilità che tu non sia qui per il karma, ma un interesse genuino. In tal caso, esaminare il <b> problema </b> che danneggia gravemente la lingua (directorite).


5
Odio la sintassi di \ namespace, ma è una storia lunga e triste il motivo per cui è diventata così e probabilmente non cambierà ... Probabilmente se potessi cambiare solo una cosa in PHP sarebbe il mio candidato principale. Ma è quello che è.
StasM

@StasM: Grazie per il feedback e mi dispiace per essere stato scortese su alcune cose di PHP, ma mi importa di PHP; quindi molto supponente. - Ho letto un po 'del ragionamento. Il dilemma della barra rovesciata non è ancora un grosso problema, ma diventerà il prossimo anno quando le biblioteche si diffonderanno. Quindi spero che qualcuno scriva un parser che riscriva i nomi \ cargo \ cult \ class \ per sottolineare gli schemi.
mario

Forse sono stupido, ma qual è la differenza se usiamo '::' o '\' per gli spazi dei nomi?
Michał T,

@Pies: ::sarebbe stato più naturale per qualsiasi linguaggio di sintassi C / C ++ vicino. E `\` non è solo anormale tra tutti i linguaggi di programmazione, ma ha connotazioni non testate. Alcune discussioni precedenti: stackoverflow.com/questions/238550/… o developers.slashdot.org/article.pl?sid=08/10/26/1610259 e reddit.com/r/programming/comments/79cut/… - Ma in decidere in particolare che senza feedback e segnalando alla comunità di sviluppatori di risucchiarlo non è stata una mossa molto gradita.
mario

1
+ 1000000 per eredità multipla.
ts01,

8

Mi piacerebbe vedere l'unificazione di errori ed eccezioni in un unico concetto (eccezioni). È fantastico essere in grado di rilevare le eccezioni e scriverle in un registro, per trovare e correggere i bug in quel modo. Ma se c'è qualcosa di fondamentalmente sbagliato (leggi: Errore PHP) in un codepath che viene colpito molto raramente, non c'è un buon modo per incanalare quelle informazioni nello stesso database di problemi.

Per favore, Babbo Natale, introduce un interruttore in php.ini che trasformerebbe tutti gli errori in eccezioni - idealmente, eccezioni che posso catturare nel mio codice.


1
C'è già supporto nel motore per questo e molte estensioni lo usano. Puoi anche farlo facilmente con set_error_handler () ed ErrorException. Attenzione a E_STRICT / E_NOTICE / E_DEPRECATED però ...
StasM

Sono ben consapevole di questi metodi e sono davvero confusi. Mi piacerebbe un modo unificato - quello che include E_STRICT / E_NOTICE e simili.
Alex,

7

PHP mi sta benissimo, così come lo è per abbattere siti Web di piccole e medie dimensioni; Devo essere un po 'privo di immaginazione, l'unica cosa che potrei pensare come risposta a questa domanda sarebbe qualcosa che la riduca meglio per i siti ad alto traffico.

Sto pensando in termini di spawn di processi ad altri core, ad esempio l'aggiornamento di un database in un processo mentre si crea la pagina di output in un altro processo. Una rapida ricerca su Google indica che questo può essere simulato, ma al momento non è supportato direttamente in php.


1
In realtà, a pensarci meglio, lo scarico del database sembra essere uno scenario interessante, quindi +1 su quello :)
StasM

1
@Stasm, presumo tu intenda che le richieste separate vengono eseguite come processi separati. Sto parlando di una pagina complessa che richiede la generazione di pagine e il calcolo in background. Potrei sbagliarmi, ma non credo che ci sia un modo per generare (ad esempio) operazioni di aggiornamento del database in un processo separato. Il motivo per farlo sarebbe quello di ottenere prima la pagina inviata al richiedente, piuttosto che dover attendere che tutta l'elaborazione che non è direttamente correlata alla produzione della pagina venga completata in serie. PS .. Grazie per l'aggiornamento!
geekbrit,

7

Mi è davvero mancato che i tipi scalari non siano trattati come oggetti e gli oggetti reali non possono agire come qualsiasi altro tipo o oggetto (tranne la stringa dovuta a __toString ()).


Sì, metodi magici per la tipografia, per favore.
Michał T,

7
  • supporto per le enumerazioni (come java 1.5+)
  • Essere in grado di definire i tipi di restituzione del metodo, in interfacce e classi
  • supporto per la definizione di annotazioni / metadati su proprietà e metodi.
  • essere in grado di eseguire suggerimenti di tipo rigoroso per argomenti scalari di metodo.

+1 Come mi piacerebbe vedere tutte quelle cose in PHP.
Jeremy,

6

Pulisci "Note fornite dall'utente" su http://php.net . A volte sono un vero casino, pur essendo un grande valore in generale.


1
Una sorta di voto su / giù funzionalità e la possibilità di collegarsi al commento originale nella risposta sarebbe sicuramente piacevole.
Tgr

5

Ci sono alcune funzioni di array abbastanza decenti in PHP, che forniscono capacità di elaborazione delle liste, con callback e che create_function()forniscono un calcolo lambda di base.

Il problema principale è che è troppo prolisso in PHP, un sistema abbreviato sarebbe eccellente, in particolare per quanto riguarda i comandi map / ridurre.

Ancora più importante, le funzioni dell'elenco non sono completamente complete:

  • non c'è alcuna foldrfunzione, array_reduce()forniscefoldl
  • array_map()dovrebbe passare la chiave nel secondo argomento, come array_walk()fa
  • una array_map_keys()potrebbe essere utile per la modifica chiave
  • la comprensione dell'elenco è molto complessa range(), array_fill()e array_fill_keys()gestisce solo così tanti casi ed array_filter()è separata

Non sto puntando a far entrare PHP in Haskell, ma PHP è spesso usato per manipolare la struttura dei dati di tipo elenco e avere un set completo di strumenti in questo senso sarebbe utile.


1
Un mio collega pensa anche che potrebbero / dovrebbero esserci altre aggiunte relative alle funzioni relative all'array; menzionato nel suo account github: Questi sono la mancanza di array_all () e array_any (), che controllano se * una condizione rappresentata da un callback vale per tutti o uno qualsiasi degli elementi di un array. gist.github.com/44350
kguest

5

Sovraccarico dell'operatore:

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

1
Non sono sicuro di come questo farebbe clic con PHP come linguaggio tipizzato in modo dinamico.
BoltClock,

5
Forse dovrebbe essere fatto con metodi magici, come __add ($ obj), __times ($ obj) ecc.
Michał T

esiste già come ext PECL: pecl.php.net/package/operator . Non dovrebbe essere troppo lavoro per fonderlo con la fonte principale
Xananax,

4

Aggiungi eccezioni invece di produrre E_WARNING ... È molto fastidioso non poter usare qualcosa come:

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();
}

Naturalmente, attualmente non è molto pratico ma è molto fastidioso ricevere:

AVVERTIMENTO

AVVERTIMENTO

AVVERTIMENTO

e non riesco a controllare il flusso di codice senza scrivere il mio gestore_errore e annusare la stringa quale errore è stato prodotto (permesso, nome file errato o altro; non mi dispiace per altre fonti di errori qui) al fine di gettare la corretta eccezione .

Spero di non dover spiegare perché è importante.

PHP è diventato orientato agli oggetti un po 'di tempo fa e noi programmatori che usano PHP non vediamo l'ora di vedere le funzionalità di OO, non introducendo "goto" ... Quando ho scoperto che è successo, ho pensato che fosse un pesce d'aprile.


Se non colto, l'eccezione ucciderà lo script. L'avviso, su un server di produzione, verrà registrato e mai visualizzato all'utente. La modifica di questa funzionalità ora interromperà molti script perché non sono progettati per catturarlo. (Nota che scrivo gestori di errori per generare eccezioni da solo). Ora, le cose che il PDO può generare avvisi o eccezioni: il programmatore decide in fase di esecuzione. Quella funzionalità è probabilmente quella che dovrebbe essere aggiunta a più moduli.
Reece45,

4
  1. Consolida il modello a oggetti: estendi tutti gli oggetti alla classe di oggetti base. La classe Object avrebbe (tra le altre cose) implementato tutti i metodi magici (quindi non sarebbero più magici!)

  2. Sposta le estensioni nei loro spazi dei nomi: disordinare lo spazio dei nomi globale $conn = new \MySQLi\Connection();

  3. Disattiva la spl_autoload()funzione! Seriamente, questa è forse una delle più grandi caratteristiche di PHP e anche la più inutile allo stesso tempo. spl_autoloadè il caricatore automatico predefinito, che supporta spazi dei nomi ed estensioni di file multiple, ma per qualche ragione sconosciuta richiede che i nomi dei file siano minuscoli. È stato compilato un rapporto sui bug per questo , ma il personale ha risposto che non lo riparerà a causa della retrocompatibilità. Giusto ... non è come se ogni framework venisse fornito con il proprio caricatore automatico, dato che quello predefinito è paralizzato!



4

Porta il supporto taint all'ultima versione e includilo nelle build standard, preferibilmente attivato nella configurazione predefinita http://wiki.php.net/rfc/taint

Ciò impedirebbe attacchi di iniezione XSS e SQL rendendo il codice persone corretto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.