Indonesian (Bahasa Indonesia) translation by Dika Budiaji (you can also view the original English article)
Menghemat waktu, mengurangi nyeri pemeliharaan, menyederhanakan kode Anda, dan melakukan itu semua sementara merasa seperti seorang jenius freakin '! Dalam tutorial ini, Pelajari cara menggunakan variabel-variabel, lookup array dan sedikit pemrograman pintar untuk menyederhanakan penanganan Form besar-besaran.
Variabel-variabel, metode dan properti
Sebelum kita bisa terlalu dalam ke dalam menggunakan sebuah array lookup, penting untuk pertama-memahami konsep di balik variabel variabel.
Apa itu variabel-variabel?
Variabel-variabel
adalah istilah yang menggambarkan penggunaan variabel untuk mendeklarasikan variabel lain.
Dalam form yang paling sederhana, variabel variabel mungkin terlihat seperti:
$foo = 'A value!'; // Declare an initial value $bar = 'foo'; // Wait, what's happening? echo $$bar; // Holy crap! That output 'A value!'
Mengapa Anda harus peduli?
Ketika Anda melihat suatu bukti dari konsep seperti contoh sebelumnya, menggunakan variabel-variabel mungkin tampak sangat konyol dan overcomplicated. Namun, benar-benar ada alasan solid, praktis untuk menggunakannya dalam beberapa kasus.



Contoh-contoh praktis
Penggunaan variabel-variabel yang bertanggung jawab dapat secara drastis mengurangi jumlah kode yang perlu diulangi oleh, katakan, mengkonversi array asosiatif ke objek dengan nilai-nilai yang disanitasi.
Contoh tanpa variabel variabel
$comment = new stdClass(); // Create an object $comment->name = sanitize_value($array['name']); $comment->email = sanitize_values($array['email']); $comment->url = sanitize_values($array['url']); $comment->comment_text = sanitize_values($array['comment_text']);
Contoh dengan variabel-variabel
$comment = new stdClass(); // Create a new object foreach( $array as $key=>$val ) { $comment->$key = sanitize_values($val); }
Lihat seberapa sederhana itu? Dan Anda dapat membayangkan contoh tanpa variabel variabel akan terlihat seperti jika array memiliki sesuatu seperti nilai-nilai 50 atau 100.
Catatan: saya sadar bahwa Anda bisa juga menggunakan array_map() dan secara eksplisit dilemparkan array sebagai objek untuk mencapai hal yang sama. Itu bukanlah tujuannya. Kami sedang menggambarkan sebuah konsep, di sini. Bermain bersama.
Masalah dengan pengolahan Form
Membuat pengolahan Form itu mudah.
Sekarang bahwa Anda tahu bagaimana menggunakan variabel-variabel, kita dapat beralih ke daging dan kentang untuk artikel ini, yang merupakan ide yang menggabungkan lookup array file controller atau switch statement dapat menghemat banyak perawatan tambahan , mengulangi kode, dan sakit kepala secara umum.
Untuk menggambarkan konsep kami, kami akan menggunakan ide pengolahan form. Ini adalah aspek yang penting dari pemrograman web, dan juga dapat menjadi salah satu daerah yang paling membosankan dari setiap proyek.
Namun, setelah ulang coding kebiasaan Anda, Anda berpotensi dapat membuat form pengolahan menjadi mudah.
Sering, baik file individu dibuat untuk setiap form diproses, atau switch statement digunakan. Dalam bagian ini, kita akan membahas bagaimana kedua solusi mungkin dilaksanakan, dan kemudian kita akan meneliti solusi menggunakan variabel-variabel, dan bagaimana ini dapat meningkatkan proyek Anda.
A contoh dengan beberapa form pengolahan file yang bekerja
Metode yang sering digunakan untuk penanganan pengiriman form adalah untuk membuat sebuah file baru untuk menangani setiap form data secara terpisah.
Ambil, misalnya, tiga form yang memperbarui account pengguna dengan nama baru, email baru, atau keduanya:
<form action="assets/inc/ex1-form1.php" method="post" id="ex1-form1"> <div> <h4>Form 1</h4> <label>Name <input type="text" name="name" class="input-text" /> </label> <input type="submit" class="input-submit" value="Submit" /> <input type="hidden" name="token" value="secret token goes here" /> </div> </form> <form action="assets/inc/ex1-form2.php" method="post" id="ex1-form2"> <div> <h4>Form 2</h4> <label>Email <input type="text" name="email" class="input-text" /> </label> <input type="submit" class="input-submit" value="Submit" /> <input type="hidden" name="token" value="secret token goes here" /> </div> </form> <form action="assets/inc/ex1-form3.php" method="post" id="ex1-form3"> <div> <h4>Form 3</h4> <label>Name <input type="text" name="name" class="input-text" /> </label> <label>Email <input type="text" name="email" class="input-text" /> </label> <input type="submit" class="input-submit" value="Submit" /> <input type="hidden" name="token" value="secret token goes here" /> </div> </form>
Masing-masing poin form ke file pengolahan yang berbeda. Jadi apa masing-masing file ini terlihat seperti apa?
Pengolahan form 1 (assets/inc/ex1-form1.php)
<?php // Turn on error reporting so we can see if anything is going wrong error_reporting(E_ALL); ini_set('display_errors', 1); // Make sure our faux-token was supplied if( isset($_POST['token']) && $_POST['token']==='secret token goes here' ) { // Require the necessary class require_once 'class.copterlabs_account.inc.php'; // Create a new instance of the class $account_obj = new CopterLabs_Account(); // Handle the form submission $output = $account_obj->save_name(); // For this example, just output some data about the form submission echo "<pre>Processing File: ", $_SERVER['PHP_SELF'], "\n\n<strong>Method Output:</strong>\n", $output, "</pre>\n", '<p><a href="../../">Go back</a></p>'; } else { die( 'Invalid form submission' ); }
Pengolahan form 2 (assets/inc/ex1-form2.php)
<?php // Turn on error reporting so we can see if anything is going wrong error_reporting(E_ALL); ini_set('display_errors', 1); // Make sure our faux-token was supplied if( isset($_POST['token']) && $_POST['token']==='secret token goes here' ) { // Require the necessary class require_once 'class.copterlabs_account.inc.php'; // Create a new instance of the class $account_obj = new CopterLabs_Account(); // Handle the form submission $output = $account_obj->save_email(); // For this example, just output some data about the form submission echo "<pre>Processing File: ", $_SERVER['PHP_SELF'], "\n\n<strong>Method Output:</strong>\n", $output, "</pre>\n", '<p><a href="../../">Go back</a></p>'; } else { die( 'Invalid form submission' ); }
Pengolahan form 3 (assets/inc/ex1-form3.php)
<?php // Turn on error reporting so we can see if anything is going wrong error_reporting(E_ALL); ini_set('display_errors', 1); // Make sure our faux-token was supplied if( isset($_POST['token']) && $_POST['token']==='secret token goes here' ) { // Require the necessary class require_once 'class.copterlabs_account.inc.php'; // Create a new instance of the class $account_obj = new CopterLabs_Account(); // Handle the form submission $output = $account_obj->save_both(); // For this example, just output some data about the form submission echo "<pre>Processing File: ", $_SERVER['PHP_SELF'], "\n\n<strong>Method Output:</strong>\n", $output, "</pre>\n", '<p><a href="../../">Go back</a></p>'; } else { die( 'Invalid form submission' ); }
Seperti Anda dapat dengan jelas melihat, file contoh di atas adalah duplikasi ton kode. Memperluas ini 15 bentuk di situs, dan Anda akan segera menemukan bahwa pemeliharaan bisa menjadi mimpi buruk.
Class Account
Seperti yang Anda lihat, pemrosesan file membuat instance kelas CopterLabs_Account. Ini akan menjadi class yang sangat sederhana yang menampilkan informasi tentang pengiriman form.
Berikut adalah kode untuk class (assets/inc/class.coperlabs_account.inc.php):
<?php /** * A simple class to test form submissions * * PHP version 5 * * LICENSE: Dual licensed under the MIT or GPL licenses. * * @author Jason Lengstorf <[email protected]> * @copyright 2011 Copter Labs * @license https://www.opensource.org/licenses/mit-license.html * @license http://www.gnu.org/licenses/gpl-3.0.txt */ class CopterLabs_Account { public $name = NULL, $email = NULL; public function save_name() { $this->name = htmlentities($_POST['name'], ENT_QUOTES); return "Method: " . __METHOD__ . "\nName: " . $this->name . "\n"; } public function save_email() { $this->email = htmlentities($_POST['email'], ENT_QUOTES); return "Method: " . __METHOD__ . "\nEmail: " . $this->email . "\n"; } public function save_both() { $this->name = htmlentities($_POST['name'], ENT_QUOTES); $this->email = htmlentities($_POST['email'], ENT_QUOTES); return "Method: " . __METHOD__ . "\nName: " . $this->name . "\nEmail: " . $this->email . "\n"; } }
Anda dapat mencoba kode ini pada contoh 1 pada halaman demo.
A contoh yang bekerja dengan File pemrosesan tunggal dan Switch statement
Solusi populer laiinya untuk pengolahan form adalah untuk mengkonsolidasikan semua pemrosesan skrip ke dalam satu file dan menentukan apa yang harus dilakukan dengan data menggunakan switch statement.
pendekatan switch biasanya mempekerjakan trik di mana masukan yang tersembunyi ditambahkan ke form yang mengandung aksi untuk diambil pada saat pengajuan. Ini
tindakan ini kemudian digunakan untuk menentukan apa yang harus dilakukan dengan form.
Berikut adalah tiga bentuk form, dari atas, dengan aksi yang ditambahkan, semuanya menunjuk ke file pemrosesan tunggal:
<form action="assets/inc/ex2-switch.php" method="post" id="ex2-form1"> <div> <h4>Form 1</h4> <label>Name <input type="text" name="name" class="input-text" /> </label> <input type="submit" class="input-submit" value="Submit" /> <input type="hidden" name="action" value="update-name" /> <input type="hidden" name="token" value="secret token goes here" /> </div> </form> <form action="assets/inc/ex2-switch.php" method="post" id="ex2-form2"> <div> <h4>Form 2</h4> <label>Email <input type="text" name="email" class="input-text" /> </label> <input type="submit" class="input-submit" value="Submit" /> <input type="hidden" name="action" value="update-email" /> <input type="hidden" name="token" value="secret token goes here" /> </div> </form> <form action="assets/inc/ex2-switch.php" method="post" id="ex2-form3"> <div> <h4>Form 3</h4> <label>Name <input type="text" name="name" class="input-text" /> </label> <label>Email <input type="text" name="email" class="input-text" /> </label> <input type="submit" class="input-submit" value="Submit" /> <input type="hidden" name="action" value="update-both" /> <input type="hidden" name="token" value="secret token goes here" /> </div> </form>
Dan file pengolahan baru seperti: (assets/inc/ex2-switch.php)
<?php // Turn on error reporting so we can see if anything is going wrong error_reporting(E_ALL); ini_set('display_errors', 1); // Make sure our faux-token was supplied if( isset($_POST['token']) && $_POST['token']==='secret token goes here' ) { // Require the necessary class require_once 'class.copterlabs_account.inc.php'; // Create a new instance of the class $account_obj = new CopterLabs_Account(); // Sanitize the action $action = htmlentities($_POST['action'], ENT_QUOTES); // Use the new 'action' hidden input to determine what action to call switch( $action ) { // Form 1 handling case 'update-name': $output = $account_obj->save_name(); break; // Form 2 handling case 'update-email': $output = $account_obj->save_email(); break; // Form 3 handling case 'update-both': $output = $account_obj->save_both(); break; // If no valid action is found, something isn't right default: die( 'Unsupported action.' ); } // For this example, just output some data about the form submission echo "<pre>Processing File: ", $_SERVER['PHP_SELF'], "\nAction: ", htmlentities($_POST['action'], ENT_QUOTES), "\n\n<strong>Method Output:</strong>\n", $output, "</pre>\n", '<p><a href="../../#ex2">Go back to example 2</a></p>'; } else { die( 'Invalid form submission' ); }
Anda dapat melihat ini beraksi dengan mengunjungi contoh 2 di halaman demo. Ini adalah sebuah tanda perbaikan atas menggunakan berbagai form, tetapi Anda dapat melihat bahwa kita masih sedang menggandakan beberapa kode.
Selain itu, itu adalah pilihan pribadi saya untuk menghindari switch statement Kapan saja aku bisa. Ini adalah karena fakta bahwa beralih menggunakan longgar perbandingan ('string' akan memicu kasus 0 karena string mengevaluasi ke 0 jika Anda mengubahnya ke integer) dan sangat mudah untuk mengubah ke kode spaghetti.
Memperbaiki masalah: Lookup array dan variabel-variabel
Seperti yang kita lihat sejauh ini, kedua solusi di atas memiliki kelemahan mereka, dan memerlukan duplikasi kode. Bayangkan jika ada selusin atau lebih form di situs — tidak cantik.
Untuk mengatasi masalah ini, kita dapat menggunakan konsep yang disebut sebuah array lookup, yang memetakan tindakan yang dimasukan dari form untuk metode yang disebut pada objek.
Ya, Anda bisa menetapkan action sebagai nama metode, tetapi yang memungkinkan pengiriman form palsu untuk memanggil metode public. Membuat array key-value pair adalah langkah kecil untuk menambahkan sedikit lebih banyak kontrol tanpa banyak pekerjaan tambahan.
A contoh yang bekerja dengan File pemrosesan tunggal dan Lookup Array
Menggunakan pengetahuan kita tentang variabel variabel dari awal tutorial ini, mari kita mengubah demo kami untuk menggunakan sebuah array lookup.
Memodifikasi tiga form untuk menunjuk ke file controller baru:
<form action="assets/inc/ex3-lookup-array.php" method="post" id="ex3-form1"> <div> <h4>Form 1</h4> <label>Name <input type="text" name="name" class="input-text" /> </label> <input type="submit" class="input-submit" value="Submit" /> <input type="hidden" name="action" value="update-name" /> <input type="hidden" name="token" value="secret token goes here" /> </div> </form> <form action="assets/inc/ex3-lookup-array.php" method="post" id="ex3-form2"> <div> <h4>Form 2</h4> <label>Email <input type="text" name="email" class="input-text" /> </label> <input type="submit" class="input-submit" value="Submit" /> <input type="hidden" name="action" value="update-email" /> <input type="hidden" name="token" value="secret token goes here" /> </div> </form> <form action="assets/inc/ex3-lookup-array.php" method="post" id="ex3-form3"> <div> <h4>Form 3</h4> <label>Name <input type="text" name="name" class="input-text" /> </label> <label>Email <input type="text" name="email" class="input-text" /> </label> <input type="submit" class="input-submit" value="Submit" /> <input type="hidden" name="action" value="update-both" /> <input type="hidden" name="token" value="secret token goes here" /> </div> </form>
Selanjutnya, mengumpulkan file pengolahan yang akan menangani pengiriman form (assets/inc/ex3-lookup-array.php):
<?php // Turn on error reporting so we can see if anything is going wrong error_reporting(E_ALL); ini_set('display_errors', 1); // Make sure our faux-token was supplied if( isset($_POST['token']) && $_POST['token']==='secret token goes here' ) { // Require the necessary class require_once 'class.copterlabs_account.inc.php'; // Create a new instance of the class $account_obj = new CopterLabs_Account(); // Sanitize the action $action = htmlentities($_POST['action'], ENT_QUOTES); // Set up a lookup array to match actions to method names $lookup_array = array( 'update-name' => 'save_name', 'update-email' => 'save_email', 'update-both' => 'save_both' ); // Make sure the array key exists if( array_key_exists($action, $lookup_array) ) { // Using variable variables, call the proper method and store the output $output = $account_obj->$lookup_array[$action](); } else { die( 'Unsupported action.' ); } // For this example, just output some data about the form submission echo "<pre>Processing File: ", $_SERVER['PHP_SELF'], "\nAction: ", htmlentities($_POST['action'], ENT_QUOTES), "\n\n<strong>Method Output:</strong>\n", $output, "</pre>\n", '<p><a href="../../#ex3">Go back to example 3</a></p>'; } else { die( 'Invalid form submission' ); }
Periksa ini pada halaman demo oleh mencoba form pada contoh 3.
Karena kami menetapkan action sebagai key dalam array, kita menggunakan array_key_exists() untuk memastikan bahwa tindakan valid. Kemudian, kami menggunakan nilai yang sesuai dengan action sebagai nama metode. Perhatikan bahwa kita menambahkan kurung setelah nilai untuk memastikan dijalankan sebagai metode.
Penambahan lookup array terus kode ringkas, sederhana, dan jelas (setelah Anda mendapatkan menggantung dari variabel-variabel).
Ringkasan
Digunakan secara bertanggung jawab, lookup array dapat membuat script Anda jauh lebih mudah untuk memperbarui dan memelihara ketika Anda menggabungkan mereka dengan variabel-variabel.
Bagaimana Anda berpikir Anda dapat mengintegrasikan lookup array dan variabel-variabel ke dalam proyek-proyek Anda untuk membuat maintenance lebih mudah? Beritahu saya di komentar!
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weekly