Saya tidak suka PHP berubah menjadi apa





Dan saya sudah tahu apa yang akan Anda katakan, melihat judul artikel:

- Siapa Anda? Mengapa Anda membiarkan diri Anda mengatakan itu?



Saya akan langsung jawab supaya tidak ada kelalaian:



  • Saya telah memprogram secara profesional dalam PHP sejak tahun 2004, yaitu, selama 16 tahun pada saat penulisan ini, dan saya terus melakukannya setiap hari.
  • Saya telah mengajar pemrograman, termasuk PHP, selama sekitar 10 tahun dan selama ini saya telah melepaskan beberapa ribu siswa
  • Saya selalu senang dengan setiap versi baru PHP yang keluar dari waktu 5.0 hingga 7.4 dan selalu mengikuti pendekatan "tulis di versi terbaru, uji selanjutnya"


Namun, terlepas dari semua hal di atas, saya tidak suka seperti apa PHP sekarang dan akan segera berubah menjadi apa, secara harfiah musim gugur ini.



Hampir setiap RFC yang diadopsi di PHP 8 membuat saya sakit dan bingung. Dan saya siap untuk menjelaskan dan mempertahankan posisi saya.



Konsep bahasa dasar berubah



Bagaimana biasanya belajar bahasa baru dimulai? Nilai, ekspresi, variabel dan fungsi. Itu adalah urutan alami saat mempelajari PHP.



Ketika kita mulai membahas fungsi, saya menarik perhatian khusus siswa pada fakta bahwa dalam PHP konteks fungsi ditutup, "disegel". Ini sangat sederhana dan sepenuhnya logis - Anda hanya perlu mengingat dengan jelas nama apa yang dilihat fungsi: argumennya dan variabel internalnya.



Ketika kita sampai ke dasar-dasar OOP dan mempelajari konsep "metode", kita mengandalkan konsep fungsi, dan menambahkan klausa lain ke konteks: $ this dalam metode dinamis. Apakah ada hal lain yang berubah? Tidak. Fungsi masih tertutup, konteksnya berhenti ada setelah panggilan, dari luar tidak ada yang mengalir ke dalam fungsi, tidak ada yang mengalir keluar juga.



Kami datang ke fungsi anonim - dan di sini aturan permainan juga tidak berubah. Argumen? Iya. Variabel internal? Iya. $ ini? Oke, mari kita membahas pertanyaan ini, jika tidak kita harus membahas hal aneh yang disebut "fungsi anonim statis" :)



Selanjutnya, kita menambahkan konsep "penutupan". Semuanya logis dengan dia, juga, kata kunci terpisah, daftar variabel terakhir dari konteks pembuatan, prinsip-prinsip dasar tidak dilanggar. Dan mengingat bahwa nilainya ditutup, dan bukan namanya, maka semuanya baik-baik saja secara umum - fungsi terus "disegel". Tidak ada yang dari luar akan meresap, tidak ada yang keluar.



Tahukah Anda apa yang terjadi selanjutnya?



Dan kemudian kami memiliki fungsi panah. Dan itu merusak segalanya.



Saya dipaksa untuk menjelaskan bahwa fungsi panah melanggar prinsip yang sulit dipelajari karena mereka mengunci SELURUH konteksnya pada saat pembuatannya.



Ops.



Tapi bagaimana dengan prinsip "sesak"? Tapi bagaimanapun juga, mereka tidak memperdulikannya demi penyederhanaan penulisan, menyimpan 6 karakter - sekarang kita punya "fn" bukan "function".



Buruk. Tidak konsisten.



Apakah menurut Anda ini satu-satunya contoh? Tidak peduli bagaimana itu.



Ajukan pertanyaan kepada noob - karakter apa yang dimulai dengan nama dalam PHP? Benar, dengan "$"



  • nama variabel
  • nama properti objek
  • nama properti kelas
  • nama argumen
  • bahkan "variabel variabel" juga "$"!


Apakah itu logis? Iya. Secara konsisten? Iya. Anda hanya perlu mengingat tentang konstanta yang tidak membutuhkan $.



Apa yang kita miliki sekarang? Argumen bernama: wiki.php.net/rfc/named_params



array_fill(value: 50, num: 100, start_index: 0);


Dimana "dolar"? Tidak.



Ini masalah.



Sekarang Anda harus ingat bahwa Anda perlu menulis "dolar" di tanda tangan fungsi tersebut, tetapi tidak saat dipanggil. Dan ini adalah masalah yang sangat serius yang melanggar sistem integral bahasa tersebut. Ini buruk dan tidak konsisten.



Untuk apa? Ya, hanya karena seseorang ingin mentransfer gula dari Python ke PHP tanpa berpikir panjang. Namun, Python setidaknya menggunakan simbol "=" yang sama untuk mencocokkan nama dan nilai, baik dalam tugas dan argumen bernama, dan sekarang kita akan memiliki dua di antaranya - "=" dan ":" yang biasa dalam konstruksi baru.



Hampir setiap RFC yang dibahas untuk PHP 8 membawa masalah yang sama - pelanggaran terhadap sistem bahasa yang telah ditetapkan sebelumnya. Dan itu buruk. Itu mematahkan pikiran baik bagi mereka yang telah menulis dalam PHP untuk waktu yang lama, dan bagi mereka yang baru mulai mempelajarinya.



Lihat: (wiki.php.net/rfc/match_expression_v2 )



echo match (1) {
    0 => 'Foo',
    1 => 'Bar',
    2 => 'Baz',
};


ini adalah ekspresi pertandingan baru. Bisakah Anda menjelaskan mengapa mereka menggunakan simbol "=>" dan bukan switch-case biasa ":"? Saya juga tidak bisa.



Ini sekali lagi merupakan pelanggaran terhadap sistem yang sudah mapan. Simbol "=>" selalu (sebelum fungsi panah sialan, mereka lagi!) Menunjukkan pemisah pasangan nilai-kunci. Sekarang juga menunjukkan pemisah nilai-kembali-argumen di "panah" dan karakter nilai-pilih dalam pernyataan kecocokan.



Ini buruk. Ini sangat buruk. Ini sangat tidak konsisten. Ini bahkan lebih buruk daripada kata kunci statis, yang memiliki setidaknya tiga arti yang berbeda secara fundamental.



Bahasa alami tidak terbaca



Tunjukkan teks asli bahasa Inggris



SELECT * 
FROM users
WHERE age>=18 AND name LIKE 'J%'


dan dia, jika IQ-nya melebihi 60, akan dengan mudah menjelaskan tentang teks ini dan apa yang akan dilakukan dalam penerapan teks ini sebagai program.



Tunjukkan seorang jenius yang tidak terbiasa dengan JS teks



const f = () => 42;


dan dia tidak akan mengerti apapun. Konstan? f adalah tanda kurung ini? Apakah tanda kurung mengarah ke angka? Apa itu?



Saya selalu senang PHP jauh dari mengorbankan keterbacaan kode demi singkatnya. Saya senang itu jauh dari JS, di mana prinsip keterbacaan kode ditinggalkan demi "tulis lebih sedikit karakter, toh tidak ada yang akan membaca kode ini."



Sekarang saya menyadari bahwa PHP 8 akan melanggar prinsip keterbacaan alami. Dan, tampaknya, tidak dapat dibatalkan.



Lihat saja contoh berikut:



wiki.php.net/rfc/constructor_promotion



class Point {
    public function __construct(
        public float $x = 0.0,
        public float $y = 0.0,
        public float $z = 0.0,
    ) {}
}


Sekarang, alih-alih argumen konstruktor, kami langsung mendeklarasikan properti dan menyetel nilainya dari argumen.



Tebak apa yang ada setelah tanda "="? Nilai properti awal? Atau nilai default dari argumen konstruktor? Tidak mungkin ditebak. Cari tahu dengan membaca kodenya - juga. Ini buruk. Tempat lain untuk belajar dengan hati.



wiki.php.net/rfc/property_write_visibility



class User {
    public:private int $id;
    public:protected string $name;
}


Properti publik-pribadi? Sungguh? Bagaimana memahami dari kode ini bahwa kita berbicara tentang properti yang dapat dibaca dan properti yang dapat ditulis?



wiki.php.net/rfc/conditional_break_continue_return



    function divide($dividend, $divisor = null) {
        return if ($divisor === null || $divisor === 0): 0; 
        return $dividend / $divisor;
    } 


Serius, ada yang butuh ini? Seseorang menulis selama bertahun-tahun dalam PHP dan menderita karena tidak dapat menulis "return ... if" daripada "if ... return"? Apakah kita benar-benar membutuhkan sintaks yoda baru untuk banal if dan return?



Terlalu banyak cara untuk melakukan hal yang sama



PHP selalu melanggar prinsip terkenal "harus ada satu dan hanya satu cara ..." Tetapi PHP melakukannya dengan cerdas, sedikit demi sedikit, dan masuk akal.



Sekarang prinsip ini telah diinjak-injak dan dihancurkan. Setiap RFC yang diterima mengatakan, "mari tambahkan cara lain untuk menulis if, karena saya telah melihat ini di Perl / Python / Ruby / Brainfuck!" - dan pembenaran lainnya, kecuali sebagai "Saya melihat", secara umum, tidak diberikan.



Apa yang terjadi:



if ($y == 0)
  return 0;

if ($y == 0) {
  return 0;
}

if ($y == 0):
  return 0;
endif;


- sebanyak tiga cara untuk merekam hal yang sama. Tidak terlalu bagus, Anda harus menjelaskan: mengapa ada tiga, mengapa Anda tidak boleh menulis kode tanpa tanda kurung operator, dan mengapa Anda memerlukan sintaks alternatif.



Tapi ini tidak cukup! Tunggu sebentar dan Anda akan melihat:



//  -If
return if ($y == 0): 0;


Beginilah fungsi-fungsi itu dipanggil:



foo(bar($baz));


Anda akan segera melihat ini:



$baz |> 'bar' |> 'foo'


- brilian, bukan? Segera jelas bahwa ini adalah pemanggilan fungsi!



Dan saya belum menulis apa pun tentang fungsi panah :)



Lebih banyak, lebih banyak cara untuk melakukan apa yang telah dilakukan sebelumnya tanpa masalah:



  • ekspresi pertandingan
  • operator "? ->"
  • dua sintaks berbeda untuk closure
  • loop + lain
  • konstruktor statis
  • deklarasi properti dalam argumen konstruktor (!)


dan banyak lagi, yang hanya akan membuat kode lebih sulit untuk dibaca dan bahasa lebih sulit untuk dipelajari.



Hasil



PHP sedang berkembang. Ini adalah proses penting yang memengaruhi banyak orang dan memengaruhi seluruh komunitas pemrograman.



Namun, perasaan mulai muncul bahwa perkembangan terjadi di suatu tempat yang salah. Saya khawatir bahwa perubahan yang diadopsi akan mengarahkan bahasa pada fakta bahwa program di dalamnya akan menjadi semakin pendek dan kurang dapat dibaca, pada fakta bahwa itu akan memberikan lebih banyak kesempatan untuk melakukan hal yang sama dengan cara yang berbeda, dan mempelajari semua cara ini akan menjadi itu membutuhkan lebih banyak waktu.



Saya tidak ingin melihat Perl baru menggantikan PHP dalam setahun. Dan kau?



All Articles