Jakie funkcje chciałbyś mieć w PHP? [Zamknięte]


88

Ponieważ jest teraz sezon wakacyjny i wszyscy składają życzenia, zastanawiam się - jakie funkcje językowe chciałbyś dodać PHP? Interesują mnie praktyczne sugestie / życzenia dotyczące języka. Przez praktyczne rozumiem:

  1. Coś, co można praktycznie zrobić (nie: „Chciałbym, żeby PHP odgadł, co oznacza mój kod i naprawił dla mnie błędy” lub „Chciałbym, aby każdy kod wykonał się poniżej 5 ms”)
  2. Coś, co nie wymaga zmiany PHP na inny język (nie: „Chciałbym, aby upuściły znaki $ i używały spacji zamiast nawiasów klamrowych” lub „Chciałbym, aby PHP były skompilowane, wpisane statycznie i miały # w nazwie”)
  3. Coś, co nie wymagałoby zerwania całego istniejącego kodu (nie: „Zmieńmy nazwy 500 funkcji i zmień ich kolejność parametrów”)
  4. Coś, co zmienia język lub jakiś interesujący jego aspekt (nie: „Chciałbym, aby istniało rozszerzenie obsługi protokołu XYZ” lub „Chciałbym, aby błąd # 12345 został w końcu naprawiony”)
  5. Coś, co jest czymś więcej niż tylko rantem (nie: „Chciałbym, żeby PHP nie ssał tak bardzo”)

Czy ktoś ma jakieś dobre życzenia?

Edycja modów: Stanislav Malyshev jest głównym programistą PHP.


9
@Stan: Chcąc uniknąć tego rodzaju komentarza, i tak go zdobędziesz. Te problemy ludzie mają z PHP są w dużej mierze w kategoriach rzeczy jesteś rządzących w swoim poście. [...]
Fishtoaster,

24
[...] Mówisz „W jaki sposób możemy poprawić wrażenia z trafienia w twarz bez faktycznego bicia cię w twarz?” Mam na myśli, że tak, zdobycie darmowej kawy, gdy jesteśmy uderzani w twarz, może być miłe, tak naprawdę nie rozwiązuje wielu podstawowych problemów z, no cóż, trafieniem w twarz. Tak więc, chociaż mam nadzieję, że otrzymacie tu przydatne odpowiedzi (jak już się wydaje), nie zdziwcie się bezproduktywnymi.
Fishtoaster,

5
@ Fishtoaster: jeśli PHP kojarzy się z byciem w twarz za ciebie, z całą pewnością trzymaj się od tego z daleka. Zdecydowanie nie jesteś zainteresowany jego ulepszeniem. Tak się dzieje, choć są ludzie, którzy są. Ten temat jest dla nich, a nie dla ciebie. Jestem pewien, że ta strona zawiera wiele tematów dla Ciebie, to po prostu nie jeden z nich.
StasM,

5
Jako przykład wykorzystuję uderzenie w twarz - sytuacja, w której powierzchowne ulepszenia nie są tak ważne; kiedy większość ludzi ma problemy. Nawet nie odrzucam twojej próby uzyskania sugestii dotyczących tych powierzchownych ulepszeń - po prostu wskazuję, dlaczego prawdopodobnie uzyskasz kilka niepomocnych odpowiedzi, biorąc pod uwagę sytuację.
Fishtoaster,

6
@Fishtoaster: Nie wszyscy, co zaskakujące , nienawidzą PHP - zawsze mi się podobało. Bardzo elastyczny i szybki (do kodu).
Orbling

Odpowiedzi:


119

Nie miałbym nic przeciwko nazwanym parametrom.

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

Niestety deweloperzy PHP zestrzelili już ten pomysł .


1
To lista z 2005 roku. Wiele pomysłów zostało zamkniętych, a następnie odrodziło się. W rzeczywistości, jeśli przyjdzie dobre wdrożenie, istnieje spora szansa, że ​​zostanie zaakceptowane.
StasM,

21
To moja ulubiona funkcja Pythona. Sprawia, że ​​kod jest bardzo samo-dokumentujący.
Keyo,

7
@Josh K: Jest w porządku, ale wywołanie „tablica” jest bezużyteczne, jeśli chcesz. To tylko zaciemnia to, co NAPRAWDĘ próbujesz zrobić. Inną opcją może być skrócona składnia tablic: make_img (['src' => 'blah.jpg', ...]);
Erik van Brakel,

2
@Erik: To też nie jest zła opcja, mówię, po co dodawać ten bałagan do języka, skoro można to zrobić już za pomocą niewielkiego opakowania tablicy.
Josh K

4
@Erik: Doceniona byłaby bardziej swobodna składnia tablic (jak []operator JavaScript ).
Josh K

93

Więcej dereferencji:

echo something_that_returns_array()[4];

Inni wspominali o nazwanych parametrach i krótszej składni tablicy. Nie miałbym też nic przeciwko krótszej składni obiektów.

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

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

18
Składnia () [] jest już w bagażniku. Niestety skróty tablic zostały odrzucone, ale mam nadzieję na wskrzeszenie.
StasM,

2
Chciałbym tę funkcję. Dlaczego możemy mieć coś_that_returns_object () -> 4, ale nie z tablicami?
Bala Clark,

4
JavaScript jak notacje tablicowe i obiektowe zadziałają Jako programista front-end najbardziej mnie martwi kod php.
Bleep Bloop

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

2
@DisgruntledGoat: Problem ze ()->składnią polega na tym, że działa ona tylko wtedy, gdy obiekt jest zwracany, co gorsza, obiekt jest nawet wymagany, posiada właściwość / metodę o określonej nazwie, która optymalnie robi to, co masz nadzieję, że to zrobi , akceptując podane parametry i modląc się, aby nie wymagało to już więcej ... itd. itd.
phant0m,

72

Po pracy z PHP przez około 13 lat, a głównie z JS przez około 4, jest kilka rzeczy, które moim zdaniem PHP dobrze byłoby pożyczyć od JS:

1) skrótowa notacja tablic i obiektów. Wierzę, że mogło to być omówione i zestrzelone na wewnętrznych elementach (więc słyszę - nie lubię patrzeć, jak powstaje kiełbasa), ale naprawdę, naprawdę uważam, że dosłowna notacja tablic i obiektów w JS jest duża wygrana produktywność.

Na przykład:

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

Czy (IMHO) jest po prostu łatwiejsze do napisania i czystsze niż

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

Słyszałem, że pojawiły się pewne obawy o potencjalne zamieszanie, ale czy rzeczywiście jest to bardziej mylące niż, powiedzmy, notacja heredoc? Wydaje mi się, że przynajmniej tworzenie obiektu stdClass w PHP jest wystarczająco szczegółowe, aby zniechęcić do praktyki.

2) Przydałoby się ponowne zdefiniowanie wcześniej zdefiniowanych funkcji i metod. Szczególnie uprościłoby to sytuacje przedłużania klasy i tworzenia nowej klasy jest albo zbyt skomplikowane, albo niepraktyczne. Uważam jednak, że powinniśmy unikać przedefiniowywania podstawowych funkcji i metod innych niż przestrzeń użytkownika.


Oprócz tych dwóch, myślę, że PHP musi transparentnie obsługiwać Unicode . Staje się to coraz większym problemem dla programistów, a rozwiązania oferowane obecnie w PHP są mylące i często nie działają. Uczynienie wszystkich standardowych funkcji ciągów przyjaznymi dla Unicode po wyjęciu z pudełka byłoby ogromną wygraną dla programistów PHP.

Dzięki, że pytasz!


(2) spójrz na runkit. (3) Unicode jest trudne, zwłaszcza, że ​​większość świata zewnętrznego nie jest Unicode. Musielibyśmy albo zabić wydajność, albo wymagać od ludzi wykonania dodatkowej pracy (podobnie jak Java). Właśnie dlatego wysiłek php6 unicode nie zadziałał.
StasM,

8
Co do Unicode: może być trudne, ale byłoby bardzo przydatne (z pewnością rozwój samego PHP jest trudny, ale daje ogromne korzyści, tak?) Być może rozwiązaniem byłoby włączenie przezroczystej Unicode poprzez rozszerzenie ze zrozumiałym kompromisem perf, bardzo podobny do XHP? Dzięki jeszcze raz.
Funkatron,

5
$ object = (object) array („foo” => 'bar', baz => 'boo');
mercutio,

3
Nie rozumiem, jak można zobaczyć „większość świata zewnętrznego nie jest Unicode”? Czy mówisz o ludziach? Albo coś innego? Ponieważ ogromna większość ludzi na świecie (z ogromnym marginesem) mówi w językach, które najlepiej reprezentuje Unicode.
Dean Harding,

1
Zdecydowanie obsługa Unicode. Wysyłka jakiejkolwiek aplikacji używanej na całym świecie jest bez niej początkowa. To, czy deweloperzy PHP uważają, że inżynieria w przyzwoitej obsłudze Unicode jest łatwa, czy nie, nie ma znaczenia. Ludzie tego potrzebują i hakują sobie drogę do niepowodzenia platformy. Delphi zrobiło to, dodając inny typ łańcucha i ustawiając go jako domyślny, z niejawnym rzutowaniem i globalnym przełącznikiem, aby przywrócić stare zachowanie. Dlaczego PHP nie może tego zrobić w ten sam sposób?
Joeri Sebrechts

48

Czego chciałbym, jako były wieloletni apologeta PHP:

  1. Krótsza składnia tablic. Macierze PHP są jedną z najbardziej niesamowitych cech języka ze względu na ich elastyczność, ale pisanie jest trudne some_array_method($argity, array('key' => $value));. Uważam, że ta propozycja została już niestety wypatroszona na liście mailingowej PHP.
  2. finally wsparcie
  3. Atrybuty / adnotacje. Umożliwiają one dodanie niestandardowego zachowania do metody w sposób umożliwiający ponowne użycie kodu. Na przykład w środowisku MVC można zdefiniować taki AuthorizeAttribute, który wskazywałby, że kontroler lub metoda działania wymaga autoryzacji użytkownika. Sama struktura byłaby odpowiedzialna za poszukiwanie atrybutów i odpowiednie działanie na nich. Wierzę, że PHPUnit już używa pewnego rodzaju atrybutu, umieszczając je w komentarzach docblock, które można odczytać za pomocą refleksji, ale faktyczna funkcjonalność w komentarzach docblock to z pewnością włamanie.
  4. Krótsza składnia lambda. Zamiast pisać function($x){ return $x*2;}, może mógłbym napisać $x => return $x*2coś takiego. To znowu coś, co po prostu sprawia, że ​​korzystanie z tej funkcji jest trudne. Na przykład w $results = array_filter(array(1,2,3), function($a) { return $a % 2; }):porównaniu z $results = array_filter(array(1,2,3), $a => return $a % 2 );poprzednim jest o wiele więcej hydrauliki, która w zasadzie nie ma znaczenia dla rzeczywistej pracy, którą próbujesz wykonać.
  5. Wbudowana Decimal(matematyka o stałym punkcie), która wspierała operacje matematyczne przez normalnych operatorów, byłaby całkiem przyjemna, ponieważ nie mamy przeciążenia operatora.
  6. METODY MAGICZNE MOAR. Metody magiczne są świetne. Widziałem, jak PHP dodaje przeciążanie operatorów za pomocą magicznych metod (wiem, że w zasadzie tak się nigdy nie stanie). Ale ogólnie rzecz biorąc, zapewniają one naprawdę świetne sposoby na zahaczenie się o język i robienie fajnych rzeczy.

48

Ustaw PHP w pełni obiektowo. slap on another global functionEwolucja PHP musi się skończyć.

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

Trudno mi to przeczytać. Muszę stworzyć własny stos mentalny i samemu go skompilować. Zasadniczo powinien on czytać na odwrót. $dog->wakeup()->bark();jest łatwy do odczytania w porównaniu dobark(wakeup($dog))

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

Zrobiłeś krok w kierunku włączenia obsługi obiektów / metod, użyj go w rzeczywistych podstawowych funkcjach PHP.

Zmieńmy nazwy 500 funkcji i zmień ich kolejność parametrów.

Przeniesienie tej funkcji na metody umożliwiłoby zmianę ich nazw przy użyciu niektórych konsekwentnie. Czy złamałby jakąkolwiek zgodność wsteczną, gdyby łańcuchy i tablice miały własne metody?


3
Myślę, że tablica niebędąca typem obiektu jest dużym błędem w PHP. Prowadzi do wszelkiego rodzaju problemów. Niestety jest to kwestia ewolucyjna. Możesz jednak robić to, co chcesz, korzystając z rozszerzenia lub przestrzeni użytkownika. Prawdopodobnie pasuje dobrze do SPL.
StasM,

3
Ten sam argument dotyczy ciągów znaków. Mam na myśli ogólnie brak metod. Języki takie jak Java, Python, C # itp. Mają znacznie bardziej czytelny kod. Myślę, że szukasz funkcji, ale poprawienie tego, co jest zepsute przez IMO, byłoby lepszą opcją.
Keyo,

6
Nie bądź niemądra. To byłobydog_wake_up($dog); bark_dog($dog);
Matchu

2
IMHO, wszelkie nowe metody łańcuchowe powinny oczekiwać i emitować UTF-8 oraz zgłaszać wyjątki, jeśli dane wejściowe nie są prawidłowe UTF-8. To znacznie zmniejszyłoby potrzebę poważnej przeróbki obsługi Unicode.
rjmunro

1
@luiscubal Nie. Dodatkowy parametr oznacza, że ​​nie możemy później dodać parametrów, jeśli wymyślimy nowe rzeczy do dodania do funkcji. Na przykład, jeśli $ string => trim () zrobił tylko białe spacje (jak wcześniej niż 4.1.0), to twój system powiedziałby, że $ string => trim ('ISO-8859-1') przyciął białe znaki z ciągów ISO-8859-1 . Gdybyśmy wtedy chcieli mieć możliwość przycinania rzeczy, które nie były białymi znakami, nie moglibyśmy dodać parametru do tego, chyba że sprawimy, że ludzie określą najpierw kodowanie. Powinniśmy zachęcać ludzi do przekonania, że ​​każdy tekst w innym miejscu niż UTF-8 jest zły .
rjmunro

40

Świetny byłby silnik zapytań zintegrowany z językiem. Coś w rodzaju tego, co jest dostępne w .NET o nazwie LINQ. Pomoże to w sortowaniu ogromnych tablic danych i ustandaryzuje dostęp do bazy danych, tak aby mniej udanych ataków typu SQL-injection.


2
Głosuję na wszystko, co ułatwia sparametryzowane zapytania.
Dean Harding,

1
Myślę, że ustandaryzowany dostęp do bazy danych jest tak naprawdę bardzo ważną zaletą czegoś takiego jak LINQ, ponieważ myślę, że ułatwia testowanie jednostkowe z próbkami obiektów bazy danych (ponieważ wyśmiewasz kod PHP zamiast zapytań SQL.)
davidtbernal

nie sądzę, że coś takiego powinno wejść w sedno. lepiej by pasowało do rozszerzenia pecl
harald

38

O. Podpowiedzi do prymitywów. To byłoby miłe.


1
Chociaż podoba mi się zasada KISS PHP (w pewnym stopniu), zdecydowanie to popieram. Powodem jest to, że jeśli chcesz być naprawdę defensywny, otrzymujesz ten sam kod sprawdzający typ w każdej metodzie ustawiającej. Moglibyśmy łatwo to porzucić, jeśli język wspierałby go natywnie.
MicE

4
„Podpowiedzi typu” to bardzo niefortunna nazwa, ponieważ nie jest to „podpowiedź”, ale ścisłe pisanie. Myślę, że prymitywne ścisłe pisanie byłoby nie na miejscu w dynamicznym języku, takim jak PHP. Pisanie wymuszone (to samo, co funkcje wewnętrzne - spróbuj strlen (123)) może być OK.
StasM,

6
+1 za to. Podpowiedzi (lub ścisłe wpisywanie) w deklaracjach funkcji byłyby niezwykle pomocne i zmniejszyłyby tak dużo, gdyby (! Is_int ()) bzdury w KAŻDEJ I KAŻDEJ metodzie.
Phil Sturgeon

5
@StasM Nie zgadzam się. Jest to w zakresie dynamicznego języka, aby umożliwić użytkownikowi wybór używania języka w sposób statyczny. Pozwoliłoby to na znacznie lepsze wychwytywanie błędów. Nie musisz go używać, jeśli nie chcesz, ale osobiście mam dość przekazywania łańcuchów tam, gdzie chciałem int, a następnie wyszukiwania kodu, aby dowiedzieć się, gdzie głupi łańcuch jest przekazywany Lub wpisz cały czas sprawdzanie wszystkiego.
Daniel Bingham,

2
@StasM Nie ma absolutnie żadnego powodu, dla którego musiałbyś wprowadzić w pełni zmienne o typie statycznym. Tak, przesunąłbyś błędy w kodzie. To byłby cel. Błąd pojawiłby się w czasie wywołania funkcji zamiast wewnątrz funkcji - co nie pozostawia pojęcia, gdzie rzeczywiście występuje błąd. Jeśli chodzi o błędy konwersji typu, błąd wystąpiłby - tak w czasie wykonywania - przy wywołaniu funkcji. Rozwiąż problem, konwertując odpowiedni typ. O wiele lepsze niż pojawienie się ciągu w funkcji, która oczekuje int i nie wie skąd.
Daniel Bingham

34

Naprawdę chcę lepszej obsługi Unicode po wyjęciu z pudełka. Większość języków zmierza w tym kierunku, ale PHP wciąż ma dziwne polecenia.

Ciągi PHP to po prostu tablice bajtów. Ich zawartość jest nieprzenośna, ponieważ zależy od bieżącego domyślnego kodowania.

To samo dotyczy reprezentacji zbudowanej przez serialize. Zawiera reprezentację ciągu z prefiksem długości bez faktycznego przechowywania informacji o kodowaniu.

Większość funkcji PHP (łańcuchowych) nie ma pojęcia o Unicode. Szczegółowa lista obejmująca poziom ryzyka każdej funkcji znajduje się na stronie : http://www.phpwact.org/php/i18n/utf-8

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


Obsługa Unicode okazała się znacznie trudniejsza niż sądzono. Dlatego wysiłek php6 został zatrzymany. Na razie mamy utf-8 i myślę, że najlepszym rozwiązaniem byłoby dodanie obsługi utf-8 dla funkcji łańcuchowych, być może jako część rozszerzenia intl.
StasM,

3
BTW, cytat jest nieprawidłowy. Ciągi PHP są tablicami bajtowymi, ale ich zawartość jest tak przenośna, jak je tworzysz i nie zależy od „domyślnego kodowania” - to tylko tablica bajtów, chcesz je w utf8, put utf8, want utf16 - put utf16. link phpwact.org wydaje się być martwy.
StasM,

1
Naprawdę miałbym nadzieję, że rozszerzenie intl będzie domyślnie włączone, więc ludzie, którzy potrzebowali UTF-8 (nie wszyscy?) Nie musieli walczyć z hostami, aby funkcje łańcucha działały zgodnie z oczekiwaniami.
Emil Stenström,

Ponadto dziękuję za wyjaśnienie ciągów. Od jakiegoś czasu jestem z dala od PHP, więc jestem trochę zardzewiały. Zamiast tego walczyłem w wojnie o Unicode z Pythonem, który ma podobne problemy jak PHP, ale rozwiązuje je w Pythonie 3. Posiadanie szwedzkiego „ö” w twoim imieniu to bałagan :)
Emil Stenström

To zdecydowanie jeden obszar, w którym chciałbym poprawić.
Nathan Osman,

32

Spraw, aby ciągi były podobne do obiektów, dzięki wbudowanym metodom zastępowania niekonsekwentnie nazwanych i parametryzowanych obiektów nieprzedmiotowych. na przykład

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

itp.

Edycja: jeszcze jedno: metody te powinny zawsze oczekiwać i emitować UTF-8, z wyjątkiem tych specjalnie przeznaczonych do kodowania. Jeśli dane wejściowe są niepoprawne UTF-8, należy zgłosić wyjątek, nawet jeśli kodowanie nie wpłynie na wyjście funkcji.


do góry, właśnie do tego dążę.
Kemo,

1
subject->verb(object), ułatwia zapamiętanie kolejności parametrów.
Ming-Tang,

+1 Bawiłem się, tworząc własną klasę ciągów, aby robić takie rzeczy, dzięki czemu kodowanie jest o wiele łatwiejsze i nigdy nie zapomnisz kolejności parametrów.
DisgruntledGoat

2
Co więc is_object($string)wróci? Spowodowałoby to albo przerwanie kompatybilności wstecznej, albo spowodowanie wprowadzenia naprawdę nieintuicyjnych prawie-ale-niezupełnie-obiektów.
Tgr

@Tgr: is_object () powinno być przestarzałe - nie powinno być czegoś takiego jak „nie obiekt”. W krótkim okresie musiałaby to być właściwość, którą można wyłączyć na dowolnym obiekcie, a domyślne konstruktory ciągów wyłączyłyby go.
rjmunro 16.04.11

24

1) Chciałbym, aby nowo tworzone obiekty zwracały „$ this”, dzięki czemu mogę metodować łańcuch, $ user = new User ('john') -> setLastName ('Doe') -> save ();

2) Jeśli kiedykolwiek używałeś ruby, a ostatnio węzeł, mają świetną interaktywną powłokę (IRB). Chciałbym, aby PHP miał taki, który byłby naprawdę użyteczny.

3) Cechy / Mixiny, ale słyszę, że są już w drodze.

4) Chcę wstawić drugą krótką tablicę $ myArray = ['my', 'array'];

5) Spójne nazewnictwo / kolejność (np. Stóg siana z igłą)


Nienawidzę konieczności tworzenia create()metody, która nie robi nic specjalnego, tylko do obejścia # 1!
Alan Pearce,

Robię to samo, ale używając późnego wiązania statycznego i superklasy obiektu, w ten sposób każda klasa, która rozszerza moją superklasę, ma metodę, np .: SomceClass rozszerza SuperObject {}; SomeClass :: create () -> somemethod ();
dukeofgaming,

Spójrz na github.com/philsturgeon/php-ps To dopiero początek, ale z pewną pomocą może być całkiem użyteczny.
Phil Sturgeon,

1
Istnieje również pakiet PEAR, który oferuje interaktywną powłokę do kodowania szybkich eksperymentów w PHP - dostępny na pear.php.net/package/PHP_Shell
kguest

(new Foo ()) -> bar () jest częścią 5.4. 3) i 4) też są.
StasM

20

1) pozbyć się obejmuje (). Odniesienia do innych plików powinny być odniesieniami, a nie umieszczać zawartości jednego pliku kodu źródłowego w innym. Zdecydowanie zbyt wielu programistów PHP używa () jako rodzaju wywołania funkcji, a nie jako środka odwoływania się do biblioteki. Prowadzi to do wszelkiego rodzaju niejednoznaczności w stanie zmiennej i niestabilnym kodzie. Zastąp to poleceniem „use” podobnym do Perla.

2) proszę podać gotową metodę kompilacji aplikacji PHP w pojedynczy plik kodu bajtowego lub plik wykonywalny. To znacznie zwiększy atrakcyjność PHP jako komercyjnego języka programowania. Powinno to być podstawowym składnikiem języka. Nie martw się o pliki HTML używane w interfejsie GUI aplikacji, ponieważ ...

3) pozbądź się możliwości osadzania znaczników PHP w HTML. Lub przynajmniej zapewnić tryb „bez osadzania”. Jest to absolutny bałagan i zachęca do złego projektowania poprzez połączenie logiki aplikacji i prezentacji. Programiści powinni używać szablonów do wyświetlania, a nie splatać pliki PHP razem i mieć nadzieję na najlepsze.

Podpisany,

Grandmaster B.

ps: nie słuchaj tego, co mówią inni tutaj, byłem miły przez cały rok


37
1). Obejmuje są świetne. Wszystko zawiera. 2). To jest dobre. 3) Szablon jest najsilniejszą cechą PHP . Zmuszenie cię do użycia innych bzdur szablonowych byłoby bardzo złym posunięciem.
Josh K

8
Lubię (1) i (2), ale (3) wydaje się krokiem wstecz. PHP daje moc szablonową, od Ciebie zależy, czy mądrze ją wykorzystasz, czy nie.
geekbrit,

11
3 nie ma sensu - osadzanie tagów jest konieczne dla dowolnego V w frameworku MVC.
Alex

9
Przeczytałem tę odpowiedź jako „Drogi Święty Mikołaj, spraw, aby PHP nie był PHP”.
Stephen

1
3 jest od razu, ponieważ PHP jest językiem szablonów.
Andrew

18

Dyrektywa ini E_ERRORdotycząca nieokreślonych stałych, zamiast zakładać, że jest to ciąg znaków E_NOTICE.


1
Stałe klasy to robią, btw.
StasM,

4
Poważnie, nie rozumiem, dlaczego powodują, że PHP zakłada ciągi bez cudzysłowu. To najgłupsza rzecz na świecie. Wybrałbym albo E_ERRORalbo E_PARSE.
BoltClock,

14

Normalizuj globalną przestrzeń nazw za pomocą dobrze przemyślanej konwencji nazewnictwa, która ma sens dla początkujących!

Cytując naszego ukochanego Jeffa Atwooda: PHP jest do bani, ale to nie ma znaczenia !


1
Zgadzam się co do zasady, ale nie mam pojęcia, jak to zrobić w praktyce :)
StasM,

3
@StasM: Wyobrażam sobie, że pierwszym krokiem byłoby utworzenie przestrzeni nazw nowych wersji bibliotek i umożliwienie programistom (poprzez ustawienia ini) wyłączenia aktualnie bibliotek globalnych. Myślę, że pakiet kompatybilności byłby odpowiedni dla starszych wersji, ale nie powinien być bardzo trudny do napisania.
Michał T


13

1) Krótsza składnia tablicy / obiektu, a la JavaScript (jak wspomniano wcześniej)

2) Zezwól constzmiennym, aby zezwoliły na wynik obliczeń, tak jak define()robi.

3) Łączenie łańcuchów bezpośrednio z konstruktora: new User()->name('Ryan');

4) Dereferencje tablicowe: something_that_returns_array()[4];

5) Rozszerzona obsługa SPL. SPL wykonuje przyzwoitą robotę, przekształcając funkcje łańcuchów i tablic (między innymi) jako obiekty. Rozszerzenie SPL może rozwiązać wiele problemów związanych z tym, że język jest tak szalony.

6) Używanie ArrayObject()powinno być tak przejrzyste jak używanie array(). Powinieneś być w stanie robić rzeczy array_filter($array_object_instance)bez robienia array_filter($array_object_instance->getArrayCopy()). Oczywiście byłoby jeszcze lepiej $array_object_instance->filter().

7) Przydałby się pełny Unicode.

8) Przestań robić dziwne automatyczne konwersje typów. Na przykład nie powinno być możliwe echoutworzenie obiektu SimpleXMLElement bez uprzedniego jawnego typowania go jako ciąg znaków. A przynajmniej rzuć coś, kiedy to się stanie (np. W trybie ścisłym lub w jakimkolwiek innym trybie error_reporting(-1)).

9) Wsparcie dla wielu wątków lub jakiegoś zdarzenia / asynchronicznego wywołania zwrotnego. Ma to największe znaczenie podczas próby przesyłania dużych plików za pomocą cURL. Zamiast wątków old skool, byłoby coś takiego jak Grand Central Dispatch firmy Apple. Lub nawet coś w stylu JavaScript, w którym można wysyłać żądania asynchroniczne i definiować połączenia zwrotne.

10) Spójne nazewnictwo / porządek (np. Stóg siana z igłą) byłoby fajne, ale myślę, że można to lepiej rozwiązać za pomocą SPL.

11) Oficjalnie obsługiwana interaktywna powłoka PHP, taka jak IRB. Facebook ma taki, phpshktóry został napisany w Pythonie, ale brakuje mu polskiego, który chciałbym zobaczyć.

12) W przypadku interfejsu API Reflection dodaj obsługę (a) komentarzy docblock na temat stałych (globalne i klasowe) oraz (b) obsługę analizowania komentarzy podobnych do PHPDoc w rozsądnej strukturze danych. Istnieje pakiet PECL o nazwie „docblock”, który próbuje to zrobić, ale nie wydaje się, aby autor zaszedł bardzo daleko.

EDYCJA: 13) Chciałbym również zobaczyć możliwość używania !i ?nazw funkcji - jak Ruby może.


Zgadzam się, że obiekt tablicowy powinien być obsługiwany dla funkcji array_ *. ale jaki byłby oczekiwany wynik dla czegoś takiego jak „array_merge”, jeśli weźmiemy pod uwagę podklasy arrayobject. czy pozwoliłbyś na scalanie tylko instancji tej samej klasy i co zwróciłoby array_merge? tablica php czy instancja arrayobject (odpowiednio jej podklasa)?
harald

Argumentowałbym, że ponieważ dane wewnętrznie są tablicą, a ArrayObject otacza je funkcjonalnością, to nawet podklasy ArrayObject nadal będą pracować wewnętrznie z tablicami. Oczekiwałbym, że będę mógł scalić inną standardową tablicę lub ArrayObject (lub podklasę). Jeśli chodzi o to, co by zwrócił, argumentowałbym, że powinien również zwrócić nowy ArrayObject, ale postępuj zgodnie z precedensem ustawionym przez simplexml_load_string (), w którym możesz określić nazwę klasy, której wynikiem powinna być instancja.
Ryan Parman

12

1) Zrozumienie tablic w stylu rozumienia listy w języku Python:

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

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

2) Składnia krótkiej tablicy

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

3) Ustaw puste (), aby nie traktować ciągu „0” jako prawdziwego


2
Myślę, że dla (1) coś ugotowanego z iteratora i zamknięcia byłoby lepsze.
StasM,

+1 IMHO, należy to uwzględnić we wszystkich językach, a także w iteratorach. Są po prostu sposobem na przydatne, aby nie mieć.
Evan Plaice

empty()jest logicznym przeciwieństwem if ($x), więc ma sens, że empty('0')to prawda, ponieważ if ('0')jest fałszem. Jedyną różnicą jest to, empty()że nie rzuca uwagi, jeśli zmienna nie jest ustawiona.
Andrew

12

Chciałbym zobaczyć wiarygodną metodę tworzenia / definiowania tablic CONSTANT. Istnieje kilka hackerskich sposobów symulowania tego rodzaju funkcjonalności, ale byłoby miło, gdyby była to tylko prosta funkcja PHP. Byłoby miło, gdybyś mógł utworzyć tablicę w sposób podobny do „ostatecznej” deklaracji Javy.

Stworzyłem system logowania, który można bardzo szybko skonfigurować. Wszystko, co musisz zrobić, to zmienić zawartość tablicy w pliku tekstowym, aby określić pola, które mają zawierać informacje o użytkowniku. Korzystając z szeregu pętli for, obsługuje wszystko, od generowania formularzy i sensytyzacji danych wejściowych, po wywołania bazy danych, ale wszystko zależy od tej oryginalnej tablicy.

Plik z tablicą jest zablokowany z uprawnieniami, ale gdy tablica porusza się w eterze, jest zmienna. Chociaż uważam, że system jest dość bezpieczny, nie lubię zostawiać niczego przypadkowi. Metoda finalizacji tablic byłaby przydatna w takiej sytuacji.

Nowy pomysł!!

Ohhh, myślałem o czymś innym, co naprawdę bardzo lubię w php. Chciałbym, aby jakiś system kontrolował operacje na plikach php i operacje na katalogach podobne do działania .htaccess.

Plik .phpaccess powinien uruchamiać jakieś zasady dotyczące tej samej domeny / pochodzenia.

Na przykład, jeśli hostowałem wiele witryn z wirtualnymi hostami, mógłbym mieć plik .phpaccess w katalogu, który powiedziałby php, aby sprawdził początek wykonywanych skryptów, które próbują działać w moim chronionym katalogu. Jeśli skrypt nie pochodzi z tego katalogu lub jego podkatalogów, operacje na plikach lub operacje na gniazdach zostaną odrzucone.

Myślę, że taki system uczyniłby wirtualny hosting o wiele bezpieczniejszym środowiskiem. Jeśli umieścisz jeden z nich u góry każdego wirtualnego hosta, zmniejszy to szansę znalezienia sposobu na wkroczenie się z sąsiedniego wirtualnego hosta.

Także jeśli dobrze byłoby mieć metodę zabezpieczenia go w odwrotny sposób. tj. ograniczenie zasięgu skryptów w jednym katalogu do tego katalogu.

To yin i yang ya wiedzą!


+1 dla final. Wyjaśnienie: finaloznacza, że ​​wartość zmiennej można ustawić w czasie wykonywania (w przeciwieństwie do stałych, które muszą być stałymi wyrażeniami), ale można ją ustawić tylko raz. Zobacz także C # readonly.
davidtbernal,

1
istnieje propozycja dla getters / setterów dla trunk, która zastąpiłaby readonly itp. Niezmienne tablice, choć prawdopodobnie byłyby trudne do wykonania.
StasM,

W przypadku phpaccess PHP ma już „tryb awaryjny”, który robi to, co opisujesz.
DisgruntledGoat

11

Moje dwa największe życzenia jako zapalonego programisty PHP:

  1. Wsparcie w końcu. Wielkim bałaganem jest fikcyjne obejście tego za pomocą flag lub podobnych środków.
  2. Chciałbym zobaczyć wsparcie dla składni języka C # dla programów pobierających i ustawiających. Gdy masz wiele programów pobierających i ustawiających, prosta składnia, taka jak C #, jest świetnym narzędziem zwiększającym wydajność zamiast robić to w Javie i pisać metody pobierające i ustawiające. Magiczne metody są niesamowite w przypadkach, w których chcesz dynamicznie tworzyć członków (na przykład, jeśli chcesz, aby renderer szablonów miał jakieś zmienne do użycia), ale nie są dobre dla normalnych właściwości, dla których chcesz, aby IDE automatycznie się uzupełniał, poznaj ich typy i tak dalej. pomogłoby to zmniejszyć kod, a jednocześnie byłby czytelny i łatwy w użyciu.

1
1. niestety trudno to zrobić, ale zdecydowanie dobra pozycja do zrobienia
StasM

@StasM: a może zrobisz to za pomocą anotacji? Coś w stylu: / ** @get getFoo; @set setFoo; * / private $ foo;
Michał T

9

Składnia języka : W pihipi i phpreboot jest kilka dobrych wskazówek na temat tego, czym interesują się programiści (chociaż phpreboot zbyt daleko posuwa się w JS).

Metodologia programowania: Gdyby takie ankiety zostały wzięte pod uwagę, znacznie poprawiłoby żywotność PHP.net. Nie podejmuj więcej decyzji dotyczących składni sesji IRC.

Indywidualne cechy : Niektóre zostały wspomniane wcześniej, ale z radością spalę trochę karmy, aby być bardziej tępym:

  • Typ ciągu Unicode.
  • Bigint (patrz Python).
  • Wbudowane narzędzie Runkit do usuwania / zmiany nazw / zastępowania wbudowanych funkcji i klas, które nie zawsze są tak dobrze zaprojektowane.
  • Modern OOP
    • wielokrotne dziedziczenie (zamiast złożoności do obsługi rzadkich przypadków brzegowych ze składnią niezdarnych cech)
    • skalary mogą pełnić funkcję obiektów (patrz Python), np. array () działa jako ArrayObject, lub łańcuchy jako SplString (wymaga użytecznych metod, wszystkie funkcje łańcuchowe powinny być dostępne jako str::toupper())
  • Przestarzała \składnia przestrzeni nazw gówno gówna , popraw parser i zastosuj ::jako alternatywę. Wiesz, jak prawdziwy język.
  • Każda odmiana LINQ (chociaż nie ufam, że wymyśliliście rozsądną składnię)
  • lub literały XML.
  • Pozbądź się zachowania środowiska uruchomieniowego php.ini i przełączników semantycznych. To prawda, usuwa trochę emocji, ale byłoby korzystne dla programistów i bazy użytkowników.
  • Tak, magic_quotes jeszcze nie ma.
  • Konwertuj kod bajtowy silnika Zend na PBC

Chociaż, jeśli nie jest to oczywiste, chętnie sfinansowałbym kogoś innego, aby zrobił to drugie, i zabiłbym php.net jako główną implementację. :P
Och, właśnie zauważyłem, że to wiki społeczności. Jest więc szansa, że ​​nie jesteś tutaj po karmę, ale prawdziwe zainteresowanie. Jeśli tak, zajrzyj do <b> problemu </b>, który poważnie szkodzi językowi (dyrektoritis).


5
Nienawidzę składni \ namespace, ale jest to długa i smutna historia, dlaczego tak się stało i prawdopodobnie nie ulegnie zmianie ... Prawdopodobnie gdybym mógł zmienić tylko jedną rzecz w PHP, która byłaby moim głównym kandydatem. Ale tak właśnie jest.
StasM,

@StasM: Dziękuję za opinie i przepraszam, że jestem niegrzeczny w niektórych sprawach związanych z PHP, ale dbam o PHP; stąd bardzo uparty. - Przeczytałem trochę o rozumowaniu. Dylemat odwrotnego ukośnika nie jest jeszcze bardzo dużym problemem, ale stanie się to w przyszłym roku, gdy biblioteki się rozprzestrzenią. Mam więc nadzieję, że ktoś napisze parser, który przepisuje \ cargo \ cult \ class \ names z powrotem do schematów podkreślenia.
Mario

Może jestem głupi, ale jaka jest różnica, czy używamy „::” czy „\” dla przestrzeni nazw?
Michał T

@Pies: ::Byłoby to bardziej naturalne dla każdego zamkniętego języka składni C / C ++. A `\ 'jest nie tylko nienormalny wśród wszystkich języków programowania, ale ma niesprawdzone skojarzenia. Niektóre wcześniejsze dyskusje: stackoverflow.com/questions/238550/… lub developers.slashdot.org/article.pl?sid=08/10/26/1610259 i reddit.com/r/programming/comments/79cut/… - Ale w szczególnie podejmowanie decyzji w tej sprawie bez informacji zwrotnej i sygnalizowanie społeczności programistów, aby ją wciągnęło, nie było bardzo pożądanym krokiem.
Mario

1
+ 1000000 dla wielokrotnego dziedziczenia.
ts01

8

Bardzo chciałbym zobaczyć połączenie błędów i wyjątków w jedną koncepcję (wyjątki). Wspaniale jest móc wychwytywać wyjątki i zapisywać je w dzienniku, aby w ten sposób znajdować i naprawiać błędy. Ale jeśli coś jest zasadniczo nie tak (czytaj: błąd PHP) w ścieżce kodowej, która jest bardzo rzadko trafiana, nie ma dobrego sposobu na umieszczenie tych informacji w tej samej bazie danych problemów.

Proszę, Mikołaj, wprowadź przełącznik w php.ini, który zamienia wszystkie błędy w wyjątki - idealnie, wyjątki, które mogę przechwycić w moim kodzie.


1
W tym silniku jest już obsługiwane i korzysta z niego wiele rozszerzeń. Możesz to również łatwo zrobić za pomocą set_error_handler () i ErrorException. Uważaj jednak na E_STRICT / E_NOTICE / E_DEPRECATED ...
StasM

Jestem świadomy tych metod i są one naprawdę hackerskie. Chciałbym zunifikowany sposób - ten, który obejmuje E_STRICT / E_NOTICE i tym podobne.
Alex

7

PHP mi odpowiada, ponieważ służy do podrzucania małych i średnich stron internetowych; Muszę być trochę niewyobrażalny, jedyną rzeczą, o której mógłbym pomyśleć w odpowiedzi na to pytanie, byłoby coś, co sprawiłoby, że lepiej skaluje się w witrynach o dużym ruchu.

Mam na myśli odrodzenie procesów do innych rdzeni, na przykład aktualizację bazy danych w jednym procesie podczas tworzenia strony wyjściowej w innym procesie. Szybkie wyszukiwanie w Google wskazuje, że można to zasymulować, ale obecnie nie jest obsługiwane bezpośrednio w php.


1
Właściwie, myśląc o tym więcej, odciążanie bazy danych wydaje się interesującym scenariuszem, więc
daj

1
@Stasm, zakładam, że masz na myśli, że osobne żądania działają jako osobne procesy. Mówię o złożonej stronie, która wymaga generowania strony i obliczeń w tle. Mogę się mylić, ale nie sądzę, aby istniał sposób na odrodzenie (na przykład) operacji aktualizacji bazy danych w osobnym procesie. Powodem tego byłoby wcześniejsze wysłanie strony do requestera, zamiast konieczności czekania na zakończenie całego przetwarzania niezwiązanego bezpośrednio z produkcją strony. PS .. Dzięki za aktualizację!
geekbrit,

7

Naprawdę tęskniłem za tym, że typy skalarne nie są traktowane jako obiekty, a rzeczywiste obiekty nie mogą zachowywać się jak każdy inny typ lub obiekt (z wyjątkiem łańcucha wynikającego z __toString ()).


Tak, proszę o magiczne metody rzutowania.
Michał T

7
  • obsługa wyliczeń (jak java 1.5+)
  • Umiejętność definiowania typów zwracanych metod w interfejsach i klasach
  • obsługa adnotacji / definicji metadanych dotyczących właściwości i metod.
  • być w stanie robić ścisłe podpowiedzi dla argumentów skalarnych metod.

+1 Jak chciałbym zobaczyć wszystkie te rzeczy w PHP.
Jeremy,

6

Oczyść „Notatki przesłane przez użytkownika” na stronie http://php.net . Czasami są prawdziwym bałaganem, ale ogólnie stanowią wielką wartość.


1
Pewna funkcja głosowania w górę / w dół i możliwość linkowania do oryginalnego komentarza w odpowiedzi z pewnością byłaby miła.
Tgr

5

W PHP jest kilka całkiem przyzwoitych funkcji tablicowych, zapewniających zdolność przetwarzania list, wywołań zwrotnych i create_function()zapewniających podstawowy rachunek lambda.

Głównym problemem jest to, że w PHP jest on zbyt rozwlekły, system stenografii byłby doskonały, szczególnie w przypadku poleceń mapowania / zmniejszania.

Co ważniejsze, funkcje listy nie są całkowicie kompletne:

  • nie ma żadnej foldrfunkcji, array_reduce()zapewniafoldl
  • array_map()powinien przekazać klucz w drugim argumencie, podobnie array_walk()jak
  • array_map_keys()mogą być użyteczne dla kluczowych modyfikacji
  • lista zrozumienie jest bardzo niezgrabne, range(), array_fill()a array_fill_keys()jedynie obsługiwać tak wiele przypadków, i array_filter()jest oddzielony

Nie zamierzam wprowadzać PHP w Haskell, ale PHP jest często używane do manipulacji strukturą danych typu listy i przydatne byłoby posiadanie pełnego zestawu narzędzi w tym zakresie.


1
Mój kolega uważa również, że mogą / powinny być inne dodatki dotyczące funkcji związanych z tablicą; na wspomnianym na jego koncie github: są to brak array_all () i array_any (), które sprawdzają, czy * warunek reprezentowany przez wywołanie zwrotne ma miejsce dla wszystkich elementów w tablicy. gist.github.com/44350
kguest

5

Przeciążenie operatora:

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

1
Nie jestem pewien, jak dobrze by to kliknęło, gdy PHP jest językiem o dynamicznym pisaniu.
BoltClock,

5
Może powinno się to odbywać za pomocą magicznych metod, takich jak __add ($ obj), __times ($ obj) itp.
Michał T

istnieje już jako rozszerzenie PECL: pecl.php.net/package/operator . Nie powinno być zbyt wiele pracy, aby połączyć je z głównym źródłem
Xananax,

4

Dodaj wyjątki zamiast tworzenia E_WARNING ... To bardzo denerwujące, że nie mogę użyć czegoś takiego jak:

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

Oczywiście obecnie nie jest to zbyt praktyczne, ale otrzymywanie:

OSTRZEŻENIE

OSTRZEŻENIE

OSTRZEŻENIE

i nie mogę kontrolować przepływu kodu bez pisania własnego modułu obsługi błędów i wykrywania łańcucha, który został wygenerowany (pozwolenie, niepoprawna nazwa pliku lub cokolwiek innego; nie mam nic przeciwko innym źródłom błędów tutaj) w celu zgłoszenia poprawnego wyjątku .

Mam nadzieję, że nie muszę wyjaśniać, dlaczego jest to ważne.

PHP już dawno temu zorientowało się na obiekt, a my, programiści korzystający z PHP, czekamy na funkcje OO, nie wprowadzając „goto” ... Kiedy dowiedziałem się, że to się naprawdę wydarzyło, pomyślałem, że to prima aprilis.


O ile nie zostanie złapany, wyjątek zabije skrypt. Ostrzeżenie na serwerze produkcyjnym zostanie zarejestrowane i nigdy nie będzie wyświetlane użytkownikowi. Zmiana tej funkcjonalności spowodowałaby teraz uszkodzenie wielu skryptów, ponieważ nie zostały one zaprojektowane tak, aby ją przechwycić. (Uwaga: sam piszę programy obsługi błędów, aby sam zgłaszać wyjątki). Teraz rzeczy PDO mogą generować ostrzeżenia lub wyjątki: programista decyduje w czasie wykonywania. Ta funkcjonalność prawdopodobnie powinna zostać dodana do większej liczby modułów.
Reece45

4
  1. Skonsoliduj model obiektowy - spraw, aby wszystkie obiekty rozszerzały podstawową klasę Object. Klasa Object implementowałaby (między innymi) wszystkie magiczne metody (aby nie były już magią!)

  2. Przenieś rozszerzenia do własnych przestrzeni nazw - uporządkuj globalną przestrzeń nazw $conn = new \MySQLi\Connection();

  3. Odzyskaj spl_autoload()funkcję! Poważnie, jest to prawdopodobnie jedna z największych funkcji PHP i jednocześnie najbardziej bezużyteczna w tym samym czasie. spl_autoloadjest domyślnym autoloaderem, który obsługuje przestrzenie nazw i wiele rozszerzeń plików, ale z nieznanych powodów wymaga, aby nazwy plików były pisane małymi literami. Jest wypełniony raport o błędzie , ale pracownicy odpowiedzieli, że nie naprawią go z powodu kompatybilności wstecznej. Racja ... to nie jest tak, że każdy framework jest dostarczany z własnym autoloaderem, ponieważ domyślny jest sparaliżowany!



4

Doprowadź obsługę taint do najnowszej wersji i dołącz do standardowej kompilacji, najlepiej włączonej w domyślnej konfiguracji http://wiki.php.net/rfc/taint

Zapobiegnie to atakom typu XSS i SQL wstrzykiwanie poprzez poprawne kodowanie ludzi.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.