mata utama
Konsep penting pengaturcaraan berfungsi
Wikipedia mentakrifkan pengaturcaraan berfungsi sebagai "paradigma pengaturcaraan yang merawat pengiraan sebagai penilaian fungsi matematik dan mengelakkan data keadaan dan berubah". Dalam pengaturcaraan fungsional, fungsi dianggap sebagai warga kelas pertama, sementara dalam pengaturcaraan penting, kami memberi tumpuan terutamanya kepada data dan langkah-langkah untuk mengubah data untuk mencapai hasil yang diharapkan. Apabila kita mengatakan bahawa fungsi adalah warganegara kelas pertama, ini bermakna kita boleh menggunakan fungsi seperti kita menggunakan nilai dalam pengaturcaraan penting. Mereka boleh diluluskan sebagai parameter ke fungsi, yang ditakrifkan dalam fungsi lain, atau bahkan dikembalikan sebagai hasilnya. Dalam erti kata lain, "fungsi adalah nilai". Kami akan membincangkannya lagi kemudian, tetapi pengaturcaraan berfungsi mempunyai banyak konsep penting lain. Untuk menamakan hanya beberapa contoh:Invariance
rekursi juga menonjol dalam pengaturcaraan berfungsi. Dalam pengaturcaraan yang penting, apabila kita perlu memanipulasi set atau tatasusunan, kita boleh menggunakan struktur gelung seperti untuk dan menembusi untuk meleleh melalui setiap elemen dan menggunakan pembolehubah sementara untuk menyimpan nilai semasa. Walau bagaimanapun, pendekatan ini tidak mungkin dalam pengaturcaraan berfungsi kerana invarians. Rekursi adalah jawapannya, kerana pembukuan ini dilakukan secara tersirat melalui timbunan panggilan. Katakan kita mahu menulis fungsi untuk mencari jumlah semua elemen dalam array (lupakan kewujudan array_sum () buat masa ini). Dalam gaya berfungsi, kami akan menulis:
<?php function sum($array) { if (empty($array)) return 0; else return $array[0] + sum(array_slice($array, 1)); } $total = sum(array(1, 2, 3)); // 6 ?>
Senarai kosong akan kembali 0, yang merupakan keadaan asas kami. Untuk array yang mengandungi pelbagai nilai, ia mengembalikan hasil penambahan elemen pertama kepada jumlah rekursif semua elemen lain.
Jika fungsi tidak mengubah nilai objek luarannya sendiri (seperti pembolehubah global atau statik) dan tidak mempunyai kesan I/O (seperti menulis kepada fail, pangkalan data, dll.), Fungsi tersebut dikatakan tidak mempunyai kesan sampingan. Fungsi sedemikian juga dipanggil fungsi tulen. Untuk set parameter yang diberikan, output fungsi tulen akan sentiasa sama, yang menghasilkan harta lain yang dipanggil ketelusan rujukan. Apabila fungsi dirujuk telus, kita boleh menggantikan fungsi dengan nilainya tanpa menjejaskan tingkah laku program. Semua fungsi matematik adalah fungsi murni, manakala fungsi tarikh, rand (), dan lain-lain adalah fungsi bukan liure.
Konsep di atas boleh dilaksanakan dalam hampir mana-mana bahasa pengaturcaraan, tetapi fungsi warga kelas pertama dan fungsi pesanan yang lebih tinggi adalah dua ciri yang paling menonjol dalam pengaturcaraan berfungsi. Saya telah menjelaskan bahawa fungsi warganegara kelas pertama bermakna fungsi boleh dianggap sebagai nilai. Fungsi pesanan yang lebih tinggi adalah fungsi yang boleh berfungsi sebagai parameter dan boleh mengembalikan fungsi sebagai hasilnya. Dua ciri penting baru-baru ini ditambah membolehkan kami menulis fungsi pesanan yang lebih tinggi dalam PHP: Ekspresi dan Penutupan Lambda.
Fungsi Lambda (juga dikenali sebagai fungsi tanpa nama) hanyalah fungsi tanpa nama. Apabila kita menentukan fungsi tanpa nama, rujukan kepada fungsi dikembalikan, yang disimpan dalam pembolehubah untuk kegunaan kemudian. Kami menggunakan pembolehubah ini untuk memanggil fungsi apabila diperlukan. Banyak bahasa yang berbeza mengamalkan konsep ini. Malah, anda mungkin menggunakan fungsi Lambda dalam pengaturcaraan JavaScript harian anda, menggunakannya sebagai panggilan balik untuk interaksi pengguna yang berbeza dan panggilan AJAX.
$("#myButton").click(function () { // do something });
Kod ini sangat mudah dan mudah difahami, yang boleh membuat kita melupakan aspek fungsinya. PHP memperkenalkan ciri kuat ini dalam versi 5.3, yang membolehkan kita menulis kod PHP dengan cara yang sama:
<?php $square = function ($arg) { return $arg * $arg; }; $value = $square(2); // 4 ?>
Apabila bercakap tentang fungsi, terutamanya fungsi tanpa nama, adalah penting untuk memahami bagaimana menangani skop berubah -ubah. Sebagai contoh, JavaScript membolehkan anda mengakses pembolehubah luaran di dalam lambdas, sementara PHP tidak. Lambda mempunyai skop sendiri di dalam, seperti fungsi PHP biasa.
Kadang -kadang, anda mungkin mahu merujuk kepada pembolehubah dalam skop induk di dalam fungsi. Penutupan adalah serupa dengan fungsi Lambda, tetapi sedikit berbeza, dan anda boleh mengakses pembolehubah dengan skop luaran. Kita boleh menggunakan "menjangkau" dan mengikat pembolehubah luaran menggunakan kata kunci penggunaan PHP, yang juga diperkenalkan dalam Php 5.3.
<?php function sum($array) { if (empty($array)) return 0; else return $array[0] + sum(array_slice($array, 1)); } $total = sum(array(1, 2, 3)); // 6 ?>
Dalam kes ini, kita tidak lulus kadar faedah setiap kali fungsi dipanggil. Sebaliknya, kami mentakrifkannya secara luaran dan menggunakan kata kunci penggunaan untuk menjadikannya tersedia di dalam fungsi.
Cukup, beberapa fungsi adalah fungsi yang dibuat dari fungsi sedia ada, dan parameter mereka digunakan sebahagiannya. Anda hanya perlu lulus parameter yang tinggal apabila memanggil fungsi yang dibuat. Kita boleh menggunakan penutupan untuk mewujudkan fungsi separa dalam PHP. Ini adalah contoh untuk mencari kelantangan kotak berdasarkan panjang, lebar, dan ketinggiannya. Semua parameter adalah pilihan;
$("#myButton").click(function () { // do something });
Semua parameter adalah pilihan. Periksa terlebih dahulu sama ada pemanggil telah lulus semua parameter. Dalam kes ini, kita boleh kembali ke kelantangan dengan mengalikan panjang, lebar, dan ketinggian. Jika bilangan parameter kurang daripada parameter, fungsi baru dikembalikan untuk mencari jumlah preset parameter yang diberikan. Sekarang katakan kita sedang mencari jumlah kotak dengan panjang tetap (mis. 10). Ini boleh dilakukan dengan mudah dengan mengambil 10 sebagai parameter pertama, atau kita boleh membuat fungsi separa dengan mengambil 10 sebagai parameter pertama dan kemudian meminta hanya nilai yang tinggal.
<?php $square = function ($arg) { return $arg * $arg; }; $value = $square(2); // 4 ?>
Currying adalah kes khas fungsi separa, di mana anda menukar fungsi yang menerima pelbagai parameter ke dalam pelbagai fungsi yang masing -masing menerima parameter tunggal. Sebagai contoh, sama dengan f (x, y, z) to f (x) (y) (z) (walaupun sintaks PHP tidak membenarkan panggilan bersarang panggilan seperti ini). Jika anda berminat untuk mempelajari lebih lanjut, Timothy Boronczyk telah menulis artikel yang sangat baik tentang kari dengan contoh sebenar.
Pro and Kekurangan
<?php function sum($array) { if (empty($array)) return 0; else return $array[0] + sum(array_slice($array, 1)); } $total = sum(array(1, 2, 3)); // 6 ?>
Slim memanggil fungsi panggil balik apabila URL yang diminta sepadan dengan laluan ini. Vance Lucas telah menulis beberapa artikel mengenai kes -kes penggunaan lain yang menarik dari fungsi Lambda sebelum ini. Galakkan pengaturcaraan yang selamat dengan mengelakkan data keadaan dan berubah -ubah. Dalam pengaturcaraan berfungsi, anda harus menulis fungsi yang hanya melakukan satu perkara dan tidak melakukan kesan sampingan masing -masing. Penekanan paradigma ini terhadap kesederhanaan modulariti dan fungsi dapat memudahkan untuk menyimpulkan program anda berdasarkan subrutin kecil yang berbeza. Pengaturcaraan fungsional juga boleh membantu anda menulis kod yang memberi tumpuan kepada apa yang anda ingin capai, dan bukannya secara eksplisit menguruskan peristiwa tidak sengaja dalam proses (bandingkan rekursi untuk menguruskan pembolehubah kaunter gelung). Tetapi ingat bahawa beberapa kelebihan yang secara tradisinya berkaitan dengan pengaturcaraan berfungsi tidak terpakai kepada PHP kerana ia tidak direka sebagai bahasa pengaturcaraan berfungsi. Sebagai contoh, fungsi tanpa kesan sampingan adalah sesuai untuk pemprosesan selari, tetapi skrip PHP tidak berjalan dengan cara ini. Ia juga tidak mudah untuk mengira kos fungsi rekursif dan malas, dan mungkin terdapat masalah prestasi yang serius disebabkan oleh overhead dalaman. Kadang -kadang, lebih masuk akal untuk menulis program dengan kebolehubahan untuk meningkatkan kecekapan. Mungkin kelemahan terbesar pengaturcaraan berfungsi adalah bahawa ia mempunyai lengkung pembelajaran yang sangat curam bagi mereka yang telah dilatih secara imperatif. Tetapi secara keseluruhan, pengaturcaraan berfungsi adalah menyeronokkan, dan belajar ia akan memberi anda alat baru untuk memikirkan masalah lama dan membantu anda berkembang sebagai pengaturcara. Ia bukan penyelesaian sejagat, tetapi boleh digunakan untuk kod PHP yang lebih bersih dan lebih elegan seperti yang diperlukan.
Ringkasan
Pengaturcaraan berfungsi bukan sekadar paradigma pengaturcaraan; Jika anda boleh melakukan pemikiran berfungsi, anda boleh memprogram secara fungsional dalam hampir mana -mana bahasa. Dalam artikel ini, kita membincangkan asas -asas pengaturcaraan berfungsi, menggunakan keupayaan PHP untuk menulis dan memberikan contoh -contohnya. Walaupun contoh -contoh yang diberikan dalam artikel ini mungkin tidak praktikal untuk anda, anda akan mendapati banyak situasi di mana gaya berfungsi dapat meningkatkan kualiti kod yang anda tulis dengan ketara. Cuba cari kes seperti ini, berfikir secara fungsional, dan bersenang -senang! gambar dari Fotolia
soalan yang sering ditanya mengenai pengaturcaraan fungsional php
Pengaturcaraan fungsional dan pengaturcaraan berorientasikan objek adalah dua paradigma yang berbeza yang digunakan dalam PHP. Perbezaan utama ialah bagaimana mereka menguruskan keadaan dan data. Dalam pengaturcaraan berfungsi, fungsi adalah warga kelas pertama dan tidak mempunyai konsep negara. Ini bermakna bahawa diberikan input yang sama, fungsi akan sentiasa menghasilkan output yang sama. Pengaturcaraan berorientasikan objek, sebaliknya, berputar di sekitar objek dan interaksi mereka yang mengekalkan keadaan dan berubah dari masa ke masa. Ini boleh menghasilkan output yang berbeza, walaupun input adalah sama.
Untuk memulakan pengaturcaraan berfungsi dengan PHP, anda perlu memahami konsep asas seperti fungsi tulen, invarians, dan fungsi pesanan yang lebih tinggi. Kemudian anda boleh mula menulis fungsi yang tidak mengubah keadaan dan tidak mempunyai kesan sampingan. PHP mempunyai fungsi terbina dalam yang menyokong pengaturcaraan berfungsi, seperti array_map
, array_filter
, dan array_reduce
. Anda juga boleh menggunakan perpustakaan seperti koleksi Laravel yang menyediakan pembalut yang lancar dan mudah untuk menggunakan array data.
Pengaturcaraan fungsional dalam PHP membolehkan anda menulis lebih bersih dan mudah dibaca kod. Ia boleh membantu anda mengelakkan masalah pengaturcaraan biasa seperti kesan sampingan dan perubahan keadaan, yang boleh menjadikan kod anda lebih mudah untuk diramalkan dan diuji. Pengaturcaraan fungsional juga membolehkan lebih banyak kod modular kerana fungsi dapat digabungkan dan digunakan semula dengan mudah.
Walaupun pengaturcaraan berfungsi mempunyai kelebihannya, ia juga mempunyai beberapa cabaran. PHP tidak pada asalnya direka untuk pengaturcaraan berfungsi, jadi beberapa fungsi mungkin tidak begitu kuat atau cekap sebagai bahasa yang direka untuk pengaturcaraan berfungsi. Di samping itu, pengaturcaraan berfungsi memerlukan cara berfikir yang berbeza, dan lengkung pembelajaran boleh menjadi curam bagi pemaju yang terbiasa dengan pengaturcaraan yang penting atau berorientasikan objek.
Ya, PHP adalah bahasa berbilang perenggan, yang bermaksud anda boleh mencampurkan gaya pengaturcaraan yang berbeza. Anda boleh menggunakan pengaturcaraan berorientasikan objek untuk bahagian aplikasi yang mendapat manfaat daripada keadaan dan tingkah laku, dan pengaturcaraan berfungsi untuk bahagian-bahagian aplikasi yang mendapat manfaat daripada fungsi tanpa kesan, tanpa kesan sampingan. Ini memberi anda fleksibiliti untuk memilih kaedah terbaik untuk setiap bahagian aplikasi.
Kesan pengaturcaraan berfungsi pada prestasi PHP mungkin berbeza -beza. Dalam sesetengah kes, pengaturcaraan berfungsi boleh menulis kod yang lebih cekap kerana ia mengelakkan perubahan keadaan dan kesan sampingan. Walau bagaimanapun, dalam kes lain, ia mungkin tidak cekap kerana ia biasanya melibatkan membuat objek baru dan bukannya mengubah objek yang sedia ada. Adalah penting untuk menganalisis dan menguji kod anda untuk memastikan ia memenuhi keperluan prestasi anda.
Terdapat banyak sumber yang tersedia untuk mempelajari pengaturcaraan berfungsi PHP. Beberapa titik permulaan yang baik termasuk manual PHP (yang mempunyai bahagian mengenai pengaturcaraan berfungsi) serta tutorial dan artikel dalam talian. Terdapat juga buku mengenai topik ini, seperti pengaturcaraan fungsional PHP oleh Gilles Crettenand.
Ya, anda boleh menggunakan pengaturcaraan berfungsi untuk pembangunan web dalam PHP. Pengaturcaraan fungsional boleh membantu anda menulis kod yang lebih bersih dan lebih modular, yang boleh memberi manfaat dalam persekitaran pembangunan web. Walau bagaimanapun, ingat bahawa PHP adalah bahasa pelbagai perenggan, jadi anda boleh menggunakan gaya pengaturcaraan lain, seperti pengaturcaraan berorientasikan objek juga.
Dalam pengaturcaraan berfungsi, pengendalian ralat biasanya dilakukan dengan menggunakan monad, struktur data yang dapat mewakili pengiraan dan bukan nilai. Dalam PHP, anda boleh menggunakan Monad untuk pengendalian ralat. Ini membolehkan anda menghubungkan operasi bersama -sama dan jika mana -mana operasi gagal, seluruh rantaian akan dilangkau.
Pengaturcaraan berfungsi boleh digunakan untuk aplikasi besar, tetapi ia bergantung kepada keperluan khusus aplikasi. Pengaturcaraan fungsional boleh menulis lebih bersih, kod modular, yang boleh memberi manfaat dalam persekitaran berskala besar. Walau bagaimanapun, ia juga tidak cekap dalam beberapa kes, jadi penting untuk mempertimbangkan perdagangan.
Atas ialah kandungan terperinci PHP Master | Pengaturcaraan Fungsian dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!