Fitur apa yang ingin Anda miliki di PHP? [Tutup]

88

Karena ini musim liburan sekarang dan semua orang berharap, saya bertanya-tanya - fitur bahasa apa yang ingin ditambahkan PHP? Saya tertarik pada beberapa saran / keinginan praktis untuk bahasa ini. Secara praktis yang saya maksud:

  1. Sesuatu yang dapat dilakukan secara praktis (bukan: "Saya berharap PHP akan menebak apa arti kode saya dan memperbaiki bug untuk saya" atau "Saya berharap kode apa pun akan dijalankan di bawah 5ms")
  2. Sesuatu yang tidak perlu mengubah PHP ke bahasa lain (bukan: "Saya berharap mereka akan menjatuhkan tanda $ dan menggunakan spasi alih-alih kawat gigi" atau "Saya berharap PHP dikompilasi, diketik secara statis dan memiliki # di namanya")
  3. Sesuatu yang tidak perlu melanggar semua kode yang ada (tidak: "Mari kita ganti nama 500 fungsi dan ubah urutan parameter untuk mereka")
  4. Sesuatu yang tidak mengubah bahasa atau beberapa aspek menarik dari itu (tidak: "Saya berharap ada ekstensi untuk mendukung protokol XYZ" atau "Saya berharap bug # 12345 akhirnya tetap")
  5. Sesuatu yang lebih dari kata-kata kasar (tidak: "Saya berharap PHP tidak akan terlalu buruk")

Adakah yang punya keinginan baik?

Edit mod: Stanislav Malyshev adalah pengembang PHP inti.

StasM
sumber
9
@Stan: Sama seperti Anda ingin menghindari komentar semacam itu, Anda tetap akan mendapatkannya. Masalah yang dihadapi orang - orang dengan PHP sebagian besar dalam kategori hal-hal yang Anda singkirkan dalam posting Anda. [...]
Fishtoaster
24
[...] Anda mengatakan, "Bagaimana kami dapat meningkatkan pengalaman terkena di wajah tanpa benar-benar tidak memukul wajah Anda?" Maksud saya, ya, mendapatkan kopi gratis saat kita dipukul di wajah mungkin baik, itu tidak benar-benar mengatasi banyak masalah mendasar dengan, yah, dipukul di wajah. Jadi, sementara saya berharap Anda mendapatkan beberapa jawaban yang berguna di sini (seperti yang sudah ada), jangan kaget dengan yang tidak produktif.
Fishtoaster
5
@Fishtoaster: jika PHP mengaitkannya dengan Anda di muka untuk Anda, jangan biarkan hal itu terjadi. Anda pasti tidak tertarik untuk memperbaikinya. Itu terjadi meskipun ada orang yang. Topik ini untuk mereka, bukan untukmu. Saya yakin situs ini memiliki banyak topik untuk Anda juga, ini bukan salah satunya.
StasM
5
Saya menggunakan pukulan di wajah sebagai contoh - situasi di mana perbaikan yang dangkal tidak begitu penting; ketika masalah kebanyakan orang dengan hal yang mendasarinya. Saya bahkan tidak mengetuk upaya Anda untuk mendapatkan saran untuk perbaikan yang dangkal itu - saya hanya menunjukkan mengapa Anda cenderung mendapatkan beberapa jawaban yang tidak membantu, mengingat situasinya.
Fishtoaster
6
@Fishtoaster: Tidak semua orang, secara mengejutkan , membenci PHP - Saya selalu menyukainya. Sangat fleksibel dan cepat (untuk kode).
Orbling

Jawaban:

119

Saya tidak akan keberatan menyebutkan parameter.

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

Sayangnya para pengembang PHP telah menghapus ide itu .

Catatan untuk memikirkan nama
sumber
1
Ini daftar dari tahun 2005. Banyak ide ditutup dan kemudian dilahirkan kembali. Sebenarnya, jika implementasi yang baik datang, ada peluang yang layak untuk diterima.
StasM
21
Ini fitur python favorit saya. Membuat kode sangat mendokumentasikan diri.
Keyo
7
@ Josh K: Mungkin saja, tapi panggilan 'array' adalah sampah yang tidak berguna jika Anda mau. Ini hanya mengaburkan apa yang Anda BENAR-BENAR coba lakukan. Pilihan lain adalah sintaks singkatan untuk array: make_img (['src' => 'blah.jpg', ...]);
Erik van Brakel
2
@ Erik: Itu bukan pilihan yang buruk juga, saya katakan mengapa menambahkan kekacauan ini ke bahasa ketika Anda sudah bisa melakukannya dengan pembungkus array kecil.
Josh K
4
@Erik: Sintaks yang lebih santai untuk array (seperti []operator JavaScript ) akan menjadi fitur yang dihargai.
Josh K
93

Lebih banyak referensi:

echo something_that_returns_array()[4];

Yang lain menyebutkan parameter bernama, dan sintaks array lebih pendek. Saya tidak akan keberatan sintaks objek lebih pendek, juga.

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

$b1 = (object)array('name' => 'foo');
$b2 = {'name' => 'foo'}; // or something?
Annika Backstrom
sumber
18
() [] sintaks sudah ada di trunk. Sayangnya, berbagai cara pintas ditolak, tetapi saya berharap untuk kebangkitan.
StasM
2
Saya akan menyukai fitur ini. Mengapa kita dapat memiliki something_that_returns_object () -> 4, tetapi tidak dengan array?
Bala Clark
4
Javascript seperti array dan notasi objek akan bergoyang. Sebagai pengembang front-end, itulah yang paling mengganggu saya dalam kode php.
Bleep Bloop
1
@DisgruntledGoat Ya, lihat:function something_that_returns_array() { return array( 'a', 'b', 'c', 'd', 'e' ); }
Annika Backstrom
2
@ DisgruntledGoat: Masalah dengan ()->sintaks adalah, bahwa itu hanya bekerja ketika suatu objek dikembalikan, untuk membuat keadaan menjadi lebih buruk, objek tersebut bahkan diperlukan memiliki properti / metode dari nama yang ditentukan, yang, secara optimal, melakukan apa yang Anda harapkan , sambil menerima parameter yang Anda berikan, dan berdoa agar itu tidak memerlukan lagi ... dll dll.
phant0m
72

Setelah bekerja dengan PHP selama sekitar 13 tahun, dan banyak dengan JS selama sekitar 4 tahun, ada beberapa hal yang menurut saya sebaiknya dipinjam dari JS:

1) notasi singkatan untuk Array dan Objek. Saya percaya ini mungkin telah dibahas dan ditembak jatuh pada internal (jadi saya dengar - saya tidak suka melihat bagaimana sosis dibuat), tapi saya benar-benar menemukan bahwa notasi literal untuk array dan objek di JS adalah besar menang produktivitas.

Sebagai contoh:

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

Apakah (IMHO) lebih mudah untuk menulis dan bersih daripada

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

Saya pernah mendengar bahwa beberapa kekhawatiran tentang potensi kebingungan muncul, tetapi sungguh, apakah ini lebih membingungkan daripada, katakanlah, notasi heredoc? Paling tidak, membuat objek stdClass di PHP cukup bertele-tele untuk mencegah praktik, saya pikir.

2) Mampu mendefinisikan kembali fungsi dan metode yang didefinisikan sebelumnya akan sangat berguna. Ini akan menyederhanakan situasi khusus memperluas kelas dan instantiating kelas baru terlalu rumit atau tidak praktis. Saya pikir kita harus menghindari redefinisi fungsi dan metode inti / non-userspace.


Selain keduanya, saya pikir PHP harus mendukung unicode secara transparan . Ini semakin menjadi masalah bagi pengembang, dan solusi yang saat ini ditawarkan dalam PHP membingungkan dan seringkali tidak berkinerja. Membuat semua fungsionalitas string standar ramah-kode keluar dari kotak akan menjadi kemenangan besar bagi programmer PHP.

Terima kasih untuk bertanya!

Funkatron
sumber
(2) lihat runkit. (3) unicode sulit, terutama karena sebagian besar dunia luar bukan unicode. Kami harus mematikan kinerja atau meminta orang untuk melakukan banyak pekerjaan tambahan (seperti yang dilakukan Java). Itu sebabnya upaya unicode php6 tidak berhasil.
StasM
8
Adapun unicode: mungkin sulit, tapi itu akan sangat berguna (tentu saja mengembangkan PHP itu sendiri sulit, tetapi memberikan manfaat besar, ya?) Mungkin solusinya adalah dengan mengaktifkan unicode transparan melalui ekstensi dengan tradeoff yang dipahami, seperti XHP? Terima kasih lagi.
Funkatron
5
$ object = (object) array ("foo" => 'bar', baz => 'boo');
mercutio
3
Saya tidak melihat bagaimana Anda dapat melihat "sebagian besar dunia luar bukan unicode"? Apakah Anda berbicara tentang orang? Atau sesuatu yang lain? Karena sebagian besar orang di dunia (dengan margin sangat besar ) berbicara bahasa yang paling baik diwakili oleh Unicode.
Dean Harding
1
Dukungan unicode pasti. Pengiriman segala jenis aplikasi yang digunakan secara global adalah non-pemula tanpa itu. Apakah para pengembang PHP menganggap enjiniring dalam dukungan unicode yang layak itu mudah atau tidak. Orang-orang membutuhkannya, dan mereka meretas kegagalan platform untuk melakukannya. Delphi melakukannya dengan menambahkan tipe string lain dan menjadikannya default, dengan casting implisit, dan switch global untuk mendapatkan perilaku lama kembali. Mengapa PHP tidak bisa melakukannya dengan cara yang sama?
Joeri Sebrechts
48

Hal-hal yang saya inginkan, sebagai mantan pembela PHP lama:

  1. Sintaks yang lebih pendek untuk array. Array PHP adalah salah satu fitur bahasa yang paling menakjubkan karena fleksibilitasnya, tetapi ini adalah hambatan untuk menulis some_array_method($argity, array('key' => $value));. Sayangnya, saya yakin proposal ini sudah dihancurkan pada milis PHP.
  2. finally dukung
  3. Atribut / anotasi. Ini memungkinkan Anda untuk menambahkan perilaku kustom ke metode dengan cara yang memungkinkan penggunaan kembali kode. Sebagai contoh, dalam kerangka kerja MVC, seseorang dapat mendefinisikan suatu AuthorizeAttributeyang akan menunjukkan bahwa suatu pengontrol atau metode tindakan mengharuskan pengguna untuk diotorisasi. Kerangka itu sendiri akan bertanggung jawab untuk mencari atribut dan bertindak sesuai dengannya. Saya percaya PHPUnit sudah menggunakan semacam atribut dengan meletakkannya di komentar docblock, yang dapat dibaca menggunakan refleksi, tetapi menempatkan fungsionalitas aktual dalam komentar docblock tentu saja merupakan peretasan.
  4. Sintaks lambda pendek. Daripada harus menulis function($x){ return $x*2;}, mungkin saya bisa menulis $x => return $x*2, atau sesuatu. Lagi-lagi ini adalah sesuatu yang membuatnya sulit untuk menggunakan fitur ini. Sebagai contoh $results = array_filter(array(1,2,3), function($a) { return $a % 2; }):vs $results = array_filter(array(1,2,3), $a => return $a % 2 );Mantan hanya memiliki jauh lebih banyak pipa yang pada dasarnya tidak relevan dengan pekerjaan yang sebenarnya Anda coba capai.
  5. Built-in Decimal(fixed-point math) yang mendukung operasi matematika melalui operator normal akan lebih baik, karena kami tidak memiliki operator yang kelebihan beban.
  6. METODE MAGIC MOAR. Metode sihir itu bagus. Saya bisa melihat PHP menambahkan operator overloading melalui metode ajaib (saya tahu ini pada dasarnya tidak akan pernah terjadi.) Tetapi secara umum, mereka memberikan cara yang sangat bagus untuk menghubungkan ke bahasa dan melakukan hal-hal keren.
davidtbernal
sumber
48

Jadikan PHP benar-benar berorientasi objek. The slap on another global functionevolusi PHP perlu untuk mengakhiri.

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

Ini sulit bagi saya untuk membaca. Saya harus membuat tumpukan mental saya sendiri dan mengompilasinya sendiri. Pada dasarnya harus dibaca secara terbalik. $dog->wakeup()->bark();mudah dibaca dibandingkan denganbark(wakeup($dog))

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

Anda telah membuat langkah untuk mengaktifkan dukungan objek / metode sekarang, silakan gunakan dalam fungsi inti PHP yang sebenarnya.

Mari kita ganti nama 500 fungsi dan ubah urutan parameter untuknya.

Mengubah fungsi ini ke metode akan memungkinkan mereka untuk diganti namanya menggunakan beberapa secara konsisten. Apakah akan merusak kompatibilitas ke belakang jika string dan array memiliki metode mereka sendiri?

Keyo
sumber
3
Saya pikir array bukan tipe objek adalah kesalahan besar dalam PHP. Menyebabkan semua jenis masalah. Sayangnya, ini adalah hal yang evolusioner. Anda dapat melakukan apa yang Anda inginkan di sini dengan ekstensi atau ruang pengguna. Mungkin akan cocok dengan SPL.
StasM
3
Argumen yang sama berlaku untuk string. Saya hanya merujuk pada kurangnya metode secara umum. Bahasa seperti Java, Python, C # dll semua memiliki kode yang lebih mudah dibaca. Saya kira Anda sedang mencari fitur, tetapi memperbaiki apa yang rusak IMO akan menjadi hasil yang lebih baik.
Keyo
6
Tidak, jangan konyol. Itu akandog_wake_up($dog); bark_dog($dog);
Matchu
2
IMHO, semua metode string baru harus diharapkan dan memancarkan UTF-8, dan membuang pengecualian jika inputnya tidak valid UTF-8. Ini akan sangat mengurangi kebutuhan untuk pengerjaan ulang besar dukungan unicode.
rjmunro
1
@luiscubal No. Parameter ekstra berarti bahwa kita tidak dapat menambahkan parameter nanti jika kita menemukan hal-hal baru untuk ditambahkan ke fungsi. Misalnya, jika $ string => trim () hanya melakukan spasi putih (seperti sebelum 4.1.0), maka sistem Anda akan mengatakan $ string => trim ('ISO-8859-1') memangkas spasi putih dari string ISO-8859-1 . Jika kemudian kami ingin dapat memangkas hal-hal yang bukan spasi, kami tidak akan dapat menambahkan parameter untuk itu, kecuali kami membuat orang menentukan pengkodean terlebih dahulu. Kita harus mendorong orang untuk percaya bahwa teks mana pun yang bukan UTF-8 salah .
rjmunro
40

Mesin permintaan bahasa yang terintegrasi akan sangat bagus. Agak seperti apa yang tersedia di. NET disebut LINQ. Ini akan membantu memilah-milah array data yang besar, dan membakukan akses basis data, sehingga lebih sedikit serangan injeksi SQL berhasil.

Nick Berardi
sumber
2
Apa pun yang membuat kueri parameterisasi lebih mudah mendapatkan suara saya!
Dean Harding
1
Saya pikir akses database standar sebenarnya adalah manfaat yang sangat penting dari sesuatu seperti LINQ, karena saya pikir itu membuat unit testing dengan mengolok-olok objek database Anda lebih mudah (karena Anda mengejek kode PHP daripada query SQL.)
davidtbernal
Saya tidak berpikir, bahwa sesuatu seperti ini harus menjadi inti. lebih baik masuk ke ekstensi pecl
harald
38

Oh Ketik mengisyaratkan untuk primitif. Itu akan menyenangkan.

ruurd
sumber
1
Meskipun saya suka prinsip KISS PHP (sampai batas tertentu), saya sangat mendukungnya. Alasannya adalah jika Anda ingin benar-benar defensif, Anda akan mendapatkan kode pemeriksaan jenis yang sama di setiap metode penyetel. Kita dapat dengan mudah menghapusnya jika bahasa mendukungnya secara asli.
MicE
4
"Ketik mengisyaratkan" adalah nama yang sangat disayangkan, karena itu bukan "mengisyaratkan", itu mengetik ketat. Saya pikir pengetikan ketat primitif tidak sesuai dengan bahasa dinamis seperti PHP. Pengetikan paksa (hal yang sama dengan fungsi internal - coba strlen (123)) mungkin OK.
StasM
6
+1 untuk ini. Mengetik petunjuk (atau pengetikan ketat) dalam deklarasi fungsi akan sangat membantu dan mengurangi begitu banyak jika (! Is_int ()) omong kosong dalam metode SETIAP DAN SETIAP.
Phil Sturgeon
5
@StasM saya tidak setuju. Sangat cocok dengan dalam lingkup bahasa dinamis untuk memungkinkan pengguna memilih untuk menggunakan bahasa dengan cara yang diketik secara statis. Dan itu akan memungkinkan untuk menangkap kesalahan yang jauh lebih baik. Anda tidak perlu menggunakannya jika Anda tidak mau, tetapi secara pribadi saya muak memiliki string lewat di mana saya ingin int dan kemudian harus mencari melalui kode untuk mencari tahu di mana string bodoh dilewatkan di Atau yang lain, ketikkan memeriksa semuanya sepanjang waktu.
Daniel Bingham
2
@StasM Sama sekali tidak ada alasan Anda harus memperkenalkan variabel yang diketik sepenuhnya statis. Ya, Anda akan menggeser kesalahan dalam kode Anda. Itu akan menjadi intinya. Kesalahan akan terjadi pada waktu panggilan fungsi alih-alih di dalam fungsi - yang membuat Anda tidak tahu di mana kesalahan sebenarnya terjadi. Adapun kesalahan konversi jenis, kesalahan akan terjadi - ya pada saat dijalankan - pada panggilan fungsi. Perbaiki masalah dengan mengonversi di sana ke jenis yang benar. Jauh lebih baik daripada memiliki string yang muncul dalam fungsi mengharapkan int dan tidak tahu dari mana.
Daniel Bingham
34

Saya sangat mengharapkan dukungan unicode yang lebih baik. Sebagian besar bahasa bergerak ke arah itu tetapi PHP masih memiliki perintah aneh yang berserakan di mana-mana.

String PHP hanyalah array byte biasa. Konten mereka tidak portabel karena tergantung pada pengkodean default saat ini.

Hal yang sama berlaku untuk representasi yang dibangun oleh serialisasi. Ini berisi representasi byte panjang yang diawali dari string tanpa benar-benar menyimpan informasi pengodean apa pun.

Sebagian besar fungsi PHP (string) tidak memiliki petunjuk tentang Unicode. Untuk daftar terperinci termasuk tingkat risiko masing-masing fungsi, lihat: http://www.phpwact.org/php/i18n/utf-8

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

Emil Stenström
sumber
Dukungan Unicode terbukti jauh lebih sulit daripada yang diperkirakan. Itu sebabnya upaya php6 terhenti. Untuk saat ini, kami memiliki utf-8 dan saya pikir cara terbaik untuk pergi adalah menambahkan dukungan utf-8 untuk fungsi string, mungkin sebagai bagian dari ekstensi intl.
StasM
3
BTW, kutipannya salah. String PHP adalah array byte, tetapi kontennya sangat portabel seperti yang Anda buat dan tidak bergantung pada "pengkodean default" - itu hanya array byte, Anda ingin mereka dalam utf8, masukkan utf8, ingin utf16 - put utf16. Tautan phpwact.org tampaknya sudah mati.
StasM
1
Saya benar-benar berharap bahwa ekstensi intl akan diaktifkan secara default, sehingga orang-orang yang membutuhkan UTF-8 (bukan semua orang?) Tidak harus melawan host mereka untuk mendapatkan fungsi string untuk berperilaku seperti yang diharapkan.
Emil Stenström
Juga, terima kasih atas klarifikasi tentang string. Saya sudah jauh dari PHP untuk sementara waktu sekarang, jadi saya agak berkarat. Saya malah berperang unicode dengan Python, yang memiliki masalah yang sama seperti PHP, tetapi menyelesaikannya dengan Python 3. Memiliki "Swedia" dalam nama Anda berantakan :)
Emil Stenström
Ini jelas salah satu bidang yang saya ingin melihat peningkatan.
Nathan Osman
32

Buat objek string seperti, dengan metode bawaan untuk mengganti yang non-objek yang dinamai dan parameter. misalnya

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

dll.

Sunting: satu hal lagi: Metode ini harus selalu mengharapkan dan memancarkan UTF-8, kecuali untuk yang secara khusus dimaksudkan untuk menangani penyandian. Jika input tidak valid UTF-8, pengecualian harus dilemparkan, bahkan jika output dari fungsi tidak akan terpengaruh oleh pengkodean.

rjmunro
sumber
up, itulah tepatnya yang saya tuju.
Kemo
1
subject->verb(object), membuat urutan parameter lebih mudah diingat.
Ming-Tang
+1 Saya bermain-main dengan membuat kelas string saya sendiri untuk melakukan hal semacam ini, itu membuat pengkodean jadi lebih mudah dan Anda tidak pernah melupakan urutan parameter.
DisgruntledGoat
2
Jadi apa yang akan is_object($string)kembali? Ini akan merusak kompatibilitas ke belakang, atau menghasilkan pengenalan objek yang hampir tidak intuitif, tetapi tidak cukup.
Tgr
@ Tr: is_object () harus ditinggalkan - Seharusnya tidak ada yang namanya "bukan objek". Dalam jangka pendek, itu harus menjadi properti yang bisa Anda matikan pada objek apa pun, dan konstruktor string default akan mematikannya.
rjmunro
24

1) Saya akan senang jika objek yang baru instantiated mengembalikan "$ this" sehingga saya dapat menggunakan metode chain, $ user = Pengguna baru ('john') -> setLastName ('Doe') -> save ();

2) Jika Anda pernah menggunakan ruby, dan simpul terbaru, mereka memiliki shell interaktif yang hebat (IRB). Saya ingin PHP memiliki yang benar-benar bermanfaat.

3) Ciri-ciri / Mixin, tapi saya dengar mereka ada di jalan.

4) Saya ingin kedua array pendek $ myArray = ['my', 'array'];

5) Penamaan / pesanan yang konsisten (yaitu tumpukan jerami jarum)

Jakefolio
sumber
Saya benci harus membuat create()metode yang tidak melakukan hal khusus hanya untuk mengatasi # 1!
Alan Pearce
Saya melakukan hal yang sama tetapi, menggunakan pengikatan statis akhir dan superclass objek, dengan cara itu setiap kelas yang memperpanjang superclass saya memiliki metode, misalnya: SomceClass extends SuperObject {}; SomeClass :: create () -> somemethod ();
dukeofgaming
Lihat github.com/philsturgeon/php-ps Ini hanya permulaan tetapi dengan bantuan itu bisa sangat berguna.
Phil Sturgeon
1
Ada juga paket PEAR yang menawarkan shell interaktif untuk mengode
kguest
(Foo baru ()) -> bar () adalah bagian dari 5.4. 3) dan 4) juga.
StasM
20

1) harap sertakan include (). Referensi ke file lain harus menjadi referensi, dan tidak benar-benar menempatkan konten dari satu file kode sumber ke yang lain. Terlalu banyak pemrogram PHP menggunakan termasuk () sebagai jenis panggilan fungsi daripada sarana untuk referensi perpustakaan. Ini menyebabkan semua jenis ambiguitas dalam keadaan variabel dan kode tidak stabil. Ganti ini dengan perintah 'gunakan' seperti Perl.

2) mohon berikan metode out of the box untuk mengkompilasi aplikasi PHP ke dalam file bytecode yang dapat didistribusikan atau dieksekusi. Ini akan sangat meningkatkan daya tarik PHP sebagai bahasa pengembangan komersial. Ini harus menjadi komponen dasar bahasa. Jangan khawatir tentang file html yang digunakan untuk GUI aplikasi karena ...

3) tolong singkirkan kemampuan untuk menanamkan tag PHP ke dalam HTML. Atau setidaknya menyediakan mode 'tanpa embed'. Ini adalah kekacauan mutlak dan mendorong desain yang buruk dengan menggabungkan logika aplikasi dan presentasi bersama. Pengembang harus menggunakan templat untuk tampilan dan tidak menampar file PHP bersama dan berharap yang terbaik.

Tertanda,

GrandmasterB

ps: jangan dengarkan apa yang orang lain katakan, saya baik-baik saja sepanjang tahun

GrandmasterB
sumber
37
1). Termasuk bagus. Semuanya sudah termasuk. 2). Ini bagus. 3) Templating adalah fitur terkuat PHP . Memaksa Anda menggunakan beberapa omong kosong templating lain akan menjadi langkah yang sangat buruk.
Josh K
8
Saya suka (1) dan (2), tetapi (3) sepertinya merupakan langkah retrograde. PHP memberi Anda kekuatan templating, terserah Anda apakah Anda menggunakannya dengan bijak atau tidak.
geekbrit
11
3 tidak masuk akal - tag embedding diperlukan untuk V dalam kerangka kerja MVC.
Alex
9
Saya membaca jawaban ini sebagai "Dear Santa, tolong jadikan PHP bukan PHP."
Stephen
1
3 benar, karena PHP adalah bahasa templating.
Andrew
18

Arahan ini untuk E_ERRORpada konstanta yang tidak terdefinisi, daripada menganggap itu adalah string dengan E_NOTICE.

Annika Backstrom
sumber
1
Konstanta kelas melakukan itu, btw.
StasM
4
Serius, saya tidak mengerti mengapa mereka membuat PHP menerima string yang tidak dikutip. Itu hal paling bodoh yang pernah ada. Saya akan memilih salah satu E_ERRORatau E_PARSE.
BoltClock
14

Normalisasikan namespace global dengan konvensi penamaan yang dipikirkan dengan matang yang masuk akal bagi pendatang baru!

Mengutip Jeff Atwood yang kami cintai: PHP payah tetapi tidak masalah !

David Murdoch
sumber
1
Saya setuju secara prinsip, tetapi tidak tahu bagaimana melakukannya dalam praktek :)
StasM
3
@StasM: Saya membayangkan langkah pertama adalah membuat versi perpustakaan baru dengan namespace dan mengizinkan pemrogram (melalui pengaturan ini) untuk menonaktifkan perpustakaan global saat ini. Saya pikir paket kompatibilitas untuk versi yang lebih lama, tetapi seharusnya tidak terlalu sulit untuk ditulis.
Michał T
13

String harus berupa objek

Kemo
sumber
1
Saya berharap saya dapat memperbaiki ini lebih dari satu kali.
EricBoersma
13

1) Sintaks array / objek yang lebih pendek, ala JavaScript (seperti yang disebutkan sebelumnya)

2) Izinkan constvariabel untuk memungkinkan hasil perhitungan seperti define()halnya.

3) Rantai langsung dari konstruktor: new User()->name('Ryan');

4) Array dereferencing: something_that_returns_array()[4];

5) Dukungan SPL yang diperluas. SPL melakukan pekerjaan yang layak untuk menata kembali fungsi string dan array (antara lain) sebagai objek. Memperluas SPL bisa mengatasi banyak keluhan tentang bahasa yang begitu janky.

6) Menggunakan ArrayObject()harus setransparan menggunakan array(). Anda harus dapat melakukan hal-hal seperti array_filter($array_object_instance)tanpa melakukan array_filter($array_object_instance->getArrayCopy()). Bahkan lebih baik, tentu saja $array_object_instance->filter().

7) Unicode penuh akan menyenangkan.

8) Berhenti melakukan konversi tipe otomatis yang aneh. Misalnya, Anda tidak boleh dapat echoobjek SimpleXMLElement tanpa terlebih dahulu mengetikkannya sebagai string. Atau setidaknya, melempar sesuatu ketika itu terjadi (misalnya, dalam mode ketat, atau mode apa pun error_reporting(-1)itu).

9) Dukungan untuk beberapa utas, atau semacam callback yang terjadi / tidak sinkron. Ini paling penting ketika mencoba mengunggah file besar melalui cURL. Alih-alih benang skool lama, sesuatu seperti Grand Central Dispatch Apple akan lebih baik. Atau bahkan sesuatu yang mirip dengan JavaScript di mana Anda dapat membuat permintaan async dan menentukan panggilan balik.

10) Penamaan / pesanan yang konsisten (yaitu tumpukan jerami jarum) akan menyenangkan, tapi saya pikir ini bisa lebih baik diselesaikan dengan SPL.

11) Shell PHP interaktif yang didukung secara resmi, seperti IRB. Facebook memiliki satu panggilan phpshyang ditulis dengan Python, tetapi tidak memiliki polesan yang ingin saya lihat.

12) Untuk Reflection API, tambahkan dukungan untuk (a) komentar blokir pada konstanta (global & kelas), dan (b) dukungan untuk mem-parsing komentar seperti PHPDoc ke dalam struktur data yang masuk akal. Ada paket PECL yang disebut "docblock" yang mencoba melakukan ini, tetapi sepertinya penulis tidak terlalu jauh.

EDIT: 13) Saya juga ingin melihat kemampuan untuk menggunakan !dan ?dalam nama-nama fungsi - seperti Ruby.

Ryan Parman
sumber
Saya setuju, bahwa objek array harus didukung untuk fungsi array_ *. tapi apa yang akan menjadi hasil yang diharapkan untuk sesuatu seperti "array_merge" jika Anda mempertimbangkan subclass dari arrayobject. apakah Anda hanya diizinkan untuk menggabungkan instance dari kelas yang sama dan apa yang akan dikembalikan array_merge? php array atau instance dari arrayobject (masing-masing adalah subclass)?
Harald
Saya berpendapat bahwa karena data internal adalah array, dan ArrayObject membungkusnya dengan fungsionalitas, maka bahkan subclass dari ArrayObject masih akan bekerja dengan array secara internal. Saya berharap dapat menggabungkan array standar lain atau ArrayObject (atau subclass). Sejauh apa itu akan kembali, saya berpendapat bahwa itu juga harus mengembalikan ArrayObject baru, tetapi ikuti preseden yang simplexml_load_string () atur di mana Anda dapat menentukan nama kelas yang hasilnya harus merupakan turunan dari.
Ryan Parman
12

1) Array pemahaman dalam gaya pemahaman daftar Python:

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

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

2) Sintaks array pendek

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

3) Buat kosong () tidak menganggap string '0' sebagai benar

sfrench
sumber
2
Saya pikir untuk (1) sesuatu yang dimasak dari iterator & penutupan akan lebih baik.
StasM
+1 IMHO, ini harus dimasukkan dalam semua bahasa, serta iterator. Mereka hanya cara agar tidak berguna.
Evan Plaice
empty()adalah kebalikan dari if ($x), jadi masuk akal kalau empty('0')itu benar, karena if ('0')itu salah. Satu-satunya perbedaan adalah, empty()tidak membuang pemberitahuan jika variabel tidak disetel.
Andrew
12

Saya ingin melihat metode yang sah untuk membuat / mendefinisikan array KONSTAN. Ada beberapa cara meretas untuk mensimulasikan fungsi semacam ini tetapi akan lebih baik jika itu hanya fitur langsung dari PHP. Akan lebih baik jika Anda bisa membuat array dengan cara yang mirip dengan deklarasi "final" Java.

Saya membuat sistem login yang sangat cepat untuk diatur. Yang harus Anda lakukan adalah mengubah konten array dalam file teks untuk menentukan bidang yang Anda inginkan untuk informasi pengguna. Menggunakan petak untuk loop, ia menangani semuanya, mulai dari pembuatan formulir dan kepekaan input, hingga panggilan basis data, tetapi semuanya bergantung pada array asli ini.

File dengan array dikunci dengan izin tetapi begitu array bergerak di dalam eter itu bisa berubah. Meskipun saya merasa sistemnya cukup aman, saya tidak suka membiarkan apapun terjadi secara kebetulan. Metode untuk menyelesaikan array akan bagus untuk situasi seperti ini.

Ide baru!!

Ohhh, saya memikirkan hal lain yang benar-benar saya sukai di php. Saya ingin beberapa jenis sistem untuk mengontrol operasi file php dan operasi direktori yang mirip dengan cara .htaccess berfungsi.

File .phpaccess harus memicu semacam domain / kebijakan asal yang sama.

Sebagai contoh, Jika saya hosting banyak situs dengan host virtual saya bisa memiliki file .phpaccess di direktori yang akan memberitahu php untuk memeriksa bagian dari skrip yang sedang dieksekusi yang mencoba untuk beroperasi pada direktori yang dilindungi saya. Jika skrip tidak berasal dari direktori atau sub-direktori tersebut maka operasi file / atau operasi socket akan ditolak.

Saya pikir sistem seperti ini akan membuat hosting virtual menjadi lingkungan yang jauh lebih aman. Jika Anda dapat menempatkan salah satunya di atas setiap host virtual, ini akan mengurangi peluang seseorang menemukan cara untuk menyelinap masuk dari host virtual tetangga.

Juga jika akan baik untuk memiliki metode pengamanan dalam kebalikan dari cara ini. yaitu, membatasi jangkauan skrip dalam satu direktori ke direktori itu.

Ini yin dan yang kamu tahu!

Dave B.
sumber
+1 untuk final. Untuk memperjelas: finalberarti bahwa nilai suatu variabel dapat diset pada saat runtime (tidak seperti konstanta, yang harus berupa ekspresi konstan), tetapi hanya dapat ditetapkan satu kali. Lihat juga C # readonly.
davidtbernal
1
ada proposal untuk getter / setter untuk trunk yang akan menggantikan readonly, dll. Array yang tidak dapat diubah meskipun mungkin akan sulit dilakukan.
StasM
Re phpaccess, PHP sudah memiliki "safe mode" yang melakukan apa yang Anda gambarkan.
DisgruntledGoat
11

Dua keinginan terbesar saya sebagai programmer PHP hardcore:

  1. Dukungan akhirnya. Ini adalah kekacauan besar untuk secara fiksi menyiasati ini melalui bendera atau cara serupa.
  2. Saya akan SENANG melihat dukungan pada sintaks C # untuk getter dan setter. Ketika Anda memiliki banyak pengambil dan penyusun sintaks sederhana seperti C # adalah pendongkrak kinerja yang hebat alih-alih melakukannya dengan cara Java dan menulis metode pengambil dan penyetel. Metode ajaib luar biasa dalam kasus di mana Anda ingin membuat anggota secara dinamis (misalnya, jika Anda ingin memberikan renderer template beberapa variabel untuk digunakan), tetapi tidak baik untuk properti normal yang Anda inginkan IDE untuk autocomplete, ketahui mereka jenis, dan sebagainya. ini akan membantu membuat kode lebih kecil dan masih terbaca dan mudah digunakan.
Johnco
sumber
1
1. sayangnya, ini sulit dilakukan, tapi pasti item todo yang bagus 2. wiki.php.net/rfc/propertygetsetsyntax
StasM
@StasM: bagaimana kalau melakukannya melalui anotasi? Sesuatu di sepanjang baris: / ** @ get getFoo; @set setFoo; * / private $ foo;
Michał T
9

Sintaks bahasa : Ada beberapa petunjuk bagus dalam pihipi dan phpreboot tentang apa yang diminati pengembang (meskipun phpreboot terlalu jauh menjadi JS).

Metodologi pengembangan : Ini akan sangat meningkatkan umur PHP.net jika survei tersebut benar-benar diperhitungkan. Jangan membuat lagi keputusan sintaks sesi IRC sore yang mau tak mau.

Fitur individu : Beberapa telah disebutkan sebelumnya, tapi saya akan dengan senang hati membakar karma untuk menjadi lebih tumpul di sini:

  • Jenis string Unicode.
  • Bigint (lihat Python).
  • Runkit builtin untuk menghapus / mengganti nama / mengabaikan fungsi dan kelas builtin, yang tidak selalu dirancang dengan baik.
  • OOP modern
    • multiple inheritance (alih-alih kompleksitas untuk mendukung kasus tepi yang jarang dengan sintaksis yang canggung)
    • skalar dapat berfungsi ganda sebagai objek (lihat Python), mis. array () berfungsi sebagai ArrayObject, atau string sebagai SplString (perlu metode yang dapat digunakan, semua fungsi string harus tersedia sebagai str::toupper())
  • Menghilangkan \sintaks namespace shitty shit , memperbaiki parser, dan mengadopsi ::sebagai alternatif. Anda tahu, seperti bahasa asli.
  • Setiap variasi LINQ (meskipun saya tidak percaya kalian merancang sintaks yang masuk akal)
  • atau XML literal.
  • Singkirkan perilaku runtime php.ini dan sakelar semantik. Memang benar, hal itu menghilangkan kegembiraan, tetapi akan menguntungkan pengembang dan basis pengguna.
  • Ya, magic_quotes belum hilang.
  • Ubah bytecode Zend Engine ke PBC

Meskipun, jika ini tidak jelas, saya dengan senang hati akan mendanai orang lain untuk melakukan yang terakhir, dan membunuh php.net sebagai implementasi utama. :P
Oh, perhatikan saja, ini adalah wiki komunitas. Jadi ada kemungkinan Anda sebenarnya bukan di sini untuk karma, tetapi minat yang tulus. Jika demikian, lihat ke dalam <b> masalah </b> yang benar-benar menyakitkan bahasanya (directoritis).

mario
sumber
5
Saya benci sintaks namespace, tapi itu cerita yang panjang dan menyedihkan mengapa menjadi begitu dan mungkin tidak akan berubah ... Mungkin jika saya bisa mengubah satu hal saja di PHP yang akan menjadi kandidat utama saya. Tapi begitulah adanya.
StasM
@StasM: Terima kasih atas umpan balik dan maaf karena tidak sopan tentang beberapa hal PHP, tapi saya peduli tentang PHP; karenanya sangat keras kepala. - Saya sudah membaca sedikit tentang alasannya. Dilema backslash belum menjadi masalah yang sangat besar, tetapi akan menjadi tahun depan ketika perpustakaan menyebar. Jadi saya harap seseorang menulis parser yang menulis ulang \ cargo \ cult \ class \ names kembali ke skema garis bawah.
mario
Mungkin aku bodoh, tapi apa bedanya apakah kita menggunakan '::' atau '\' untuk ruang nama?
Michał T
@Pies: Itu ::akan lebih alami untuk bahasa sintaksis C / C ++ apa pun. Dan `\` tidak hanya abnormal di antara semua bahasa pemrograman, tetapi memiliki konotasi yang belum teruji. Beberapa diskusi sebelumnya: stackoverflow.com/questions/238550/… atau developers.slashdot.org/article.pl?sid=08/10/26/1610259 dan reddit.com/r/programming/comments/79cut/… - Tetapi di khususnya memutuskan itu tanpa umpan balik dan menandakan komunitas pengembang untuk menyedotnya bukanlah langkah yang disambut baik.
mario
1
+ 1000000 untuk banyak warisan.
ts01
8

Saya ingin melihat penyatuan Kesalahan dan Pengecualian menjadi satu konsep (Pengecualian). Sangat bagus untuk dapat menangkap pengecualian dan menulisnya ke log, untuk menemukan dan memperbaiki bug dengan cara itu. Tetapi jika ada sesuatu yang secara fundamental salah (baca: Kesalahan PHP) dalam codepath yang sangat jarang ditemukan, tidak ada cara yang baik untuk menyalurkan informasi itu ke dalam basis data masalah yang sama.

Tolong, Santa, perkenalkan sakelar di php.ini yang akan membuat semua kesalahan menjadi pengecualian - idealnya, pengecualian yang bisa saya tangkap dalam kode saya.

Alex
sumber
1
Sudah ada dukungan di mesin untuk itu dan banyak ekstensi menggunakannya. Anda juga dapat melakukannya dengan mudah dengan set_error_handler () dan ErrorException. Waspadalah terhadap E_STRICT / E_NOTICE / E_DEPRECATED ...
StasM
Saya sangat menyadari metode ini dan mereka benar-benar gila. Saya suka cara terpadu - yang termasuk E_STRICT / E_NOTICE dan semacamnya.
Alex
7

PHP sangat cocok untuk saya karena mengetuk situs web kecil hingga menengah; Saya harus sedikit tidak imajinatif, satu-satunya hal yang dapat saya pikirkan sebagai jawaban atas pertanyaan ini adalah sesuatu yang membuatnya lebih baik untuk situs dengan lalu lintas tinggi.

Saya sedang berpikir dalam hal memunculkan proses ke core lain, misalnya memperbarui database dalam satu proses sambil membuat halaman output dalam proses lain. Pencarian google cepat menunjukkan bahwa ini dapat disimulasikan, tetapi tidak didukung secara langsung di php saat ini.

geekbrit
sumber
1
Sebenarnya, berpikir lebih banyak tentang hal itu, membongkar basis data tampaknya merupakan skenario yang menarik, jadi
beri
1
@Stasm, saya anggap maksud Anda bahwa permintaan terpisah dijalankan sebagai proses terpisah. Saya sedang berbicara tentang halaman yang rumit yang membutuhkan pembuatan halaman dan perhitungan latar belakang. Saya bisa saja salah, tetapi saya rasa tidak ada cara untuk memunculkan (misalnya) operasi pembaruan basis data dalam proses terpisah. Alasan untuk melakukan ini adalah untuk mendapatkan halaman dikirim ke pemohon lebih cepat, daripada harus menunggu semua pemrosesan yang tidak terkait langsung dengan menghasilkan halaman untuk menyelesaikan secara seri. PS .. Terima kasih atas pembaruannya!
geekbrit
7

Saya sangat merindukan bahwa tipe skalar tidak diperlakukan sebagai objek, dan objek nyata tidak dapat bertindak seperti tipe atau objek lain (kecuali untuk string karena __toString ()).

pestaa
sumber
Ya, metode ajaib untuk typecasting.
Michał T
7
  • dukungan untuk enumerasi (seperti java 1.5+)
  • Mampu mendefinisikan jenis metode pengembalian, di antarmuka dan kelas
  • mendukung definisi anotasi / metadata tentang properti dan metode.
  • dapat melakukan petunjuk tipe ketat untuk argumen skalar metode.
Kees van Dieren
sumber
+1 Karena saya ingin melihat semua itu dalam PHP.
Jeremy
6

Bersihkan "Catatan Kontribusi Pengguna" di http://php.net . Kadang-kadang mereka benar-benar berantakan, sementara menjadi nilai besar secara umum.

bobah
sumber
1
Beberapa jenis fungsi naik / turun suara dan kemampuan untuk menautkan ke komentar asli di balasan tentu akan menyenangkan.
Tgr
5

Ada beberapa fungsi array yang cukup baik di PHP, menyediakan kapasitas pemrosesan daftar, dengan panggilan balik dan create_function()menyediakan kalkulus lambda dasar.

Masalah utama dengan itu, adalah bahwa itu terlalu bertele-tele dalam PHP, sistem singkatan akan sangat baik, terutama di mana peta / mengurangi perintah yang bersangkutan.

Lebih penting lagi, fungsi daftar tidak sepenuhnya lengkap:

  • tidak ada foldrfungsi, array_reduce()menyediakanfoldl
  • array_map() harus meneruskan kunci dalam argumen kedua, seperti array_walk() halnya
  • sebuah array_map_keys() dapat berguna untuk modifikasi kunci
  • Pemahaman daftar sangat kikuk range(), array_fill()dan array_fill_keys()hanya menangani begitu banyak kasus, dan array_filter()terpisah

Saya tidak bermaksud membuat PHP ke Haskell, tetapi PHP sering digunakan untuk manipulasi struktur data tipe daftar dan memiliki seperangkat alat lengkap dalam hal ini akan berguna.

Orbling
sumber
1
Seorang kolega saya juga berpikir mungkin ada / harus ada tambahan fungsi lain array terkait; di disebutkan pada akun github-nya: Ini adalah kurangnya array_all () dan array_any (), yang memeriksa apakah * suatu kondisi yang diwakili oleh penangguhan panggilan balik untuk semua atau salah satu elemen dalam array. gist.github.com/44350
kguest
5

Overloading operator:

$result = $MatrixA + $MatrixB * $MatrixC;
MicE
sumber
1
Tidak yakin seberapa baik ini akan mengklik dengan PHP menjadi bahasa yang diketik secara dinamis.
BoltClock
5
Mungkin itu harus dilakukan melalui metode sihir, seperti __add ($ obj), __times ($ obj) dll.
Michał T
itu sudah ada sebagai PECL ext: pecl.php.net/package/operator . Seharusnya tidak terlalu banyak pekerjaan untuk menggabungkannya dengan sumber utama
Xananax
4

Tambahkan Pengecualian alih-alih menghasilkan E_WARNING ... Sangat menjengkelkan karena saya tidak dapat menggunakan sesuatu seperti:

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

Tentu saja, saat ini tidak terlalu praktis tetapi sangat menjengkelkan untuk menerima:

PERINGATAN

PERINGATAN

PERINGATAN

dan saya tidak dapat mengontrol aliran kode tanpa menulis error_handler saya sendiri dan mengendus string kesalahan yang telah dihasilkan (izin, nama file salah atau apa pun; Saya tidak keberatan tentang sumber kesalahan lain di sini) untuk melemparkan pengecualian yang benar .

Saya harap saya belum menjelaskan mengapa ini penting.

PHP menjadi Object-Oriented beberapa waktu yang lalu dan kami, programmer yang menggunakan PHP, menantikan fitur OO, tidak memperkenalkan "goto" ... Ketika saya menemukan itu benar-benar bahagia, saya pikir itu adalah hari April Mop.

ERIZ
sumber
Kecuali ketahuan, pengecualian akan mematikan skrip. Peringatan, pada server produksi, akan dicatat dan tidak pernah ditampilkan kepada pengguna. Mengubah fungsi ini sekarang akan memecah banyak skrip karena mereka tidak dirancang untuk menangkapnya. (Perhatikan, bahwa saya menulis penangan kesalahan untuk melempar pengecualian sendiri). Sekarang, hal-hal PDO dapat memberikan peringatan atau pengecualian: programmer memutuskan saat runtime. Fungsionalitas itu mungkin salah satu yang harus ditambahkan ke lebih banyak modul.
Reece45
4
  1. Mengkonsolidasikan model objek - membuat semua objek memperluas kelas Object dasar. Kelas Object akan (antara lain) mengimplementasikan semua metode sihir (jadi mereka tidak lagi ajaib!)

  2. Pindahkan ekstensi ke ruang nama mereka sendiri - hapus berantakan ruang nama global $conn = new \MySQLi\Connection();

  3. Batalkan spl_autoload()fungsi! Serius, ini mungkin salah satu fitur terbesar dari PHP dan juga yang paling tidak berguna pada saat yang sama. spl_autoloadadalah autoloader default, yang mendukung ruang nama dan beberapa ekstensi file, tetapi untuk beberapa alasan yang tidak diketahui mengharuskan nama file lebih kecil. Ada laporan bug yang diisi untuk ini , tetapi staf menjawab mereka tidak akan memperbaikinya karena kompatibilitas ke belakang. Benar ... ini tidak seperti setiap kerangka kerja yang dilengkapi autoloadernya sendiri, karena yang default lumpuh!

Mchl
sumber
4

Bawa taint support hingga versi terbaru dan sertakan dalam build standar, lebih baik dihidupkan di konfigurasi default http://wiki.php.net/rfc/taint

Ini akan mencegah serangan injeksi XSS dan SQL dengan membuat kode orang dengan benar.

rjmunro
sumber