PHP MySQL Untuk Pemula Sampai Profesional

480
Konfigurasi PHP Meskipun dasar instalasi PHP cukup bagi sebagian besar pengguna awal, kemungkinan besar Anda ingin membuat penyesuaian ke pengaturan konfigurasi default dan mungkin bereksperimen dengan beberapa ekstensi pihak ketiga yang tidak dibangun ke dalam distribusi secara default. Pada bagian ini Anda akan mempelajari semua tentang bagaimana untuk men-tweak tingkah laku PHP dan fitur untuk kebutuhan spesifik Anda. Menyesuaikan Buat Windows Sebanyak 45 ekstensi digabungkan dengan PHP 5.1, dan 5.2 beberapa yang dikupas untuk 35 ekstensi dengan versi alpha saat ini PHP 6. Namun, untuk sesungguhnya menggunakan ekstensi ini, anda perlu menghapus tanda komentar pada baris yang sesuai di dalam file php.ini. Misalnya, jika Anda ingin mengaktifkan ekstensi XML-RPC PHP, Anda perlu membuat sedikit penyesuaian beberapa file php.ini Anda: 1. Buka file php.ini dan cari direktif extension_dir dan menetapkan C: \ php \ ext \. Jika Anda menginstal PHP dalam direktori lain, memodifikasi path ini yang sesuai. 2. Cari baris; extension = php_xmlrpc.dll. Tanda komentar baris ini dengan menghapus titik koma sebelumnya. Simpan dan tutup file tersebut. 3. Restart server Web dan ekstensi siap untuk digunakan dari dalam PHP. Perlu diketahui bahwa beberapa ekstensi memiliki perintah konfigurasi tambahan yang mungkin ditemukan kemudian dalam file php.ini. Ketika mengaktifkan ekstensi ini, Anda terkadang mungkin perlu menginstal perangkat lunak lain. Lihat dokumentasi PHP untuk informasi lebih lanjut tentang tiap ekstensi yang bersangkutan.

description

PHP,MySQL, Newbie,Pemula,Advance PHP MySQL

Transcript of PHP MySQL Untuk Pemula Sampai Profesional

Konfigurasi PHP

Meskipun dasar instalasi PHP cukup bagi sebagian besar pengguna awal, kemungkinan besar Anda ingin membuat penyesuaian ke pengaturan konfigurasi default dan mungkin bereksperimen dengan beberapa ekstensi pihak ketiga yang tidak dibangun ke dalam distribusi secara default. Pada bagian ini Anda akan mempelajari semua tentang bagaimana untuk men-tweak tingkah laku PHP dan fitur untuk kebutuhan spesifik Anda.

Menyesuaikan Buat Windows

Sebanyak 45 ekstensi digabungkan dengan PHP 5.1, dan 5.2 beberapa yang dikupas untuk 35 ekstensi dengan versi alpha saat ini PHP 6. Namun, untuk sesungguhnya menggunakan ekstensi ini, anda perlu menghapus tanda komentar pada baris yang sesuai di dalam file php.ini. Misalnya, jika Anda ingin mengaktifkan ekstensi XML-RPC PHP, Anda perlu membuat sedikit penyesuaian beberapa file php.ini Anda:

1. Buka file php.ini dan cari direktif extension_dir dan menetapkan C: \ php \ ext \. Jika Anda menginstal PHP dalam direktori lain, memodifikasi path ini yang sesuai.

2. Cari baris; extension = php_xmlrpc.dll. Tanda komentar baris ini dengan menghapus titik koma sebelumnya. Simpan dan tutup file tersebut.

3. Restart server Web dan ekstensi siap untuk digunakan dari dalam PHP. Perlu diketahui bahwa beberapa ekstensi memiliki perintah konfigurasi tambahan yang mungkin ditemukan kemudian dalam file php.ini.

Ketika mengaktifkan ekstensi ini, Anda terkadang mungkin perlu menginstal perangkat lunak lain. Lihat dokumentasi PHP untuk informasi lebih lanjut tentang tiap ekstensi yang bersangkutan.

Konfigurasi Menjalankan-Waktu

Ini mungkin untuk mengubah perilaku PHP pada waktu berjalan di kedua Windows dan Linux melalui file php.ini. File ini berisi banyak sekali perintah konfigurasi yang secara kolektif mengontrol perilaku setiap produk. Bagian selanjutnya dari bab ini berfokus pada PHP yang paling umum digunakan direktif konfigurasi, memperkenalkan tujuan, ruang lingkup, dan nilai default masing-masing.

Mengelola Directives Konfigurasi PHP

Sebelum Anda mempelajari ke dalam spesifik tiap direktif, bagian ini menunjukkan berbagai cara di mana direktif tersebut dapat dimanipulasi, termasuk melalui file php.ini, httpd.conf Apache dan file htaccess,. dan langsung melalui script PHP.

File php.ini

Distribusi PHP dilengkapi dengan dua konfigurasi template, php.ini-dist dan php.ini yang disarankan. Anda akan ingin mengubah nama salah satu file untuk php.ini dan menempatkannya di tempat yang ditentukan oleh direktif PHPIniDir ditemukan di file httpd.conf Apache. Ini menyarankan bahwa Anda menggunakan yang terakhir karena banyak parameter yang ditemukan di dalamnya sudah ditugaskan pengaturan yang kami anjurkan mereka. Mengambil Saran ini mungkin akan menghemat banyak waktu awal dan upaya mengamankan dan tweaking instalasi anda karena ada lebih dari 200 parameter konfigurasi yang berbeda dalam file ini. Walaupun nilai-nilai default pergi jauh ke arah membantu Anda dengan cepat menempatkan PHP, Anda mungkin ingin membuat penyesuaian tambahan untuk perilaku PHP, jadi Anda harus belajar sedikit lebih banyak tentang php.ini dan banyaknya parameter konfigurasi. Bagian yang akan datang "Directives Konfigurasi PHP" menyajikan pengenalan yang komprehensif untuk

banyak dari parameter, menjelaskan tujuan, lingkup, dan jangkauan masing-masing.

File php.ini adalah file konfigurasi PHP secara global, seperti httpd.conf untuk Apache. File ini membahas 12 aspek yang berbeda dari perilaku PHP:

• Language Options

•Safe Mode

•Syntax Highlighting

•Miscellaneous

• Resource Limits

• Error Handling and Logging

•Data Handling

• Paths and Directories

•File Uploads

•Fopen Wrappers

• Dynamic Extensions

•Module Settings

Bagian "Instruksi Konfigurasi PHP " berikut ini akan memperkenalkan banyak Instruksi yang ditemukan dalam file php.ini. Kemudian bab akan memperkenalkan modul-direktif tertentu sebagaimana mestinya.

Sebelum Anda diperkenalkan dengan mereka, bagaimanapun, luangkan waktu untuk meninjau file php.ini karakteristik sintaks umumnya. File php.ini adalah file teks sederhana, terdiri hanya dari komentar dan arahan dan nilai-nilai yang berhubungan. Berikut contoh potongan dari file:

;

; Allow the <? tag

;

short_open_tag = Off

Baris yang dimulai dengan titik koma adalah komentar, sedangkan parameter short_open_tag ditetapkan dengan nilai Off.

■ Tip Setelah Anda merasa nyaman dengan tujuan parameter konfigurasi, pertimbangkan menghapus komentar untuk menyederhanakan isi file, sehingga nantinya mengurangi waktu mengedit.

Tepat ketika perubahan diterapkan tergantung pada bagaimana Anda menginstal PHP. Jika PHP diinstal sebagai binary CGI, file php.ini membaca ulang setiap kali PHP dipanggil, sehingga membuat perubahan seketika. Jika PHP diinstal sebagai modul Apache, php.ini hanya dibaca dalam sekali, ketika daemon Apache pertama dimulai. Oleh karena itu, jika PHP yang terinstal dalam mode terakhir, Anda harus me-restart Apache sebelum perubahan mengambil Pengaruh.

Apache File httpd.conf dan. htaccess

Jika PHP berjalan sebagai modul Apache, Anda dapat memodifikasi banyak direktif baik melalui file httpd.conf atau file. htaccess. Hal ini dicapai dengan Meletakkan direktif / penugasan nilai dengan salah satu kata kunci berikut:

• php_value: Mengatur nilai dari direktif yang ditentukan.

• php_flag: Mengatur nilai Boolean yang ditentukan direktif.

• php_admin_value: Mengatur nilai dari direktif yang ditentukan. Ini berbeda dari php_value bahwa tidak dapat digunakan dalam sebuah file .htaccess dan tidak dapat diganti dalam virtual host atau. htaccess.

• php_admin_flag: Mengatur nilai dari direktif yang ditentukan. Ini berbeda dari php_value bahwa tidak dapat digunakan dalam sebuah file .htaccess dan tidak dapat diganti dalam virtual host atau. htaccess.

Misalnya, dengan menonaktifkan tag direktif pendek dan mencegah orang lain dari menolak itu, menambahkan baris berikut ke file httpd.conf anda:

php_admin_flag short_open_tag Off

Dalam Script Mengeksekusi

Yang ketiga, dan paling dilokalisasi, berarti untuk memanipulasi variabel konfigurasi PHP adalah melalui fungsi ini_set (). Misalnya, Anda ingin memodifikasi PHP waktu eksekusi maksimum untuk script yang diberikan. Hanya menanamkan perintah berikut ke bagian atas script:

ini_set("max_execution_time","60");

Directive konfigurasi Ruang Lingkup

Dapatkah perintah konfigurasi dimodifikasi di mana saja? Jawabannya adalah tidak, karena berbagai alasan, terutama keamanan yang terkait. Setiap direktif diberikan ruang lingkup, dan direktif yang dapat diubah hanya dalam lingkup tersebut. Secara keseluruhan ada empat cakupan:

• PHP_INI_PERDIR: Directive dapat dimodifikasi dalam httpd.conf, php.ini, atau file htaccess.

• PHP_INI_SYSTEM: Directive dapat dimodifikasi di dalam file php.ini dan httpd.conf

• PHP_INI_USER: Directive dapat dimodifikasi dalam skrip pengguna

• PHP_INI_ALL: Directive dapat dimodifikasi di mana saja

Instruksi Konfigurasi PHP

Bagian berikut memperkenalkan banyak perintah konfigurasi inti PHP. Selain definisi umumnya, setiap bagian meliputi konfigurasi arahan ruang lingkup dan nilai default. Karena Anda mungkin akan menghabiskan sebagian besar waktu Anda bekerja dengan variabel ini dari dalam file php.ini, arahan diperkenalkan seperti yang ditampilkan dalam file ini.

Catatan bahwa direktif diperkenalkan dalam bagian ini sebagian besar relevan semata-mata untuk perilaku umum PHP, direktif berhubungan dengan ekstensi, atau topik di mana banyak perhatian diberikan nantinya dalam buku ini, tidak diperkenalkan di bagian ini tetapi diperkenalkan dalam bab yang sesuai.

Pilihan Bahasa

Direktif yang terletak di bagian ini menentukan beberapa bahasa perilaku yang paling dasar. Anda pasti ingin mengambil beberapa saat untuk menjadi berkenalan dengan berbagai kemungkinan konfigurasi.

engine = On | Off

Scope: PHP_INI_ALL; Default value: On

Parameter ini bertanggung jawab untuk menentukan apakah mesin PHP tersedia. Mematikannya mencegah Anda menggunakan PHP sama sekali. Tentunya, Anda harus meninggalkan ini diaktifkan jika Anda berencana untuk menggunakan PHP.

zend.ze1_compatibility_mode = On | Off

Scope: PHP_INI_ALL; Default value: Off

Beberapa tiga tahun setelah PHP 5.0 dirilis, PHP 4.x masih digunakan secara luas. Salah satu alasan untuk upgrade siklus berkepanjangan ini disebabkan oleh beberapa ketidaksesuaian berorientasi objek yang signifikan antara PHP 4 dan 5. Direktif zend.ze1_compatibility_mode berupaya untuk mengembalikan beberapa

perubahan di PHP 5, meningkatkan kemungkinan bahwa aplikasi PHP 4 dapat terus berjalan tanpa perubahan pada versi 5.

■ Catatan Direktif zend.ze1_compatibility_mode tidak pernah dikerjakan sebagaimana dimaksud dan telah dihapus di PHP 6.

short_open_tag = On | Off

Scope: PHP_INI_ALL; Default value: On

Komponen script PHP ditutupi di dalam sintaks meloloskan diri. Ada empat format lepas yang berbeda, terpendek yang dikenal sebagai tag terbuka pendek, yang terlihat seperti ini:

<?

echo "Some PHP statement";

?>

Anda mungkin menyadari bahwa sintaks ini digunakan bersama dengan XML, yang dapat menyebabkan masalah di lingkungan tertentu. Dengan demikian, sarana untuk menonaktifkan ini dengan format tertentu yang telah disediakan. Ketika short_open_tag diaktifkan (On), tag pendek diperbolehkan; bila dinonaktifkan (Off), mereka tidak.

asp_tags = On | Off

Scope: PHP_INI_ALL; Default value: Off

PHP mendukung pembatas script ASP-style, yang terlihat seperti ini:

<%

echo "Some PHP statement";

%>

Jika Anda datang dari latar belakang ASP dan lebih memilih untuk terus menggunakan sintaks pembatas ini, Anda dapat melakukannya dengan mengaktifkan tag ini.

■ Catatan tag ASP-style tidak lagi tersedia dalam PHP 6.

precision = integer

Scope: PHP_INI_ALL; Default value: 12

PHP mendukung berbagai macam tipe data, meliputi bilangan floating-point. Parameter presisi menentukan jumlah digit yang signifikan ditampilkan dalam representasi bilangan floating-point. Catatan bahwa nilai ini disetel untuk 14 digit pada sistem Win32 dan untuk 12 digit di Linux.

y2k_compliance = On | Off

Scope: PHP_INI_ALL; Default value: Off

Siapa yang bisa melupakan ketakutan Y2K hanya beberapa tahun yang lalu? Manusia super upaya yang telah dilakukan untuk menghilangkan masalah yang ditimbulkan oleh perangkat lunak non-Y2K-compliant, dan walaupun itu sangat tidak mungkin, beberapa pengguna mungkin menggunakan liar kedaluwarsa, browser tidak patuh. Jika untuk beberapa alasan aneh Anda yakin bahwa sejumlah pengguna situs Anda jatuh ke dalam kelompok ini, kemudian menonaktifkan parameter y2k_compliance, jika tidak, itu harus diaktifkan.

output_buffering = On | Off | integer

Scope: PHP_INI_SYSTEM; Default value: Off

Siapa saja bahkan dengan pengalaman PHP minimal mungkin cukup akrab dengan dua pesan berikut:

Pesan ini terjadi ketika script mencoba untuk mengubah header setelah sudah dikirimkan kembali ke pengguna meminta. Paling umum mereka adalah hasil dari programmer mencoba mengirim cookie ke pengguna setelah beberapa output telah dikirimkan kembali ke browser, yang tidak mungkin untuk mencapai karena header (tidak terlihat oleh user, tetapi digunakan oleh browser) akan selalu mendahului output itu. PHP versi 4.0 menawarkan solusi untuk masalah ini yang mengganggu dengan memperkenalkan konsep buffering output. Bila diaktifkan, output buffering memberitahu PHP dapat mengirim output sekaligus, setelah script telah selesai. Dengan cara ini, setiap perubahan yang terjadi setelah header dapat dibuat di seluruh script karena belum dikirim. Mengaktifkan direktif output_buffering ternyata pada output buffering. Atau, Anda dapat membatasi ukuran output buffer (sehingga tersirat memungkinkan buffering output) dengan menetapkan ke maksimum jumlah byte yang Anda ingin buffer ini berisi.

Jika anda tidak berencana untuk menggunakan buffering output, Anda harus menonaktifkan direktif ini karena akan menghambat kinerja yang sedikit. Tentu saja, solusi termudah untuk masalah header hanya dengan melewatkan informasi sebelum konten lainnya jika dimungkinkan.

output_handler = string

Scope: PHP_INI_ALL; Default value: NULL

Direktif ini menarik memberitahu PHP dengan melewati semua output melalui fungsi sebelum kembali ke pengguna yang meminta. Misalnya, Anda ingin

mengkompres output semua sebelum kembali ke browser, fitur yang didukung oleh semua browser utama HTTP/1.1-compliant. Anda dapat menetapkan output_handler seperti:

output_handler = "ob_gzhandler"

ob_gzhandler () adalah fungsi kompresi-penanganan PHP, yang terletak di perpustakaan kontrol output PHP. Perlu diingat bahwa Anda tidak dapat secara bersamaan mengatur output_handler dengan ob_gzhandler () dan memungkinkan zlib.output_compression (dibahas berikutnya).

zlib.output_compression = On | Off | integer

Scope: PHP_INI_SYSTEM; Default value: Off

Mengompresi output sebelum dikembalikan ke browser dapat menghemat bandwidth dan waktu. Fitur HTTP/1.1 didukung oleh browser paling modern dan dapat dengan aman digunakan dalam sebagian besar aplikasi. Anda dapat mengaktifkan secara otomatis output kompresi dengan menetapkan zlib.output_compression dengan On. Selain itu, Anda secara bersamaan dapat mengaktifkan kompresi output dan mengatur ukuran buffer kompresi (dalam byte) dengan menempatkan zlib.output_compression sebuah nilai integer.

zlib.output_handler = string

Scope: PHP_INI_SYSTEM; Default value: NULL

zlib.output_handler menetapkan sebuah perpustakaan kompresi tertentu jika perpustakaan zlib tidak tersedia.

implicit_flush = On | Off

Scope: PHP_INI_SYSTEM; Default value: Off

Mengaktifkan hasil implicit_flush secara otomatis membersihkan, atau pembilasan, buffer output dari kontennya sesudah setiap panggilan untuk print () atau echo (), dan menyelesaikan tiap yang tertanam blok HTML. Ini mungkin berguna dalam contoh di mana server memerlukan suatu periode yang luar biasa panjang saatnya untuk mengkompilasi hasil atau melakukan perhitungan tertentu. Dalam kasus tersebut, Anda dapat menggunakan fitur ini untuk output update status ke pengguna bukan hanya menunggu sampai server menuntaskan prosedur.

unserialize_callback_func = string

Scope: PHP_INI_ALL; Default value: NULL

Direktif ini memungkinkan Anda untuk mengontrol respon unserializer ketika permintaan dibuat untuk menginisiasi kelas tidak terdefinisi. Untuk kebanyakan pengguna, direktif ini tidak relevan karena PHP sudah output peringatan dalam kasus tersebut jika melaporkan kesalahan PHP disetel untuk tingkat yang sesuai.

serialize_precision = integer

Scope: PHP_INI_ALL; Default value: 100

Direktif serialize_precision menentukan jumlah digit yang disimpan setelah floating point ketika double dan floats yang serial. Pengaturan ini untuk sebuah nilai yang sesuai memastikan bahwa presisi tidak berpotensi hilang ketika nomor tersebut nantinya unserialized.

allow_call_time_pass_reference = On | Off

Scope: PHP_INI_SYSTEM; Default value: On

Fungsi argumen dapat dikirimkan dalam dua cara: dengan nilai dan dengan referensi. Persis bagaimana setiap argumen dilewatkan untuk suatu fungsi pada saat fungsi memanggil dapat ditentukan dalam definisi fungsi, yaitu cara dianjurkan untuk melakukannya. Namun, Anda bisa memaksa semua argumen yang akan dilalui dengan acuan pada saat fungsi panggilan dengan mengaktifkan allow_call_time_pass_reference.

Pembahasan fungsi PHP pada Bab 4 membahas bagaimana argumen fungsional dapat dilalui baik dengan nilai dan dengan referensi, dan implikasi dari melakukannya.

Safe Mode

Ketika anda menempatkan PHP dalam lingkungan multiuser, seperti yang ditemukan di server ISP-share, Anda mungkin ingin membatasi fungsionalitas. Seperti yang mungkin Anda bayangkan, menawarkan semua pengguna memerintah penuh atas semua fungsi PHP bisa membuka kemungkinan untuk mengeksploitasi atau merusak sumber daya server dan file. Sebagai perlindungan untuk menggunakan PHP pada shared server, PHP dapat dijalankan dalam terbatas, atau mode aman,.

Mengaktifkan safe mode akan menonaktifkan cukup banyak beberapa fungsi dan berbagai fitur dianggap berpotensi tidak aman dan dengan demikian mungkin merusak jika mereka menyalahgunakan dalam script lokal. Sebuah contoh kecil dari fungsi ini dinonaktifkan dan fitur meliputi parse_ini_file (), chmod (), chown (), chgrp (), exec (), operator sistem (), dan operator backtick. Mengaktifkan safe mode juga memastikan bahwa pemilik script yang sedang dijalankan sesuai dengan pemilik dari setiap berkas atau direktori yang ditargetkan dengan script itu. Namun, pembatasan ini terakhir khususnya dapat

memiliki yang tak terduga dan efek tidak nyaman karena file seringkali dapat diupload dan sebaliknya yang dihasilkan oleh ID pengguna lainnya.

Selain itu, mengaktifkan safe mode membuka kemungkinan untuk mengaktifkan beberapa pembatasan lain melalui konfigurasi direktif PHP lainnya, masing-masing yaitu diperkenalkan pada bagian ini.

■ Catatan Karena sebagian part dapat membingungkan yang disebabkan dengan nama dan pendekatan fitur tertentu, ditambah dengan membawa konsekuensi yang tidak diinginkan karena beberapa user ID berperan pada menciptakan dan memiliki berbagai file, fitur safe mode PHP telah dihapus dari PHP 6.

safe_mode = On | Off

Scope: PHP_INI_SYSTEM; Default value: Off

Mengaktifkan direktif safe_mode hasil pada PHP yang dijalankan di bawah kendala tersebut.

safe_mode_gid = On | Off

Scope: PHP_INI_SYSTEM; Default value: Off

Saat safe mode diaktifkan, sebuah safe_mode_gid diaktifkan memberlakukan sebuah GID (grup ID) memeriksa ketika membuka file. Ketika safe_mode_gid dinonaktifkan, sebuah UID lebih terbatas (ID pengguna) memeriksa diberlakukan.

safe_mode_include_dir = string

Scope: PHP_INI_SYSTEM; Default value: NULL

Safe_mode_include_dir ini menyediakan tempat yang aman dari diberlakukan cek UID/GID ketika safe_mode dan berpotensi safe_mode_gid diaktifkan. UID / GID memeriksa diabaikan ketika file dibuka dari direktori yang ditugaskan.

safe_mode_exec_dir = string

Scope: PHP_INI_SYSTEM; Default value: NULL

Saat safe mode diaktifkan, parameter safe_mode_exec_dir membatasi pelaksanaan executable melalui fungsi exec () untuk direktori yang ditugaskan. Misalnya, jika Anda ingin membatasi eksekusi untuk fungsi yang ditemukan pada / usr / local / bin, Anda menggunakan direktif ini:

safe_mode_exec_dir = "/usr/local/bin"

safe_mode_allowed_env_vars = string

Scope: PHP_INI_SYSTEM; Default value: PHP_

Saat safe mode diaktifkan, Anda dapat membatasi sistem operasi manakah yang tingkat variabel lingkungan pengguna dapat memodifikasi melalui script PHP dengan direktif safe_mode_allowed_env_vars. Misalnya, pengaturan direktif ini sebagai berikut modifikasi membatasi hanya variabel dengan awalan PHP_:

safe_mode_allowed_env_vars = "PHP_"

Perlu diketahui bahwa meninggalkan direktif ini kosong berarti bahwa pengguna dapat memodifikasi variabel lingkungan.

safe_mode_protected_env_vars = string

Scope: PHP_INI_SYSTEM; Default value: LD_LIBRARY_PATH

Direktif safe_mode_protected_env_vars menawarkan cara untuk mencegah secara tegas variabel lingkungan tertentu dari dimodifikasi. Misalnya, jika Anda ingin mencegah pengguna dari memodifikasi variabel PATH dan LD_LIBRARY_PATH, Anda menggunakan direktif ini:

safe_mode_protected_env_vars = "PATH, LD_LIBRARY_PATH"

open_basedir = string

Scope: PHP_INI_SYSTEM; Default value: NULL

Sama seperti direktif DocumentRoot Apache, direktif open_basedir PHP dapat membuat direktori dasar untuk semua operasi file yang akan dibatasi. Hal ini mencegah pengguna dari memasuki lainnya daerah terlarang dari server. Misalnya, semua bahan Web terletak di dalam direktori / home / www. Untuk mencegah user dari melihat dan berpotensi memanipulasi file seperti / etc / passwd melalui beberapa perintah PHP sederhana, pertimbangkan pengaturan open_basedir seperti ini:

open_basedir = "/home/www/"

Catatan bahwa pengaruh dilaksanakan dengan direktif ini tidak tergantung pada direktif safe_mode.

disable_functions = string

Scope: PHP_INI_SYSTEM; Default value: NULL

Dalam lingkungan tertentu, Anda mungkin ingin sepenuhnya melarang penggunaan fungsi standar tertentu, seperti exec () dan system (). Fungsi tersebut

bisa dinonaktifkan dengan menempatkan mereka untuk parameter disable_functions, seperti ini:

disable_functions = "exec, system";

Catatan bahwa pengaruh dilaksanakan dengan direktif ini tidak tergantung pada direktif safe_mode.

disable_classes = string

Scope: PHP_INI_SYSTEM; Default value: NULL

Mengingat kemampuan yang ditawarkan oleh PHP mencakup paradigma berorientasi objek, kemungkinan tidak akan terlalu lama sebelum Anda menggunakan menentukan yang besar perpustakaan kelas. Mungkin ada kelas-kelas tertentu ditemukan di dalam perpustakaan ini bahwa Anda tidak ingin membuat tersedia, Namun demikian. Anda dapat mencegah penggunaan kelas-kelas ini melalui direktif disable_classes. Sebagai contoh, jika Anda ingin menonaktifkan dua kelas tertentu, vektor bernama dan grafik, Anda menggunakan berikut:

disable_classes = "vector, graph"

Catatan bahwa pengaruh dilaksanakan oleh direktif ini tidak tergantung pada direktif safe_mode.

ignore_user_abort = Off | On

Scope: PHP_INI_ALL; Default value: On

Seberapa banyak waktu telah anda browse ke halaman tertentu hanya untuk keluar atau menutup browser sebelum halaman benar-benar terbuka? Seringkali perilaku seperti itu tidak berbahaya. Namun, bagaimana jika server berada di tengah-tengah memperbarui informasi profil pengguna yang penting, atau

menyelesaikan transaksi komersial? Mengaktifkan ignore_user_abort menyebabkan server untuk mengabaikan terminasi session yang disebabkan oleh pengguna atau gangguan yang dimulai browser.

Menyoroti Syntax

PHP dapat menampilkan dan menyorot kode sumber. Dapat mengaktifkan fitur ini baik dengan menempatkan script PHP ekstensi. phps (ini adalah ekstensi default dan, saat Anda akan segera belajar, dapat dimodifikasi) atau melalui show_source () atau fungsi highlight_file (). Untuk menggunakan ekstensi phps, Anda harus menambahkan baris berikut ke httpd.conf:

AddType application/x-httpd-php-source .phps

Anda dapat mengontrol warna string, komentar, kata kunci, latar belakang, teks standar, dan komponen HTML sumber disorot melalui enam direktif berikut. Setiap dapat diberi suatu, RGB, heksadesimal, atau representasi dari masing-masing kata kunci warna. Sebagai contoh, warna biasanya kita sebut sebagai hitam bisa direpresentasikan sebagai rgb (0,0,0), # 000000, atau hitam, masing-masing.

highlight.string = string

Scope: PHP_INI_ALL; Default value: #DD0000

highlight.comment = string

Scope: PHP_INI_ALL; Default value: #FF9900

highlight.keyword = string

Scope: PHP_INI_ALL; Default value: #007700

highlight.bg = string

Scope: PHP_INI_ALL; Default value: #FFFFFF

highlight.default = string

Scope: PHP_INI_ALL; Default value: #0000BB

highlight.html = string

Scope: PHP_INI_ALL; Default value: #000000

Bermacam-macam Kategori Lainnya terdiri dari direktif tunggal, expose_php.

expose_php = On | Off

Scope: PHP_INI_SYSTEM; Default value: On

Setiap potongan informasi bahwa penyerang berpotensi dapat mengumpulkan tentang server Web meningkatkan kemungkinan bahwa ia akan berhasil membahayakan itu. Salah satu cara sederhana untuk memperoleh informasi penting mengenai karakteristik server adalah melalui tanda tangan server. misalnya, Apache akan menyiarkan informasi berikut dalam setiap header respon secara default:

Apache/2.2.0 (Unix) PHP/6.0.0 PHP/6.0.0-dev Server at www.example.com Port 80

Menonaktifkan expose_php mencegah tanda tangan server Web (jika diaktifkan) dari penyiaran fakta bahwa PHP yang terinstal. Meskipun Anda perlu mengambil langkah-langkah lain untuk memastikan perlindungan server yang memadai, menutupi Properti server seperti yang satu ini sungguh-sungguh tetap dianjurkan.

■ Catatan Anda dapat menonaktifkan siaran tanda tangan server Apache dengan pengaturan ServerSignature ke Tidak aktif dalam file httpd.conf.

Sumber Daya Batasan

Meskipun manajemen sumber daya PHP kemampuannya diperbaiki dalam versi 5, Anda masih harus berhati-hati untuk memastikan bahwa script tidak memonopoli sumber daya server sebagai hasil dari salah satu-programmer atau user-tindakan yang dimulai. Tiga bidang tertentu di mana konsumsi berlebihan tersebut adalah lazim pada waktu eksekusi script, script waktu input pengolahan, dan memori. Masing-masing dapat dikontrol melalui tiga direktif berikut.

max_execution_time = integer

Scope: PHP_INI_ALL; Default value: 30

Parameter max_execution_time menempatkan batas atas jumlah waktu, dalam detik, bahwa script PHP dapat dieksekusi. Pengaturan parameter ini dengan 0 Menonaktifkan batas maksimum. Catatan bahwa setiap waktu dikonsumsi oleh program eksternal yang dijalankan oleh perintah PHP, seperti exec () dan system (), tidak dihitung terhadap batas ini.

max_input_time = integer

Scope: PHP_INI_ALL; Default value: 60

Parameter max_input_time menempatkan batas pada jumlah waktu, dalam detik, bahwa script PHP mencurahkan dengan penguraian permintaan data. Parameter ini sangat penting ketika Anda meng-upload file besar menggunakan PHP fitur upload file, yang dibahas dalam Bab 15.

memory_limit = integerM

Scope: PHP_INI_ALL; Default value: 8M

Parameter memory_limit menentukan jumlah maksimum memori, dalam megabyte, yang dapat dialokasikan ke skrip PHP.

Penanganan Data

Parameter diperkenalkan pada bagian ini mempengaruhi cara PHP menangani eksternal variabel-yaitu, variabel dilewatkan ke dalam script melalui beberapa sumber luar. GET, POST, cookies, sistem operasi, dan server semua memungkinkan kandidat untuk menyediakan eksternal data. Parameter lain yang terletak di bagian ini menentukan pengaturan karakter default PHP, tipe MIME default PHP, dan apakah file eksternal akan secara otomatis didahului atau ditambahkan ke output PHP dikembalikan.

arg_separator.output = string

Scope: PHP_INI_ALL; Default value: &amp;

PHP mampu secara otomatis menghasilkan URL dan menggunakan standar ampersand (&) untuk memisahkan variabel input. Namun, jika anda ingin merubah konvensi ini, Anda dapat melakukannya dengan menggunakan direktif arg_separator.output.

arg_separator.input = string

Scope: PHP_INI_ALL; Default value: ;&

The ampersand (&) adalah karakter standar yang digunakan untuk memisahkan variabel input melewati melalui metode POST atau GET. Meskipun tidak mungkin,

sebaiknya anda ingin merubah konvensi ini dalam aplikasi PHP anda, anda dapat melakukannya dengan menggunakan direktif arg_separator.input.

variables_order = string

Scope: PHP_INI_ALL; Default value: EGPCS

Direktif variables_order menentukan urutan ENVIRONMENT, GET, POST, COOKIE, dan SERVER variabel diuraikan. Sementara tampaknya tidak relevan, jika register_globals diaktifkan (tidak direkomendasikan), urutan dari nilai ini dapat mengakibatkan hasil yang tidak diharapkan karena adanya variabel kemudian menimpa yang diuraikan sebelumnya dalam proses.

register_globals = On | Off

Scope: PHP_INI_SYSTEM; Default value: Off

Jika Anda telah menggunakan pra versi-4.0 PHP, hanya menyebutkan direktif ini cukup untuk membangkitkan kertak gigi dan menarik rambut. Untuk menghilangkan masalah, direktif ini telah dinonaktifkan secara default di versi 4.2.0, tapi pada biaya memaksa banyak waktu panjang pengguna PHP untuk sepenuhnya memikirkan kembali (dan dalam beberapa kasus rewrite) metodologi pengembangan aplikasi Web mereka. Perubahan ini, walaupun dilakukan dengan biaya cukup yang membingungkan, akhirnya melayani kepentingan terbaik dari pengembang dalam hal keamanan aplikasi yang lebih besar. Jika Anda baru untuk semua ini, apa masalahnya?

Secara historis, semua variabel eksternal secara otomatis terdaftar dalam lingkup global. Artinya, setiap variabel yang masuk dari jenis COOKIE, ENVIRONMENT, GET, POST, dan SERVER dibuat tersedia secara global. Karena mereka tersedia secara global, mereka juga secara global dapat dimodifikasi. Meskipun ini mungkin tampak nyaman untuk beberapa orang, ini juga diperkenalkan kekurangan keamanan karena variabel dimaksudkan untuk dikelola

hanya dengan menggunakan cookie juga dapat berpotensi dimodifikasi melalui URL. Sebagai contoh, misalkan session pengidentifikasi secara unik mengidentifikasi pengguna dikomunikasikan di halaman melalui cookie. Tak ada tetapi bahwa pengguna harus melihat data yang akhirnya dipetakan ke pengguna yang diidentifikasi oleh pengidentifikasi session itu. Seorang pengguna dapat membuka cookie, menyalin session identifier, dan sisipkan ke dalam akhir dari URL, seperti ini:

http://www.example.com/secretdata.php?sessionid=4x5bh5H793adK

Pengguna kemudian dapat e-mail link ini untuk beberapa pengguna lain. Jika tidak ada pembatasan keamanan lainnya di tempat (misalnya, identifikasi IP), pengguna kedua ini akan dapat melihat data yang dinyatakan rahasia. Menonaktifkan register_globals direktif mencegah perilaku tersebut dari yang terjadi. Sementara variabel-variabel eksternal tetap dalam lingkup global, masing-masing harus dirujuk dalam hubungannya dengan jenisnya. Misalnya, variabel sessionid pada contoh sebelumnya akan sebagai gantinya sepenuhnya disebut sebagai berikut:

$_COOKIE['sessionid']

Setiap usaha untuk memodifikasi parameter ini menggunakan cara lain (misalnya, GET atau POST) menyebabkan variabel baru dalam lingkup global yang berarti ($_GET['sessionid'] atau $_POST['sessionid']). Pada Bab 3, bagian tentang variabel superglobal PHP menawarkan pengenalan yang menyeluruh untuk variabel eksternal dari tipe COOKIE, ENVIRONMENT, GET, POST, dan SERVER.

Meskipun menonaktifkan register_globals secara tegas ide yang baik, bukan satu-satunya faktor yang harus diingat ketika Anda mengamankan aplikasi. Bab 21 memberikan informasi lebih tentang keamanan aplikasi PHP.

■ Catatan Fitur register_globals telah menjadi sumber konstan dari kebingungan dan masalah keamanan terkait selama bertahun-tahun. Dengan demikian, tidak lagi tersedia pada PHP 6.

register_long_arrays = On | Off

Scope: PHP_INI_SYSTEM; Default value: On

Direktif ini menentukan apakah melanjutkan mendaftarkan berbagai input array (ENVIRONMENT, GET, POST, COOKIE, SISTEM) dengan menggunakan sintaks kadaluarsa, seperti HTTP_*_VARS. Menonaktifkan direktif ini direkomendasikan untuk alasan kinerja.

■ Catatan Direktif register_long_arrays tidak lagi tersedia pada PHP 6.

register_argc_argv = On | Off

Scope: PHP_INI_SYSTEM; Default value: On

Melintas di informasi variabel melalui metode GET adalah sama dengan melewati argumen ke sebuah eksekusi. Banyak bahasa memproses argumen seperti dalam hal argc dan argv. argc adalah jumlah argumen, dan argv adalah array diindeks berisi argumen. Jika Anda ingin mendeklarasikan variabel $argc dan $argv dan menirukan fungsi ini, aktifkan register_argc_argv.

post_max_size = integerM

Scope: PHP_INI_SYSTEM; Default value: 8M

Dari dua metode untuk melewati data antara permintaan, POST lebih siap untuk mengangkut jumlah besar, seperti apa yang mungkin dikirimkan melalui formulir Web. Namun, untuk kedua alasan keamanan dan kinerja, Anda mungkin ingin menempatkan uper ceiling pada tepatnya berapa banyak data dapat dikirim melalui metode ini untuk script PHP, ini bisa dicapai dengan menggunakan post_max_size.

BEKERJA DENGAN KUTIPAN SINGLE DAN DOUBLE Kutipan, baik dari berbagai tunggal dan ganda, telah lama memainkan peran khusus dalam pemrograman. Karena mereka umumnya digunakan baik sebagai pembatas string dan dalam bahasa yang ditulis, Anda membutuhkan cara untuk membedakan antara dua pada pemrograman, untuk menghilangkan kebingungan. Solusinya sederhana: menghindari setiap tanda kutipan tidak dimaksudkan untuk membatasi string. Jika Anda tidak melakukan ini, kesalahan tak terduga dapat terjadi. Pertimbangkan hal berikut: $sentence = "John said, "I love racing cars!""; Yang mana tanda kutip dimaksudkan untuk membatasi string, dan yang digunakan untuk membatasi ungkapan John? PHP tidak tahu, kecuali tanda kutip tertentu mengeluarkan, seperti ini: $sentence = "John said, \"I love racing cars!\""; Mengeluarkan tanda kutip nondelimiting dikenal seperti memungkinkan tanda kutip magic. Proses ini dapat dilakukan baik secara otomatis, dengan mengaktifkan magic_quotes_gpc direktif (diperkenalkan pada bagian ini), atau secara manual, dengan menggunakan fungsi addslashes () dan stripslashes (). Strategi terakhir ini dianjurkan karena memungkinkan Anda untuk memegang total kontrol atas aplikasi tersebut, meskipun pada kasus dimana Anda mencoba untuk menggunakan aplikasi pada mana secara otomatis mengeluarkan dari kutipan yang diharapkan, Anda harus mengaktifkan perilaku ini yang sesuai. Tiga parameter telah lama ditentukan bagaimana PHP bertingkah laku pada hal ini: magic_quotes_gpc, magic_quotes_runtime, dan magic_quotes_sybase. Namun, karena fitur ini telah lama menjadi sumber kebingungan di kalangan pengembang, hal ini sudah dihapus pada PHP 6.

magic_quotes_gpc = On | Off

Scope: PHP_INI_SYSTEM; Default value: On

Parameter ini menentukan apakah magic quote diaktifkan untuk data ditransmisikan melalui metodologi GET, POST, dan cookie. Ketika diaktifkan,

semua tanda kutip tunggal dan ganda, backslash, dan karakter null secara otomatis mengeluarkan dengan backslash.

magic_quotes_runtime = On | Off

Scope: PHP_INI_ALL; Default value: Off

Mengaktifkan parameter ini menghasilkan pada secara otomatis keluar (menggunakan backslash) dari setiap tanda kutip yang terletak di dalam data dikembalikan dari sumber eksternal, seperti database atau file teks.

magic_quotes_sybase = On | Off

Scope: PHP_INI_ALL; Default value: Off

Parameter ini hanya kepentingan jika magic_quotes_runtime diaktifkan. Jika magic_quotes_sybase diaktifkan, semua data dikembalikan dari sumber eksternal akan diganti menggunakan tanda kutip tunggal dan bukan backslash. Hal ini berguna ketika data ini telah kembali dari database Sybase, yang mempekerjakan kebutuhan yang agak tidak lazim untuk keluar dari karakter khusus dengan kutipan tunggal daripada backslash.

auto_prepend_file = string

Scope: PHP_INI_SYSTEM; Default value: NULL

Membuat template halaman header atau meliputi perpustakaan kode sebelum script PHP dieksekusi ini paling sering dilakukan dengan menggunakan fungsi include () atau require (). Anda dapat mengotomatisasi proses ini dan melupakan masuknya fungsi ini dalam skrip Anda dengan menugaskan nama file dan path yang sesuai dengan direktif auto_prepend_file.

auto_append_file = string

Scope: PHP_INI_SYSTEM; Default value: NULL

Secara otomatis menyisipkan footer template setelah script PHP dieksekusi ini paling sering dilakukan dengan menggunakan fungsi include () atau require (). Anda dapat mengotomatisasi proses ini dan melupakan masuknya fungsi ini dalam skrip Anda dengan menempatkan nama file template dan path yang sesuai dengan direktif auto_append_file.

default_mimetype = string

Scope: PHP_INI_ALL; Default value: text/html

Tipe MIME menawarkan cara standar untuk mengklasifikasi tipe file di Internet. Anda dapat melayani semua tipe file ini melalui aplikasi PHP, yang paling umum digunakan adalah text / html. Jika Anda menggunakan PHP pada mode lainnya, namun, seperti generator konten untuk aplikasi WML (Wireless Markup Language), Anda perlu menyesuaikan tipe MIME yang sesuai. Anda dapat melakukannya dengan memodifikasi direktif default_mimetype.

default_charset = string

Scope: PHP_INI_ALL; Default value: iso-8859-1

Pada versi 4.0, PHP output pengkodean karakter dalam header Content-Type. Secara default ini diatur untuk iso-8859-1, yang mendukung bahasa seperti bahasa Inggris, Spanyol, Jerman, Italia, dan Portugis, antara lain. Jika aplikasi Anda diarahkan terhadap bahasa seperti Jepang, Cina, atau Ibrani, bagaimanapun, direktif default_charset memungkinkan Anda untuk memperbarui karakter ini menetapkan pengaturan yang sesuai.

always_populate_raw_post_data = On | Off

Scope: PHP_INI_PERDIR; Default value: On

Mengaktifkan direktif always_populate_raw_post_data menyebabkan PHP untuk menetapkan string yang terdiri dari nama POSTED / pasangan nilai variabel $ HTTP_RAW_POST_DATA, bahkan jika form variabel tidak memiliki nilai yang sesuai. Misalnya, direktif ini diaktifkan dan Anda membuat bentuk yang terdiri dari dua bidang teks, satu untuk nama pengguna dan satu lagi untuk alamat e-mail pengguna. Dalam form tindakan yang dihasilkan, Anda mengeksekusi satu perintah:

echo $HTTP_RAW_POST_DATA;

Melengkapi field tidak ada dan klik tombol Submit hasil pada output sebagai berikut:

name=&email=

Melengkapi kedua field dan mengklik tombol Submit menghasilkan output yang sama sebagai berikut:

name=jason&email=jason%40example.com

Path dan Direktori

Bagian ini memperkenalkan direktif yang menentukan default PHP pengaturan path. Path ini digunakan untuk meliputi perpustakaan dan ekstensi, serta untuk menentukan direktori pengguna Web dan root dokumen Web.

include_path = string

Scope: PHP_INI_ALL; Default value: NULL

Path yang parameter ini diatur berfungsi sebagai path dasar yang digunakan oleh fungsi-fungsi seperti include (), require (), dan fopen_with_path (). Anda dapat menetapkan beberapa direktori dengan memisahkan masing-masing dengan titik koma, seperti yang ditunjukkan dalam contoh berikut:

include_path=".:/usr/local/include/php;/home/php"

Secara default, parameter ini diatur ke path yang didefinisikan oleh variabel lingkungan PHP_INCLUDE_PATH.

Perhatikan bahwa pada Windows, belakang slash digunakan sebagai pengganti garis miring depan, dan surat pengantar drive path:

include_path=".;C:\php6\includes"

doc_root = string

Scope: PHP_INI_SYSTEM; Default value: NULL

Parameter ini menentukan standar dari mana semua skrip PHP akan dilayani. Parameter ini hanya digunakan jika tidak kosong.

user_dir = string

Scope: PHP_INI_SYSTEM; Default value: NULL

Direktif user_dir menetapkan direktori mutlak menggunakan PHP saat membuka file menggunakan konvensi / ~ username. Sebagai contoh, ketika user_dir diatur ke / home / users dan menggunakan mencoba untuk membuka file ~ / Gilmore / koleksi / books.txt, PHP tahu bahwa path absolut adalah / home / users / Gilmore / koleksi / books.txt.

extension_dir = string

Scope: PHP_INI_SYSTEM; Default value: ./

Direktif extension_dir memberitahu PHP dimana ekstensi loadable tersebut (modul) berada. Secara standar, ini diatur ke /,. yang berarti bahwa ekstensi load berada di direktori yang sama seperti script yang sedang dijalankan. Dalam lingkungan Windows, jika extension_dir tidak diatur, maka akan standar ke C: \ PHP-INSTALASI-DIRECTORY \ ext \. Di lingkungan Linux, lokasi yang tepat dari direktori ini tergantung pada beberapa faktor, walaupun itu sangat mungkin bahwa lokasi tersebut akan di PHP-INSTALLATION-DIRECTORY/lib/php/extensions/no-debug-zts-RELEASE-BUILD-DATE /.

enable_dl = On | Off

Scope: PHP_INI_SYSTEM; Default value: On

enable_dl () berfungsi memperbolehkan user untuk me-load ekstensi PHP pada run time-yaitu, selama eksekusi script.

Fopen Wrapper

Bagian ini berisi lima direktif terkait untuk akses dan manipulasi file remote.

allow_url_fopen = On | Off

Scope: PHP_INI_ALL; Default value: On

Mengaktifkan Allow_url_fopen memungkinkan PHP untuk menangani file jarak jauh, hampir seolah-olah mereka lokal. Bila diaktifkan, script PHP dapat mengakses dan memodifikasi file yang berada pada server remote, jika file memiliki izin yang benar.

from = string

Scope: PHP_INI_ALL; Default value: NULL

Judul dari direktif mungkin menyesatkan dalam bahwa sebenarnya menentukan password, bukan identitas, pengguna tanpa nama yang digunakan untuk melakukan koneksi FTP. Karena itu, jika dari diatur seperti ini.

from = [email protected]

tanpa nama username dan password [email protected] akan dilewatkan ke server bila otentikasi diminta.

user_agent = string

Scope: PHP_INI_ALL; Default value: NULL

PHP selalu mengirimkan sebuah header konten bersama dengan Output olahannya, termasuk atribut user agent. Direktif ini menentukan nilai atribut itu.

default_socket_timeout = integer

Scope: PHP_INI_ALL; Default value: 60

Direktif ini menentukan nilai waktu-luar soket berbasis arus dalam detik.

auto_detect_line_endings = On | Off

Scope: PHP_INI_ALL; Default value: Off

Salah satu sumber yang tidak pernah berakhir rasa frustrasi pengembang berasal dari karakter garis-akhir-(EOL) karena berbagai sintaks yang digunakan oleh sistem operasi yang berbeda. Mengaktifkan auto_detect_line_endings menentukan apakah data yang dibaca oleh fgets () dan file () menggunakan Macintosh, MS-DOS, atau konvensi berkas Linux.

Dynamic Extensions

Bagian ini berisi direktif tunggal, ekstensi.

extension = string

Scope: PHP_INI_ALL; Default value: NULL

Direktif ekstensi digunakan secara dinamis memuat modul tertentu. Pada sistem operasi Win32, sebuah modul mungkin dimuat seperti ini:

extension = php_java.dll

Pada Unix, itu akan dimuat seperti ini:

extension = php_java.so

Perlu diingat bahwa di kedua sistem operasi, cukup uncommenting atau menambah baris ini tidak selalu mengaktifkan ekstensi yang terkait. Anda juga harus memastikan bahwa perangkat lunak yang bersangkutan terinstal di sistem operasi. Misalnya, untuk mengaktifkan Dukungan Java, anda juga perlu menginstal JDK.

■ ■ ■

CHAPTER 3

PHP Basics

Anda hanya dua bab dalam buku dan sudah cukup sedikit tanah telah ditutupi. Sekarang, Anda sudah familiar dengan PHP dan latar belakang sejarah dan telah menggali jauh ke dalam dalam instalasi dan konsep konfigurasi dan prosedur. Materi ini mengatur tahapan untuk apa yang akan membentuk inti dari banyak materi yang tersisa dalam buku ini: membuat aplikasi PHP yang kuat. Bab ini memulai diskusi ini, memperkenalkan sejumlah besar fitur dasar bahasa ini. Khususnya, Anda akan belajar bagaimana untuk melakukan hal berikut:

• PHP Embed kode ke halaman Web Anda

• Komentari kode menggunakan berbagai metodologi yang dipinjam dari scripting shell Unix, C, dan bahasa C + +

• Output data ke browser menggunakan pernyataan echo (), print (), printf (), dan sprintf ()

• Menggunakan tipe data PHP, variabel, operator, dan pernyataan untuk membuat script rumit

• Manfaatkan struktur tombol kontrol dan pernyataan, if-else-elseif, while, foreach, include, require, break, continue, and declare

Pada kesimpulan dari bab ini, anda akan memiliki tidak hanya pengetahuan yang diperlukan untuk menciptakan dasar tetapi manfaat aplikasi PHP, tetapi juga memahami tentang apa yang dibutuhkan untuk membuat sebagian besar materi yang dibahas di bab berikutnya.

■ Catatan Bab ini secara bersamaan berfungsi baik sebagai tutorial untuk programmer pemula dan referensi bagi programmer berpengalaman yang baru dengan bahasa PHP. Jika Anda termasuk ke dalam kategori sebelumnya, pertimbangkan untuk membaca bab ini secara keseluruhan dan mengikuti bersama dengan contoh.

Menanamkan Kode PHP di Halaman Web Anda

Salah satu kelebihan PHP adalah bahwa Anda bisa menyertakan kode PHP langsung bersama HTML. Untuk kode dengan melakukan apa saja, halaman harus dilewatkan ke mesin PHP untuk interpretasi. Tetapi server Web tidak hanya melewati setiap halaman, melainkan hanya melewati halaman tersebut diidentifikasi dengan ekstensi file tertentu (biasanya .php) sebagai dikonfigurasi sesuai dengan petunjuk pada Bab 2. Tetapi bahkan selektif hanya melewati halaman tertentu untuk mesin tetap akan sangat tidak efisien untuk mesin untuk mempertimbangkan setiap baris sebagai potensial perintah PHP. Oleh karena itu, mesin membutuhkan beberapa cara untuk segera menentukan area halaman tersebut PHP-enabled. Hal ini logis dilakukan dengan pembatasan kode PHP. Ada empat varian batas, semua yang diperkenalkan di bagian ini.

Default Sintaks

Sintaks pembatas default dibuka dengan <php dan diakhiri dengan??>, seperti ini:

<h3>Welcome!</h3>

<?php

echo "<p>Some dynamic output here</p>";

?>

<p>Some static output here</p>

Jika Anda menyimpan kode ini sebagai test.php dan menjalankannya dari PHP-enabled Web server, Anda akan melihat output yang ditunjukkan pada Gambar 3-1.

Short-tags

Untuk menguarangi dimotivasi tukang ketik sintaks pembatas lebih pendek tersedia. Dikenal sebagai short-tags, sintaks ini bukan referensi php yang diperlukan dalam sintaks default. Namun, dengan menggunakan fitur ini, Anda harus mengaktifkan direktif short_open_tag PHP. Sebuah contoh berikut:

<?

print "This is another PHP example.";

?>

■Perhatian Walaupun pembatas short-tag mudah dicapai, perlu diingat bahwa mereka berbenturan dengan XML, dan dengan demikian XHTML, sintaks. Oleh karena itu, untuk alasan kesesuaiannya Anda tidak harus menggunakan sintaks short-tag.

Ketika pendek sintaks tag diaktifkan dan Anda ingin cepat mengeluarkan untuk dan dari PHP dengan output sedikit teks dinamis, Anda dapat menghilangkan pernyataan menggunakan variasi output dikenal sebagai sintaks-pendek:

<?="This is another PHP example.";?>

Hal ini fungsinya sama dengan kedua variasi berikut:

<? echo "This is another PHP example."; ?>

<?php echo "This is another PHP example.";?>

Script

Secara historis, editor tertentu, Microsoft FrontPage editor pada khususnya, memiliki masalah menangani dengan sintaks lepas seperti yang digunakan oleh PHP. Oleh karena itu, dukungan untuk varian lain pembatas utama, <script>, ditawarkan:

<script language="php">

print "This is another PHP example.";

</script>

■ Tips Microsoft FrontPage Editor juga memahami sintaks pembatas ASP-style, diperkenalkan berikutnya.

Gaya ASP

Halaman Microsoft ASP menggunakan strategi yang sama, pembatasan statis dari sintaks dinamis dengan menggunakan pola karakter yang telah ditetapkan, membuka sintaks dinamis dengan <%, dan penutup dengan%>. Jika Anda datang dari latar belakang ASP dan lebih memilih untuk terus menggunakan ini mengeluarkan sintaks, PHP mendukungnya. Berikut ini contohnya:

<%

print "This is another PHP example.";

%>

■ Perhatian sintaks ASP-style telah dihapus pada PHP 6.

Menanamkan Blok Kode Banyak

Anda dapat lepas untuk dan dari PHP sebanyak yang dibutuhkan dalam suatu halaman tertentu. Misalnya, contoh berikut ini bisa diterima:

<html>

<head>

<title><?php echo "Welcome to my Web site!";?></title>

</head>

<body>

<?php

$date = "July 26, 2007";

?>

<p>Today's date is <?=$date;?></p>

</body>

</html>

Seperti yang Anda lihat, setiap variabel yang dideklarasikan pada blok kode sebelumnya adalah "diingat" untuk blok kemudian, seperti halnya dengan variabel $date dalam contoh ini.

Mengomentari Kode Anda

Baik untuk kepentingan sendiri atau untuk itu dari programmer kemudian bertugas memelihara kode Anda, pentingnya secara menyeluruh mengomentari kode Anda tidak dapat dilebih-lebihkan. PHP menawarkan beberapa variasi sintaks, masing-masing yang diperkenalkan di bagian ini.

Single-Line C++ Syntax

Komentar sering membutuhkan tak lebih dari satu baris. Karena singkatnya, ada tidak perlu untuk membatasi kesimpulan komentar karena karakter baris baru (\ n) mengisi kebutuhan ini cukup baik. PHP mendukung C + + single-line sintaks komentar, yang diawali dengan garis miring ganda (//),seperti ini:

<?php

// Title: My first PHP script

// Author: Jason

echo "This is a PHP program";

?>

Shell Syntax

PHP juga mendukung alternatif sintaks C + +-style single-line, yang dikenal sebagai sintaks shell, yang diawali dengan tanda pagar (#). Meninjau Kembali contoh sebelumnya, saya akan menggunakan tanda pagar untuk menambahkan beberapa informasi tentang script:

<?php

# Title: My PHP program

# Author: Jason

echo "This is a PHP program";

?>

LANJUTAN DOKUMENTASI DENGAN phpDocumentor Karena dokumentasi adalah bagian penting dari pembuatan kode yang efektif dan manajemen, usaha cukup besar telah dimasukkan ke dalam merumuskan metode untuk membantu pengembang untuk mengotomatisasikan proses ini. Pada Bahkan, solusi dokumentasi hari ini yang tersedia untuk semua bahasa pemrograman utama, PHP disertakan. phpDocumentor (http://www.phpdoc.org/) adalah sebuah proyek open source yang memfasilitasi proses dokumentasi dengan mengkonversi komentar yang tertanam dalam kode sumber ke dalam berbagai format yang mudah dibaca, termasuk HTML dan PDF. phpDocumentor bekerja dengan menguraikan kode sumber aplikasi ini, mencari komentar khusus yang dikenal sebagai DocBlocks. Digunakan untuk mendokumentasikan semua kode dalam aplikasi, termasuk script, kelas, fungsi, variabel, dan banyak lagi, DocBlocks berisi penjelasan yang bisa dibaca manusia bersama dengan deskripsi yang diformalkan seperti nama penulis, versi kode, pernyataan hak cipta, mengembalikan fungsi nilai, dan banyak lagi. Bahkan jika Anda seorang programmer pemula, ini sangat menyarankan Anda menjadi akrab dengan solusi dokumentasi lanjutan dan masuk ke dalam kebiasaan menggunakan mereka untuk bahkan aplikasi dasar.

Multiple-Line C Syntax

Ini sering mudah digunakan untuk menyertakan yang terlebih deskripsi fungsional verbose atau catatan penjelasan lain dalam kode, yang secara logis menjamin banyak baris. Meskipun Anda dapat pengantar setiap baris dengan C + + atau pembatas gaya shell, PHP juga menawarkan banyak varian garis yang dapat membuka dan menutup komentar pada baris yang berbeda. Berikut contoh:

<?php

/*

Title: My PHP Program

Author: Jason

Date: July 26, 2007

*/

?>

Data keluaran untuk Browser

Tentu saja, bahkan yang paling sederhana situs Web akan menampilkan data ke browser, dan PHP menawarkan beberapa metode untuk melakukannya.

■ Catatan Sepanjang bab ini, dan bahkan sepanjang buku ini, ketika memperkenalkan fungsi saya akan merujuk prototipe mereka. Prototipe adalah hanya definisi function, meresmikan namanya, input parameter, dan Tipe nilai itu kembali, yang ditentukan oleh suatu datatipe. Jika Anda tidak tahu apa datatype, lihat bagian "Datatipe PHP yang didukung " nantinya dalam bab ini.

The print() Statement

pernyataan print () output data yang diberikan kepada browser. Prototipe terlihat seperti ini:

int print(argument)

Semua dari berikut adalah dapat diterima pernyataan print():

<?php

print("<p>I love the summertime.</p>");

?>

<?php

$season = "summertime";

print "<p>I love the $season.</p>";

?>

<?php

print "<p>I love the

summertime.</p>";

?>

Semua pernyataan menghasilkan output yang sama:

■ Catatan Meskipun panggilan sintaks yang resmi untuk penggunaan tanda kurung untuk menyertakan argumen, mereka tidak diperlukan. Banyak programmer cenderung melupakan mereka hanya karena argumen target adalah sama jelas tanpa mereka.

Sebagai alternatif, Anda dapat menggunakan pernyataan echo () untuk tujuan yang sama seperti print (). Walaupun ada perbedaan teknis antara echo () dan

print (), mereka akan tidak relevan bagi sebagian besar pembaca dan oleh karena itu tidak dibahas di sini. echo (prototipe ) terlihat seperti ini:

void echo(string argument1 [, ...string argumentN])

Seperti yang dapat Anda lihat dari prototipe, echo () mampu mengeluarkan beberapa string. Kegunaan dari sifat khusus ini dipertanyakan; menggunakannya tampaknya menjadi hal preferensi lebih dari apa pun. Meskipun demikian, ini tersedia jika Anda merasa perlu. Berikut ini contohnya:

<?php

$heavyweight = "Lennox Lewis";

$lightweight = "Floyd Mayweather";

echo $heavyweight, " and ", $lightweight, " are great fighters.";

?>

Kode ini menghasilkan sebagai berikut:

Jika niat Anda adalah untuk output campuran teks statis dan informasi dinamis melewati variabel, pertimbangkan untuk menggunakan printf () sebagai gantinya, yang diperkenalkan berikutnya. Sebaliknya, jika Anda ingin hanya output teks statis, echo () atau print () bekerja dengan baik.

■ Tip Mana yang lebih cepat, echo () atau print ()? Faktanya bahwa mereka secara fungsional dipertukarkan meninggalkan banyak memikirkan pertanyaan ini.

Jawabannya adalah bahwa echo () fungsi adalah Agak lebih cepat karena mengembalikan tidak ada, sedangkan print () akan mengembalikan 1 jika pernyataan itu berhasil output. Ini agak tidak mungkin bahwa Anda akan melihat perbedaan kecepatan, bagaimanapun, jadi Anda dapat mempertimbangkan keputusan penggunaan menjadi salah satu gaya perhatian.

The printf() Statement

pernyataan printf ()sangat ideal saat Anda ingin menampilkan campuran teks statis dan informasi dinamis yang disimpan dalam satu atau beberapa variabel. Ini ideal untuk dua alasan. Pertama, dengan rapi memisahkan data statis dan dinamis menjadi dua bagian yang berbeda, yang memungkinkan untuk memudahkan perawatan. Kedua, printf () memungkinkan Anda untuk memegang kendali yang cukup besar atas bagaimana informasi dinamis diberikan kepada layar dalam hal tipenya, presisi, keselarasan, dan posisi. Its prototipe terlihat seperti ini:

boolean printf(string format [, mixed args])

Misalnya, Anda ingin memasukkan nilai integer tunggal dinamis ke sebuah string statis lain:

printf("Bar inventory: %d bottles of tonic water.", 100);

Menjalankan perintah ini menghasilkan sebagai berikut:

Dalam contoh ini,% d merupakan tempat yang dikenal sebagai spesifikasi tipe, dan d menunjukkan nilai integer akan ditempatkan pada posisi itu. Ketika pernyataan printf () mengeksekusi, argumen tunggal, 100, akan dimasukkan ke dalam dudukan. Ingat bahwa sebuah integer yang diharapkan, jadi jika Anda meneruskan sejumlah termasuk nilai desimal (dikenal sebagai float), maka akan dibulatkan ke integer terdekat. Jika Anda melewati sepanjang 100,2, atau 100,6 100 akan di tampilkan. Melewati sepanjang nilai string seperti "seratus", dan 0

akan di tampilkan. Logika serupa menerapkan untuk spesifikasi tipe lainnya (lihat Tabel 3-1 untuk daftar specifier yang umum digunakan).

Tabel 3-1. Yang Umum Digunakan specifier type

Jadi apa yang Anda lakukan jika Anda ingin menyampaikan dua nilai? Hanya memasukkan dua specifier menjadi string dan pastikan Anda melewatkan dua nilai bersama sebagai argumen. Sebagai contoh, berikut pernyataan printf () melintas di sebuah nilai integer dan float:

printf("%d bottles of tonic water cost $%f", 100, 43.20);

Menjalankan perintah ini menghasilkan sebagai berikut:

Ketika bekerja dengan nilai desimal, Anda dapat mengatur ketepatan menggunakan penspesifikasi presisi. Sebuah contoh berikut:

printf("$%.2f", 43.2); // $43.20

Masih specifier lain yang ada untuk tweaker keseluruhan argumen itu, padding, sign, dan lebar. Konsultasikan manual PHP untuk informasi lebih lanjut.

Pernyataan sprintf()

Pernyataan sprintf () secara fungsional sama dengan printf () selain bahwa output ditugaskan untuk string bukan yang diberikan untuk browser. Prototipe berikut:

string sprintf(string format [, mixed arguments])

contoh berikut :

$cost = sprintf("$%.2f", 43.2); // $cost = $43.20

Tipedata yang didukung PHP

Tipe data adalah nama umum yang diberikan untuk setiap berbagi data seperangkat karakteristik. Tipe data yang umum meliputi Boolean, integer, float, string, dan array. PHP telah lama menawarkan seperangkat Tipe data, dan dalam bagian ini anda akan belajar tentang mereka.

Tipe Data skalar

Tipe data skalar mampu mengandung satu item informasi. Beberapa tipe data termasuk dalam kategori ini, termasuk Boolean, integer, float, dan string.

Boolean

Tipe data Boolean diberi nama setelah George Boole (1815-1864), seorang matematikawan yang dianggap sebagai salah satu pendiri teori informasi. Sebuah

variabel Boolean merupakan kebenaran, hanya mendukung dua nilai: TRUE dan FALSE (case sensitive). Sebagai alternatif, Anda dapat menggunakan nol untuk mewakili FALSE, dan setiap nilai bukan nol untuk mewakili TRUE. Beberapa contoh berikut:

$alive = false; // $alive is false.

$alive = 1; // $alive is true.

$alive = -1; // $alive is true.

$alive = 5; // $alive is true.

$alive = 0; // $alive is false.

Integer

Sebuah integer mewakili dari seluruh nomor atau, dengan kata lain, jumlah yang tidak berisi bagian pecahan. PHP mendukung nilai integer diwakili dalam basis 10 (desimal), basis 8 (oktal), dan basis 16 (heksadesimal) penomoran sistem, meskipun sepertinya Anda hanya akan peduli dengan yang pertama dari sistem tersebut. Beberapa contoh berikut:

42 // decimal

-678900 // decimal

0755 // octal

0xC4E // hexadecimal

Ukuran maksimum yang didukung integer adalah tergantung-platform, meskipun hal ini biasanya positif atau negatif 231 untuk versi PHP 5 dan sebelumnya. PHP 6 memperkenalkan nilai integer 64-bit, artinya PHP akan mendukung nilai integer sampai positif atau negatif 263 dalam ukuran.

Float

angka Floating-point, juga disebut sebagai float, double, atau bilangan real, memungkinkan Anda untuk menentukan angka yang berisi bagian pecahan. Float yang digunakan untuk mewakili nilai Keuangan, berat, jarak, dan berbagai macam representasi lain di mana nilai integer sederhana tidak akan cukup. Float PHP dapat dispesifikasikan dalam berbagai cara, masing-masing yang dicontohkan di sini:

4.5678

4.0

8.7e4

1.23E+11

String

Sederhananya, string merupakan rangkaian karakter ditangani sebagai kelompok berdampingan. String dipisahkan oleh tanda kutip tunggal atau ganda, meskipun PHP juga mendukung metodologi pembatasan lainnya, yang diperkenalkan dalam bagian berikutnya "String Interpolation."

Berikut ini adalah contoh dari string yang valid:

"PHP is a great language"

"whoop-de-do"

'*9subway\n'

"123$%^789"

Menurut sejarah, string PHP diperlakukan dengan cara yang sama sebagai array (lihat bagian berikutnya, "Datatypes gabungan," untuk informasi lebih lanjut tentang array), memungkinkan untuk karakter khusus untuk diakses melalui notasi yang diimbangi dengan array. Contoh, perhatikan string berikut:

$color = "maroon";

Anda bisa mengambil karakter tertentu dari string dengan memperlakukan string sebagai array, seperti ini:

$parser = $color[2]; // Assigns 'r' to $parser

Gabungan Tipe Data

Gabungan tipe data memungkinkan beberapa item dari jenis yang sama akan dikumpulkan di bawah kesatuan perwakilan tunggal. Array dan jatuhnya objek dalam kategori ini.

Array

Ini sering berguna untuk keseluruhan serangkaian item yang sama bersama-sama, mengatur dan mengacu mereka dalam beberapa cara yang spesifik. Struktur data ini, dikenal sebagai sebuah array, secara formal didefinisikan sebagai sebuah koleksi diindeks dari nilai data. Setiap anggota dari indeks array (juga diketahui seperti kunci) referensi nilai yang sesuai dan bisa menjadi acuan angka sederhana untuk posisi nilai dalam seri, atau bisa memiliki beberapa hubungan langsung dengan nilai. Misalnya, jika Anda tertarik untuk membuat daftar negara bagian AS, Anda bisa menggunakan array diindeks secara numerik, seperti:

$state[0] = "Alabama";

$state[1] = "Alaska";

$state[2] = "Arizona";

...

$state[49] = "Wyoming";

Tapi bagaimana kalau proyek yang dibutuhkan berhubungan negara bagian AS untuk ibukota mereka? Daripada basis tombol pada indeks angka, Anda mungkin dapat menggunakan indeks asosiatif, seperti ini:

$state["Alabama"] = "Montgomery";

$state["Alaska"] = "Juneau";

$state["Arizona"] = "Phoenix";

...

$state["Wyoming"] = "Cheyenne";

Array secara formal diperkenalkan dalam Bab 5, jadi jangan terlalu khawatir tentang hal jika Anda tidak sepenuhnya memahami konsep-konsep ini sekarang.

■ Catatan PHP juga mendukung array yang terdiri dari beberapa dimensi, lebih dikenal sebagai array multidimensi. Konsep ini diperkenalkan dalam Bab 5.

Objek

Tipe data kompleks lain yang didukung oleh PHP adalah objek. Objek adalah konsep utama dari paradigma pemrograman berorientasi objek. Jika Anda masih baru dengan pemrograman berorientasi obyek, Bab 6 dan 7 yang dikhususkan untuk topik ini.

Berbeda dengan tipe data lain yang berisi pada bahasa PHP, sebuah objek harus secara tegas dideklarasikan. Pernyataan karakteristik obyek dan perilaku

terjadi di dalam sesuatu yang disebut kelas. Berikut adalah contoh umum dari sebuah definisi kelas danselanjutnya pemanggilan:

class Appliance {

private $_power;

function setPower($status) {

$this->_power = $status;

}

}

...

$blender = new Appliance;

Sebuah definisi kelas menciptakan beberapa atribut dan fungsi yang berkaitan dengan suatu struktur data, pada kasus ini struktur data bernama Appliance. Hanya ada satu atribut, power, yang dapat dimodifikasi dengan menggunakan metode setPower ().

Ingat, bagaimanapun, bahwa suatu definisi kelas adalah template dan tidak bisa dimanipulasi. Sebaliknya, objek dibuat berdasarkan template ini. Ini dicapai melalui kata kunci baru. Oleh karena itu, pada baris terakhir dari daftar sebelumnya, sebuah objek dari kelas Appliance bernama blender dibuat.

Atribut power Objek blender itu kemudian dapat diatur dengan membuat menggunakan metode setPower ():

$blender->setPower("on");

Perbaikan model Pengembangan berorientasi obyek PHP adalah menyoroti dari PHP 5 dan lebih ditingkatkan pada PHP 6. Bab 6 dan 7 dikhususkan dengan cakupan menyeluruh dari model pembangunan berorientasi objek PHP.

Konversi Antara Tipedata Menggunakan Tipe Pemilihan

Mengkonversi nilai dari satu datatype yang lain dikenal sebagai tipe casting. Sebuah variabel dapat dievaluasi satu kali sebagai jenis yang berbeda dengan casting kepada lainnya. Hal ini dilakukan dengan menempatkan jenis yang dimaksudkan pada bagian depan variabel yang akan dicetak. Tipe A dapat dicetak dengan menyisipkan salah satu operator yang ditunjukkan pada Tabel 3-2 pada bagian depan variabel.

Mari kita pertimbangkan beberapa contoh. Misalnya anda ingin memilih integer sebagai double:

$score = (double) 13; // $score = 13.0

Tipe casting double ke integer akan menghasilkan nilai integer yang dibulatkan ke bawah, terlepas dari nilai desimal. Berikut ini contohnya:

$score = (int) 14.8; // $score = 14

Apa yang terjadi jika Anda melemparkan tipe data string dengan yang integer? Mari kita cari tahu:

$sentence = "This is a sentence";

echo (int) $sentence; // returns 0

Sehubungan desain PHP secara longgar diketik, itu hanya akan mengembalikan nilai integer yang tidak dimodifikasi. Namun, karena Anda akan melihat di bagian berikutnya, PHP terkadang akan mengambil inisiatif dan tipe cast yang terbaik sesuai dengan kebutuhan dari suatu situasi tertentu.

Anda juga dapat melemparkan tipe data untuk menjadi bagian array. Nilai melemparkan hanya menjadi elemen pertama dari array:

$score = 1114;

$scoreboard = (array) $score;

echo $scoreboard[0]; // Outputs 1114

Catatan bahwa ini tidak seharusnya dianggap praktik standar untuk menambahkan item ke array karena ini hanya tampaknya bekerja untuk bagian pertama dari array yang baru dibuat. Jika dilemparkan terhadap sebuah array yang sudah ada, bahwa array akan dihapuskan, hanya menyisakan cast yang baru nilai di posisi pertama. Lihat Bab 5 untuk informasi lebih lanjut tentang cara membuat array.

Satu contoh terakhir: tipe data apapun dapat dilemparkan sebagai objek. Hasilnya adalah bahwa variabel menjadi atribut obyek, atribut memiliki nama skalar:

$model = "Toyota";

$obj = (object) $model;

Nilai ini kemudian dapat direferensikan sebagai berikut:

print $ obj->scalar; // returns "Toyota"

Tipe Data beradaptasi dengan Tipe menyulap

Karena sikap lemah PHP terhadap definisi tipe, variabel kadang-kadang secara otomatis melemparkan paling cocok untuk keadaan di mana mereka dirujuk. Perhatikan potongan berikut:

<?php

$total = 5; // an integer

$count = "15"; // a string

$total += $count; // $total = 20 (an integer)

?>

Hasilnya adalah satu yang diharapkan; $total diberikan 20, mengubah variabel $count dari string ke integer dalam proses. Berikut contoh lain yang menunjukkan kemampuan jenis-juggling PHP:

<?php

$total = "45 fire engines";

$incoming = 10;

$total = $incoming + $total; // $total = 55

?>

Nilai integer pada awal string $total aslinya digunakan pada perhitungan. Namun, jika dimulai dengan sesuatu selain representasi angka, nilai adalah 0. Pertimbangkan contoh lain:

<?php

$total = "1.0";

if ($total) echo "We're in positive territory!";

?>

Dalam contoh ini, string diubah ke tipe Boolean untuk mengevaluasi pernyataan jika.

Pertimbangkan satu contoh menarik yang terakhir. Jika string digunakan dalam perhitungan matematis meliputi., e, atau E (mewakili notasi ilmiah), maka akan dievaluasi sebagai float:

<?php

$val1 = "1.2e3"; // 1,200

$val2 = 2;

echo $val1 * $val2; // outputs 2400

?>

Fungsi Tipe-Terkait

Sedikit fungsi yang tersedia baik untuk memverifikasi dan mengkonversi tipe data, mereka akan dibahas dalam bagian ini.

Mengambil Tipe

fungsi gettype () mengembalikan tipe variabel yang ditetapkan oleh var. Secara keseluruhan, delapan yang memungkinkan mengembembalikan nilai yang

tersedia: array, boolean, double, integer, obyek, resource, string, dan tipe yang tidak diketahui. Prototipe seperti berikut:

string gettype (mixed var)

Mengkonversi Tipe

fungsi settype ()mengubah variabel, yang ditentukan oleh var, dengan tipe yang ditentukan oleh tipe. Tujuh Tipe nilai yang mungkin tersedia: array, boolean, float, integer, null, object, dan string. Jika konversi berhasil, TRUE dikembalikan, sebaliknya, FALSE akan dikembalikan. Prototipe Its berikut:

boolean settype(mixed var, string type)

Fungsi Pengidentifikasi Tipe

Sejumlah fungsi yang tersedia untuk menentukan Tipe suatu variabel, termasuk is_array (), is_bool (), is_float (), is_integer (), is_null (), is_numeric (), is_object (), is_resource (), is_scalar (), dan is_string (). Karena semua fungsi ini mengikuti konvensi penamaan yang sama, argumen, dan nilai-nilai mengembalikan, pengenalan mereka dikonsolidasikan ke dalam satu contoh. Prototipe umum berikut:

boolean is_name(mixed var)

Semua Fungsi ini dikelompokkan dalam bagian ini karena masing-masing pada akhirnya menyelesaikan tugas yang sama. Setiap menentukan apakah sebuah variabel, ditentukan oleh var, memenuhi suatu kondisi tertentu yang ditetapkan oleh nama fungsi. Jika var ini memang dari tipe yang diuji oleh nama fungsi, TRUE akan dikembalikan, sebaliknya, FALSE akan dikembalikan. Sebuah contoh berikut:

<?php

$item = 43;

printf("The variable \$item is of type array: %d <br />", is_array($item));

printf("The variable \$item is of type integer: %d <br />",

is_integer($item));

printf("The variable \$item is numeric: %d <br />", is_numeric($item));

?>

Kode ini mengembalikan sebagai berikut:

Anda mungkin bertanya-tanya tentang awalan backslash $item. Mengingat tujuan khusus tanda dolar mengidentifikasi variabel, harus ada cara untuk mengetahui penafsir untuk memperlakukannya sebagai karakter normal yang harus Anda ingin menampilkan ke layar. Pembatasan tanda dolar dengan garis miring terbalik akan mencapai hal ini.

Pengidentifikasi

Pengidentifikasi adalah istilah umum yang diterapkan untuk variabel, fungsi, dan berbagai objek yang ditetapkan pengguna lainnya. Ada beberapa properti bahwa Pengidentifikasi PHP harus mematuhi pada:

• Sebuah pengidentifikasi dapat terdiri dari satu atau lebih karakter dan harus dimulai dengan huruf atau underscore. Selanjutnya, pengidentifikasi dapat terdiri

dari huruf, angka, underscore karakter, dan lainnya karakter ASCII dari 127 sampai 255. Tabel 3-3 menunjukkan beberapa contoh pengenal sah dan valid.

• pengidentifikasi adalah case sensitive. Oleh karena itu, variabel yang bernama $recipe berbeda dari variabel yang bernama $Recipe, $rEciPe, or $recipE.

• pengidentifikasi dapat menjadi setiap panjang. Hal ini menguntungkan karena memungkinkan programmer untuk secara akurat menjelaskan pengidentifikasi tujuannya melalui identifikasi nama.

• Sebuah nama identifier tidak bisa identik dengan salah satu kata kunci PHP yang telah ditetapkan. Anda dapat menemukan daftar lengkap dari kata kunci tersebut dalam lampiran manual PHP.

Variables

Meskipun variabel telah digunakan dalam banyak contoh pada bab ini, konsep masih belum secara resmi diperkenalkan. Bagian ini melakukannya, memulai dengan definisi. Sederhananya, variabel merupakan simbol yang dapat menyimpan nilai yang berbeda pada waktu yang berbeda. Misalnya, Anda membuat sebuah kalkulator berbasis web mampu melakukan tugas-tugas matematika. Tentu saja, pengguna akan ingin untuk memasang nilai memilih nya, sehingga program harus mampu secara dinamis menyimpan nilai tersebut dan melakukan perhitungan yang sesuai. Pada saat yang sama, programmer membutuhkan sarana yang mudah untuk mengacu pada nilai pemegang ini dalam aplikasi. Variabel kedua menyelesaikan tugas.

Mengingat pentingnya konsep pemrograman, akan lebih bijaksana untuk secara tegas meletakkan dasar mengenai bagaimana variabel dinyatakan dan dimanipulasi. Pada bagian ini, aturan ini diteliti secara detail.

■ Catatan variabel adalah dinamakan lokasi memori yang berisi data dan dapat dimanipulasi seluruh pelaksanaan program.

Pernyataan Variabel

Suatu variabel selalu dimulai dengan tanda dolar, $, yang kemudian diikuti dengan nama variabel. Nama variabel mengikuti aturan penamaan yang sama seperti pengidentifikasi. Artinya, nama variabel dapat dimulai dengan salah satu huruf atau underscore dan dapat terdiri dari huruf, garis bawah, angka, atau karakter ASCII mulai dari 127 sampai 255. Berikut ini adalah semua variabel yang valid:

• $color

• $operating_system

• $_some_variable

• $model

Catatan bahwa variabel adalah case sensitif. Misalnya, variabel berikut dikenakan mutlak tidak ada hubungannya dengan satu sama lain:

• $color

• $Color

• $COLOR

Menariknya, variabel tidak harus secara eksplisit dinyatakan dalam PHP seperti yang mereka lakukan dalam Perl. Sebaliknya, variabel dapat dideklarasikan dan diberi nilai-nilai secara bersamaan. Meskipun demikian, hanya karena Anda dapat melakukan sesuatu tidak berarti Anda harus. Praktek pemrograman yang baik

menyatakan bahwa semua variabel harus dideklarasikan sebelum digunakan, sebaiknya dengan sebuah komentar yang menyertainya.

Setelah Anda mendeklarasikan Variabel Anda, Anda dapat mulai menetapkan nilai kepada mereka. Dua metodologi yang tersedia untuk tugas variabel: dengan nilai dan dengan referensi. Keduanya diperkenalkan berikutnya.

Penugasan Nilai

Penugasan dengan nilai hanya melibatkan menyalin nilai dari ekspresi yang ditugaskan kepada penerima variabel. Ini adalah tipe penugasan yang paling umum. Beberapa contoh berikut:

$color = "red";

$number = 12;

$age = 12;

$sum = 12 + "15"; // $sum = 27

Perlu diingat bahwa setiap variabel memiliki salinan dari ekspresi yang ditugaskan untuk itu. Misalnya, $number dan $age memiliki salinan unik mereka sendiri dengan nilai 12. Jika Anda lebih suka bahwa dua variabel menunjuk ke salinan yang sama dari nilai, Anda harus menentukan dengan rujukan, diperkenalkan berikutnya.

Penugasan Rujukan

PHP 4 diperkenalkan kemampuan untuk menetapkan variabel dengan rujukan, yang pada dasarnya berarti bahwa Anda dapat membuat sebuah variabel yang mengacu pada konten yang sama sebagai variabel yang lain. Oleh karena itu, perubahan ke setiap rujukan variabel item tertentu dari isi variabel akan tercermin antara semua merujuk variabel lain bahwa konten sama. Anda dapat

menetapkan variabel rujukan dengan menambahkan sebuah ampersand (&) untuk tanda yang sama. Mari pertimbangkan contoh:

<?php

$value1 = "Hello";

$value2 =& $value1; // $value1 and $value2 both equal "Hello"

$value2 = "Goodbye"; // $value1 and $value2 both equal "Goodbye"

?>

Sebuah alternatif sintaks rujukan-penugasan juga didukung, yang melibatkan menambahkan ampersand ke depan variabel yang direferensikan. Contoh berikut ini mengacu sintaks baru:

<?php

$value1 = "Hello";

$value2 = &$value1; // $value1 and $value2 both equal "Hello"

$value2 = "Goodbye"; // $value1 and $value2 both equal "Goodbye"

?>

Rujukan juga memainkan peran penting dalam kedua fungsi argumen dan mengembalikan nilai, serta dalam pemrograman berorientasi obyek. Bab 4 dan 6 mencakup fitur ini, masing-masing.

Ruang Lingkup Variabel

Bagaimanapun kamu mendeklarasikan variabel Anda (dengan nilai atau dengan acuan), Anda dapat mendeklarasikan mereka di mana saja dalam skrip PHP. Lokasi

deklarasi sangat mempengaruhi wilayah di mana variabel dapat diakses, bagaimanapun. Kemudahan akses domain ini dikenal sebagai ruang lingkup.

Variabel PHP dapat salah satu dari empat jenis lingkup:

• Variabel Lokal

• Parameter Fungsi

• Variabel Global

• Variabel Statis

Variabel Lokal

Suatu variabel dideklarasikan dalam suatu fungsi yang dianggap lokal. Artinya, dapat direferensikan hanya dalam fungsi tersebut. Setiap penugasan di luar fungsi akan dianggap sebagai variabel yang sama sekali berbeda dari yang terkandung dalam fungsi. Perhatikan bahwa ketika Anda keluar dari fungsi di mana suatu variabel lokal telah dideklarasikan, bahwa variabel dan nilai yang sesuai dihancurkan.

Variabel lokal sangat membantu karena mereka menghilangkan kemungkinan efek samping yang tidak terduga, yang dapat mengakibatkan variabel secara global dapat diakses yang diubah sengaja atau tidak. Pertimbangkan properti ini:

$x = 4;

function assignx () {

$x = 0;

printf("\$x inside function is %d <br />", $x);

}

assignx();

printf("\$x outside of function is %d <br />", $x);

Mengeksekusi properti ini menghasilkan sebagai berikut:

Seperti yang anda lihat, dua nilai yang berbeda untuk $x adalah output. Hal ini karena $x terletak di dalam assignx () fungsi lokal. Memodifikasi nilai $x lokal tidak berpengaruh pada semua nilai yang terletak di luar fungsi. Pada catatan yang sama, mengubah $x yang terletak luar fungsi tidak mempunyai pengaruh pada setiap variabel yang terkandung dalam assignx ().

Fungsi Parameter

Seperti pada banyak bahasa pemrograman lain, dalam PHP, setiap fungsi yang menerima argumen harus mendeklarasikan argumen-argumen pada fungsi header. Meskipun argumen-argumen menerima Nilai yang berasal dari luar fungsi, mereka tidak lagi dapat diakses setelah fungsi telah keluar.

■ Catatan Bagian ini hanya berlaku untuk parameter yang dikirimkan oleh nilai dan bukan untuk yang dikirimkan dengan referensi. Parameter yang dikirimkan dengan acuan memang akan terpengaruh dengan segala perubahan yang dibuat terhadap parameter dari dalam fungsi. Jika kamu tidak tahu apa artinya ini, jangan khawatir tentang hal itu karena Bab 4 membahas topik lebih rinci.

Fungsi parameter dideklarasikan setelah nama fungsi dan tanda kurung di dalam. Mereka dideklarasikan lebih seperti variabel yang khas akan menjadi:

// multiply a value by 10 and return it to the caller

function x10 ($value) {

$value = $value * 10;

return $value;

}

Perlu diingat bahwa meskipun kamu dapat mengakses dan memanipulasi setiap fungsi parameter pada fungsi di mana dinyatakan, itu dihancurkan ketika pelaksanaan fungsi berakhir. Anda akan belajar lebih banyak tentang fungsi pada Bab 4.

Variabel Global

Berbeda dengan variabel lokal, variabel global dapat diakses pada setiap bagian dari program tersebut. Untuk memodifikasi variabel global, namun harus secara tegas dinyatakan sebagai global pada fungsi di mana ia harus dimodifikasi. Hal ini dicapai, cukup mudah, dengan menempatkan kata kunci GLOBAL di depan variabel yang harus dikenal sebagai global. Menempatkan kata kunci ini di depan sebuah variabel yang sudah ada memberitahu PHP untuk menggunakan variabel yang mempunyai nama itu. Pertimbangkan contoh:

$somevar = 15;

function addit() {

GLOBAL $somevar;

$somevar++;

echo "Somevar is $somevar";

}

addit();

Nilai yang ditampilkan dari $somevar menjadi 16. Namun, jika Anda adalah untuk menghilangkan garis ini,

GLOBAL $somevar;

variabel $somevar akan diberi nilai 1 karena $somevar maka akan dianggap lokal dalam fungsi addit (). Deklarasi lokal Ini akan secara tersirat diatur ke 0 dan kemudian bertambah 1 untuk menampilkan nilai 1.

Metode alternatif untuk mendeklarasikan variabel untuk menjadi global adalah dengan menggunakan array $GLOBALS PHP. Meninjau ulang contoh sebelumnya, Anda dapat menggunakan array ini untuk mendeklarasikan variabel $somevar menjadi global.

$somevar = 15;

function addit() {

$GLOBALS["somevar"]++;

}

addit();

echo "Somevar is ".$GLOBALS["somevar"];

Ini mengembalikan sebagai berikut:

Apapun metode yang Anda pilih untuk mengubah variabel ke lingkup global, menyadari bahwa lingkup global telah lama menjadi penyebab kesedihan di antara programmer karena hasil yang tidak terduga yang mungkin timbul dari penggunaan sembarangan tersebut. Oleh karena itu, meskipun variabel global dapat sangat berguna, lebih bijaksana ketika menggunakan mereka.

Variabel Static

Tipe terakhir dari pelingkupan variabel untuk mendiskusikan yang dikenal sebagai statis. Berbeda dengan variabel yang dideklarasikan sebagai fungsi parameter, yang dihancurkan pada keluar dari fungsi, sebuah variabel statis tidak kehilangan nilai ketika keluar fungsi dan masih akan memiliki nilai itu jika fungsi ini dipanggil lagi. Anda dapat mendeklarasikan sebuah variabel sebagai statis hanya dengan menempatkan kata kunci STATIS di depan nama variabel:

STATIC $somevar;

Pertimbangkan sebuah contoh:

function keep_track() {

STATIC $count = 0;

$count++;

echo $count;

echo "<br />";

}

keep_track();

keep_track();

keep_track();

Apa yang akan Anda harapkan hasil dari script ini menjadi? Jika variabel $ count tidak ditunjuk untuk statis (sehingga membuat $ count variabel lokal), hasilnya akan sebagai berikut:

Namun, karena $count adalah statis, mempertahankan nilai sebelumnya setiap kali fungsi ini dijalankan. Oleh karena itu, hasilnya adalah sebagai berikut:

Pelingkupan statis ini berguna untuk fungsi algoritma. Fungsi algoritma adalah konsep pemrograman yang kuat di mana fungsi berulang kali menyebut dirinya sendiri sampai kondisi tertentu terpenuhi. Fungsi algoritma dibahas secara rinci dalam Bab 4.

Variabel SuperGlobal PHP

PHP menawarkan sejumlah variabel standar berguna yang dapat diakses dari manapun dalam script yang sedang dijalankan dan memberikan sejumlah besar informasi lingkungan yang spesifik. Anda dapat menyaring variabel ini untuk mengambil rincian tentang session pengguna saat ini, operasi lingkungan pengguna, lingkungan operasi lokal, dan banyak lagi. PHP menciptakan beberapa variabel, sedangkan ketersediaan dan nilai dari banyak variabel lain yang khusus untuk sistem operasi dan Web server. Oleh karena itu, daripada mencoba untuk mengumpulkan daftar lengkap dari semua variabel terdefinisi kemungkinan dan nilai yang mungkin mereka, kode berikut akan menampilkan semua standar variabel yang berkaitan dengan Web server apapun yang diberikan dan script lingkungan eksekusi:

foreach ($_SERVER as $var => $value) {

echo "$var => $value <br />";

}

Ini mengembalikan daftar variabel serupa dengan berikut ini. Luangkan waktu sejenak untuk membaca dengan teliti daftar yang dihasilkan oleh kode ini sebagai dijalankan pada server Windows. Anda akan melihat beberapa variabel ini kembali dalam contoh yang berikut:

Seperti yang Anda lihat, cukup sedikit informasi yang tersedia-beberapa berguna, beberapa tidak begitu berguna. Anda dapat menampilkan hanya salah satu dari variabel ini hanya dengan memperlakukannya sebagai variabel biasa. Misalnya, gunakan ini untuk menampilkan alamat IP pengguna:

printf("Your IP address is: %s", $_SERVER['REMOTE_ADDR']);

Ini mengembalikan alamat IP angka, seperti 192.0.34.166.

Anda juga dapat memperoleh informasi mengenai browser pengguna dan sistem operasi. Pertimbangkan yang berikut-liner:

printf("Your browser is: %s", $_SERVER['HTTP_USER_AGENT']);

Informasi ini mengembalikan sama dengan berikut:

Contoh ini menggambarkan hanya satu dari sembilan variabel array PHP yang telah ditetapkan. Selanjutnya, bagian ini dikhususkan untuk memperkenalkan tujuan dan isi dari masing-masing.

■ Catatan Untuk menggunakan variabel array yang telah ditetapkan, konfigurasi parameter track_vars harus diaktifkan pada file php.ini. Pada PHP 4,03, track_vars selalu diaktifkan.

Belajar Lebih Banyak Tentang Server dan Klien

superglobal $_SERVER berisi informasi yang dibuat oleh server Web dan menawarkan sebuah perkumpulan informasi mengenai konfigurasi server dan klien dan lingkungan permintaan saat ini. Meskipun nilai dan jumlah variabel Ditemukan pada variasi $_SERVER oleh server, Anda biasanya dapat mengharapkan untuk menemukan yang ditetapkan dalam spesifikasi CGI 1.1 (tersedia di Pusat Nasional untuk Aplikasi Superkomputer di http://hoohoo.ncsa.uiuc.edu/cgi/env.html). Anda mungkin akan menemukan semua variabel ini yang akan sangat berguna dalam aplikasi Anda, beberapa yang meliputi:

$_SERVER['HTTP_REFERER']: URL dari halaman yang mengacu pada pengguna ke lokasi saat ini.

$_SERVER['REMOTE_ADDR']: IP address klien

$_SERVER['REQUEST_URI']: Komponen jalur URL. Misalnya, jika URL ini http://www.example.com/blog/apache/index.html, URI adalah / blog / apache / index.html.

$_SERVER['HTTP_USER_AGENT']: Klien agen pengguna, yang biasanya menawarkan informasi tentang kedua sistem operasi dan browser.

Mengambil Variabel Dapat Dilalui Menggunakan GET

$ _GET superglobal berisi informasi yang berhubungan untuk setiap parameter yang dikirimkan dengan menggunakan metode GET. Jika URL http://www.example.com/index.html?cat=apache&id=157 yang diminta, Anda bisa mengakses Variabel berikut dengan menggunakan $ _GET superglobal:

$_GET['cat'] = "apache"

$_GET['id'] = "157"

$ _GET superglobal secara default yang satu-satunya cara yang dapat Anda akses variabel dilewatkan melalui metode GET. Anda tidak bisa mereferensi variabel GET seperti ini: $cat, $id. Lihat Bab 21 untuk lebih lanjut tentang aman mengakses data eksternal.

Mengambil Variabel yang Dapat Dilalui Menggunakan POST

superglobal $_POST berisi informasi yang berhubungan untuk setiap parameter yang dikirimkan dengan metode POST. Pertimbangkan form berikut, yang digunakan untuk mengumpulkan informasi pelanggan:

<form action="subscribe.php" method="post">

<p>

Email address:<br />

<input type="text" name="email" size="20" maxlength="50" value="" />

</p>

<p>

Password:<br />

<input type="password" name="pswd" size="20" maxlength="15" value="" />

</p>

<p>

<input type="submit" name="subscribe" value="subscribe!" />

</p>

</form>

POST variabel berikut ini akan dibuat tersedia melalui target script subscribe.php:

$_POST['email'] = "[email protected]";

$_POST['pswd'] = "rainyday";

$_POST['subscribe'] = "subscribe!";

Seperti $_GET, superglobal $_POST secara default satu-satunya cara untuk mengakses variabel POST. Anda tidak dapat mengacu variabel POST seperti ini: $email, $pswd, dan $subscribe.

Mengambil Penyimpanan Informasi Dalam Cookie

superglobal $ _COOKIE menyimpan informasi dilewatkan ke dalam script melalui HTTP cookies. Cookie tersebut biasanya diatur oleh script PHP yang sebelumnya

dilakukan melalui fungsi PHP setcookie (). Sebagai contoh, misalkan Anda menggunakan setcookie () untuk menyimpan cookie bernama example.com dengan nilai ab2213. Anda kemudian bisa mengambil nilai itu dengan memanggil $_COOKIE ["example.com"]. Bab 18 memperkenalkan kemampuan PHP menangani cookie.

Mengambil Informasi Tentang upload File Menggunakan POST

superglobal $_FILES berisi informasi mengenai data-upload ke server melalui metode POST. Superglobal Ini adalah Agak berbeda dari yang lain pada bahwa itu adalah array dua dimensi yang terdiri dari lima elemen. Subskrip pertama merujuk pada nama dari form upload file elemen form, yang kedua adalah salah satu dari lima subscript standar yang menggambarkan suatu atribut tertentu dari file upload:

$_FILES['upload-name']['name']: Nama file sebagai diupload dari client ke server.

$_FILES['upload-name']['type']: Tipe MIME dari file diupload. Apakah variabel ini diberikan tergantung pada kemampuan browser.

$_FILES['upload-name']['size']: Ukuran byte dari file diupload.

$_FILES['upload-name']['tmp_name']: Setelah diupload, file tersebut akan ditugaskan ke suatu nama sementara sebelum dipindahkan ke lokasi akhir.

$_FILES['upload-name']['error']: status kode upload. Meskipun namanya, variabel ini akan diisi bahkan dalam kasus keberhasilan. Ada lima nilai yang mungkin

• UPLOAD_ERR_OK: File Sukses di upload • UPLOAD_ERR_INI_SIZE: Ukuran file melebihi ukuran maksimum yang

dikenakan oleh direktif upload_max_filesize. • UPLOAD_ERR_FORM_SIZE: Ukuran file melebihi ukuran maksimum yang

dikenakan oleh opsional MAX_FILE_SIZE tersembunyi parameter form field • UPLOAD_ERR_PARTIAL: File hanya sebagian diupload.

• UPLOAD_ERR_NO_FILE: Sebuah file tidak ditentukan pada form upload yang tepat.

Bab 15 dikhususkan untuk pengenalan lengkap fungsi upload-file PHP.

Belajar Lebih Banyak Tentang Lingkungan Sistem Operasi

Superglobal $_ENV menawarkan informasi tentang lingkungan server yang mendasari pengurai PHP. Beberapa variabel yang ditemukan dalam array ini meliputi:

$_ENV['HOSTNAME']: nama host server

$_ENV['SHELL']: system shell

■ Perhatian PHP mendukung dua superglobals lainnya, yaitu $GLOBALS dan $_REQUEST. $ _REQUEST superglobal adalah menangkap-semua berbagai macam, rekaman variabel dilewatkan ke script melalui metode GET, POST, dan Cookie. Urutan variabel ini tidak tergantung pada urutan yang muncul di script pengiriman, tetapi lebih tergantung pada urutan yang ditentukan oleh direktif konfigurasi variables_order. Array superglobal $GLOBALS dapat dianggap sebagai superset superglobal dan berisi daftar lengkap dari semua variabel yang ditemukan dalam lingkup global. Walaupun mungkin menggoda, Anda tidak harus menggunakan superglobals ini sebagai cara mudah untuk menangani variabel karena tidak aman. Lihat Bab 21 untuk penjelasan.

Mengambil Informasi yang tersimpan dalam Session

superglobal $_SESSION berisi informasi tentang semua variabel session. Mendaftarkan informasi session memungkinkan Anda kemudahan dari mengacu ke seluruh seluruh situs Web Anda, tanpa perlu secara eksplisit melewati data

melalui GET atau POST. Bab 18 dikhususkan untuk fitur yang tangguh penanganan-session PHP.

Variabel Variabel

Dalam kesempatan, Anda mungkin ingin menggunakan sebuah variabel yang isinya dapat ditangani secara dinamis sebagai variabel dalam dirinya sendiri. Pertimbangkan tugas variabel yang khas:

$recipe = "spaghetti";

Menariknya, Anda dapat memperlakukan nilai spaghetti sebagai variabel dengan menempatkan tanda dolar kedua di depan nama variabel asli dan lagi memberikan nilai lain:

$$recipe = "& meatballs";

Hal ini pada dasarnya menugaskan & meatballs ke variabel bernama spaghetti.

Oleh karena itu, dua berikut potongan dari kode menghasilkan hasil yang sama:

echo $recipe $spaghetti;

echo $recipe ${$recipe};

Hasil keduanya adalah string spaghetti & meatballs.

Konstan

Sebuah konstanta adalah nilai yang tidak dapat diubah selama eksekusi program. Konstanta sangat berguna ketika bekerja dengan nilai yang pasti tidak akan memerlukan modifikasi, seperti pi (3.141592) atau jumlah kaki dalam satu mil (5280). Setelah konstan telah ditentukan, maka tidak dapat diubah (atau

didefinisikan ulang) pada setiap titik lain dari program tersebut. Konstanta didefinisikan menggunakan fungsi define ().

Mendefinisikan Konstan

fungsi define () mendefinisikan konstan dengan memberikan nilai ke nama. Prototipe nya berikut:

boolean define(string name, mixed value [, bool case_insensitive])

Jika parameter opsional case_insensitive disertakan dan ditugaskan TRUE, referensi setelah konstan akan case sensitive. Perhatikan contoh berikut di mana PI konstanta matematika didefinisikan:

define("PI", 3.141592);

Konstanta selanjutnya digunakan dalam daftar berikut:

printf("The value of pi is %f", PI);

$pi2 = 2 * PI;

printf("Pi doubled equals %f", $pi2);

Kode ini menghasilkan hasil sebagai berikut:

Ada beberapa poin untuk dicatat tentang daftar sebelumnya. Yang pertama adalah bahwa referensi konstan tidak diawali dengan tanda dolar. Yang kedua adalah bahwa Anda tidak bisa mendefinisikan ulang atau tidakmenandai konstanta setelah didefenisikan (misalnya, 2 * PI), jika Anda perlu untuk menghasilkan berdasarkan nilai konstan, nilai tersebut harus disimpan dalam

variabel lain. Akhirnya, konstanta bersifat global, mereka dapat ditunjukkan di mana saja pada script Anda.

Ekspresi

Ekspresi adalah sebuah ungkapan yang mewakili tindakan tertentu dalam sebuah program. Semua ekspresi terdiri dari setidaknya satu operand dan satu atau lebih operator. Beberapa contoh berikut:

$a = 5; // assign integer value 5 to the variable $a

$a = "5"; // assign string value "5" to the variable $a

$sum = 50 + $some_int; // assign sum of 50 + $some_int to $sum

$wine = "Zinfandel"; // assign "Zinfandel" to the variable $wine

$inventory++; // increment the variable $inventory by 1

Operand

Operand adalah input dari sebuah ekspresi. Anda mungkin sudah akrab dengan manipulasi dan penggunaan dari operan yang tidak hanya melalui perhitungan matematika sehari-hari, tetapi juga melalui pengalaman pemrograman sebelumnya. Beberapa contoh dari operan berikut:

$a++; // $a is the operand

$sum = $val1 + val2; // $sum, $val1 and $val2 are operands

Operator

Operator adalah sebuah simbol yang menentukan tindakan tertentu dalam ekspresi. Banyak operator mungkin akan familiar untuk Anda. Apapun, anda

seharusnya ingat bahwa jenis konversi secara otomatis PHP akan mengkonversi jenis berdasarkan tipe operator ditempatkan di antara dua operan, yang tidak selalu terjadi pada bahasa pemrograman lain.

Yang diutamakan dan associativity dari operator adalah karakteristik penting dari sebuah bahasa pemrograman. Kedua konsep diperkenalkan dalam bagian ini. Tabel 3-4 berisi daftar lengkap dari semua operator, dipesan dari yang tertinggi sampai prioritas terendah.

Prioritas Operator

Prioritas Operator merupakan karakteristik dari operator yang menentukan urutan di mana mereka mengevaluasi operan sekitar mereka. PHP mengikuti aturan prioritas standar yang digunakan pada kelas matematika sekolah dasar. Pertimbangkan beberapa contoh:

$total_cost = $cost + $cost * 0.06;

Ini adalah sama seperti penulisan

$total_cost = $cost + ($cost * 0.06);

karena operator perkalian memiliki hak yang lebih tinggi dari operator penambahan.

Operator associativity

Karakteristik associativity dari operator menentukan bagaimana operasi dari prioritas yang sama (yaitu, memiliki nilai prioritas yang sama, seperti ditampilkan pada Tabel 3-3) adalah dievaluasi karena mereka dieksekusi. Associativity dapat dilakukan pada dua arah, kiri ke kanan atau kanan ke kiri. Associativity kiri-ke-kanan berarti bahwa berbagai operasi yang membentuk ekspresi dievaluasi dari kiri ke kanan. Perhatikan contoh berikut:

$value = 3 * 4 * 5 * 7 * 2;

Contoh sebelumnya adalah sama sebagai berikut:

$value = ((((3 * 4) * 5) * 7) * 2);

ekspresi Ini menghasilkan nilai 840 karena operator perkalian (*) adalah asosiatif kiri-ke-kanan.

Sebaliknya, associativity kanan-ke-kiri mengevaluasi operator dari prioritas yang sama dari kanan ke kiri:

$c = 5;

print $value = $a = $b = $c;

Contoh sebelumnya adalah sama sebagai berikut:

$c = 5;

$value = ($a = ($b = $c));

Ketika ekspresi ini dievaluasi, variabel $value, $a, $b, dan $c semua akan berisi nilai 5 karena operator penugasan (=) memiliki associativity kanan-ke-kiri.

Operator Aritmatika

Operator aritmatika ini, tercantum pada Tabel 3-5, melakukan berbagai operasi matematika dan mungkin akan sering digunakan dalam banyak program PHP Anda. Untungnya, mereka mudah untuk digunakan.

Kebetulan, PHP menyediakan beragam luas dari fungsi matematika standar yang mampu melakukan konversi dasar dan menghitung logaritma, akar kuadrat, nilai geometrik, dan banyak lagi. Periksa buku manual untuk daftar terbaru dari fungsi ini.

Operator Penugasan

Operator penugasan menetapkan nilai data ke variabel. Bentuk paling sederhana dari operator penugasan hanya menugaskan beberapa nilai, sementara yang lain (dikenal sebagai operator penugasan shortcut) melakukan beberapa operasi lain sebelum melakukan tugas. Tabel 3-6 daftar contoh menggunakan tipe operator.

Operator String

Operator string PHP (lihat Tabel 3-7) menyediakan cara yang mudah di mana untuk menggabungkan string bersama. Ada dua operator tersebut, termasuk operator penggabungan (.) dan penugasan operator penggabungan (.=) dibahas pada bagian sebelumnya.

■ Catatan Untuk menggabungkan berarti menggabungkan dua atau lebih objek bersama untuk membentuk satu entitas tunggal.

Berikut ini adalah contoh yang melibatkan operator string:

// $a contains the string value "Spaghetti & Meatballs";

$a = "Spaghetti" . "& Meatballs";

$a .= " are delicious."

// $a contains the value "Spaghetti & Meatballs are delicious."

Kedua operator penggabungan hampir tidak sebatas kemampuan penanganan string PHP. Baca Bab 9 untuk akuntansi lengkap fitur penting ini.

Operator Increment dan Decrement

operator Increment (++) dan Decrement (--) tercantum pada Tabel 3-8 menyajikan kemudahan kecil pada hal kejelasan kode, menyediakan dipersingkat berarti dimana Anda dapat menambahkan 1 atau mengurangi 1 dari nilai saat ini dari variabel.

Operator ini dapat ditempatkan pada kedua sisi dari sebuah variabel, dan sisi di mana mereka ditempatkan memberikan efek yang sedikit berbeda. Pertimbangkan hasil dari contoh berikut:

$inv = 15; // Assign integer value 15 to $inv.

$oldInv = $inv--; // Assign $oldInv the value of $inv, then decrement $inv.

$origInv = ++$inv; // Increment $inv, then assign the new $inv value to $origInv.

Seperti yang anda lihat, urutan pada mana operator Increment dan Decrement digunakan memiliki dampak penting pada nilai dari variabel. Meletakkan operan dengan salah satu operator ini dikenal sebagai operasi preinkremen dan predecrement, sementara pasca-penetapan operan dikenal sebagai postincrement dan operasi postdecrement.

Operator Logika

Sama seperti operator aritmatika, operator logika (lihat Tabel 3-9) mungkin akan memainkan peran penting pada banyak aplikasi PHP, menyediakan cara untuk membuat keputusan berdasarkan nilai variabel berganda. Operator logika memungkinkan untuk mengarahkan aliran program dan sering digunakan dengan struktur kontrol, seperti if kondisi dan while dan untuk loop.

Operator Logika juga sering digunakan untuk memberikan rincian tentang hasil dari operasi lainnya, terutama yang mengembalikan nilai:

file_exists("filename.txt") OR echo "File does not exist!";

Salah satu dari dua hasilnya akan muncul:

• terdapat file filename.txt • Kalimat " File does not exist!" akan menjadi output

Operator Kesetaraan

Operator Kesetaraan (lihat Tabel 3-10) digunakan untuk membandingkan dua nilai, pengujian untuk kesetaraan.

Ini adalah kesalahan umum untuk programmer bahkan yang berpengalaman untuk mencoba uji kesetaraan menggunakan hanya satu tanda sama dengan (misalnya, $a = $b). Perlu diingat bahwa ini akan mengakibatkan tugas dari isi $b untuk $a dan tidak akan menghasilkan hasil yang diharapkan.

Perbandingan Operator

Perbandingan operator (lihat Tabel 3-11), seperti operator logika, menyediakan metode untuk aliran program langsung melalui pemeriksaan nilai pembanding dari dua atau lebih variabel.

Catatan bahwa operator perbandingan harus digunakan hanya untuk membandingkan nilai angka. Meskipun Anda mungkin tergoda untuk membandingkan string dengan operator ini, Anda kemungkinan besar tidak sampai pada hasil yang diharapkan jika Anda melakukannya. Ada substansial mengatur fungsi standar yang membandingkan nilai string, yang didiskusikan secara rinci pada Bab 9.

Bitwise Operator

Bitwise operator memeriksa dan memanipulasi nilai integer pada tingkat bit individu yang membentuk nilai integer (demikian nama). Untuk memahami konsep ini, Anda memerlukan setidaknya pengetahuan pengantar representasi biner dari desimal integer. Tabel 3-12 menyajikan beberapa desimal integer dan representasi yang berhubungan biner.

Operator bitwise tercantum pada Tabel 3-13 variasi pada beberapa operator logika tetapi dapat menghasilkan Hasil berbeda secara drastis.

Jika Anda tertarik untuk belajar lebih lanjut tentang pengkodean biner dan operator bitwise dan mengapa mereka penting, lihat referensi besar secara online Randall Hyde, "The Art of Assembly Language programming," tersedia di http://webster.cs.ucr.edu/ .

Interpolasi string

Untuk menawarkan pengembang fleksibilitas maksimal ketika bekerja dengan nilai string, PHP menawarkan cara untuk kedua interpretasi literal dan kiasan. Contoh, perhatikan string berikut:

The $animal jumped over the wall.\n

Anda mungkin menganggap bahwa $animal adalah variabel dan yang \ n adalah karakter baris baru, dan karena itu keduanya harus diartikan yang sesuai. Namun, bagaimana jika Anda ingin output string tepatnya seperti yang tertulis, atau mungkin Anda ingin baris baru yang akan diberikan tetapi menginginkan variabel untuk menampilkan dalam bentuk literal-nya ($ hewan), atau sebaliknya? Semua variasi yang mungkin dalam PHP, tergantung pada bagaimana string ditutup dan

apakah karakter kunci tertentu di-escape melalui urutan yang telah ditetapkan. Topik ini adalah fokus dari bagian ini.

Double Quotes

String diapit tanda kutip ganda adalah yang paling umum digunakan dalam skrip PHP paling karena mereka menawarkan fleksibilitas yang paling tinggi. Hal ini karena kedua variabel dan Mengeluarkan urutan akan diurai yang sesuai. Perhatikan contoh berikut:

<?php

$sport = "boxing";

echo "Jason's favorite sport is $sport.";

?>

Contoh ini mengembalikan sebagai berikut:

Mengeluarkan urutan yang juga dipecah. Pertimbangkan contoh ini:

<?php

$output = "This is one line.\nAnd this is another line.";

echo $output;

?>

Ini mengembalikan sumber berikut dalam browser:

Ada baiknya menegaskan bahwa output ini ditemukan dalam sumber browser bukan di jendela browser. Karakter baris baru mode ini diabaikan oleh jendela browser. Namun, jika Anda melihat sumber, Anda akan melihat bahwa output sebenarnya muncul pada dua baris yang berbeda. Ide yang sama juga berlaku jika data output untuk file teks.

Selain karakter baris baru, PHP mengenal beberapa untuk Mengeluarkan urutan khusus, yang semuanya tercantum dalam Tabel 3-14.

Single Quotes

Melampirkan string dalam tanda kutip tunggal berguna ketika string harus diinterpretasikan tepatnya seperti yang tercantum. Ini berarti bahwa kedua variabel dan keluaran urutan tidak akan diartikan ketika string diuraikan. Contoh, perhatikan single-quote berikut:

print 'This string will $print exactly as it\'s \n declared.';

Ini menghasilkan sebagai berikut:

Perhatikan bahwa single quote yang terletak di dalamnya adalah lolos. Menghilangkan karakter escape backslash akan menghasilkan kesalahan sintaks, kecuali jika direktif konfigurasi magic_quotes_gpc diaktifkan. Pertimbangkan contoh lain:

print 'This is another string.\\';

Pada contoh ini, backslash muncul pada akhir string harus lolos, jika tidak, pengurai PHP akan mengerti bahwa single quote mengikuti adalah untuk diganti. Namun, jika backslash itu untuk muncul di tempat lain dalam string, tidak akan ada perlu melarikan diri itu.

Heredoc

Sintaks Heredoc menawarkan cara yang mudah digunakan untuk keluaran sejumlah besar teks. Daripada pembatasan string dengan tanda kutip ganda atau tunggal, dua pengidentifikasi sama yang dipekerjakan. Sebuah contoh berikut:

<?php

$website = "http://www.romatermini.it";

echo <<<EXCERPT

<p>Rome's central train station, known as <a href = "$website">Roma Termini</a>,

was built in 1867. Because it had fallen into severe disrepair in the late 20th

century, the government knew that considerable resources were required to

rehabilitate the station prior to the 50-year <i>Giubileo</i>.</p>

EXCERPT;

?>

Beberapa hal yang perlu diperhatikan mengenai contoh ini:

• Pengidentifikasi pembukaan dan penutup, dalam kasus contoh ini, EXCERPT, harus sama. Anda dapat memilih identifikasi Anda silahkan, tetapi mereka harus sama. Salah satu Kendalanya identifikasi harus terdiri dari hanya karakter alfanumerik dan garis bawah dan tidak boleh dimulai dengan angka atau garis bawah.

• Identifikasi Pembukaan harus didahului dengan tiga kurung sudut kiri, <<<.

• sintaks Heredoc mengikuti aturan penguraian yang sama sebagai string diapit tanda kutip ganda. Artinya, kedua variabel dan pengeluaran urutan yang diuraikan. Satu-satunya perbedaan adalah tanda kutip ganda tidak membutuhkan di-keluarkan.

• pengidentifikasi penutup harus dimulai pada awal baris. Hal ini tidak bisa diawali dengan spasi atau karakter asing lainnya. Ini adalah titik biasanya berulang kebingungan di kalangan pengguna, jadi berhati-hati untuk memastikan string heredoc Anda sesuai dengan persyaratan ini menjengkelkan. Selanjutnya, keberadaan dari setiap ruang mengikuti pembukaan atau penutup identifikasi akan menghasilkan kesalahan sintaks.

Sintaks Heredoc sangat berguna ketika Anda perlu memanipulasi sejumlah besar bahan tetapi tidak ingin memasang dengan kerumitan dari menggunakan tanda kutip.

Struktur Kontrol

Struktur Kontrol menentukan aliran kode dalam aplikasi, mendefinisikan karakteristik eksekusi seperti apakah dan berapa kali suatu pernyataan kode tertentu akan mengeksekusi, serta ketika sebuah blok kode akan menyerahkan kontrol eksekusi. Struktur ini juga menawarkan cara sederhana untuk memperkenalkan bagian yang sama sekali baru dari kode (melalui pernyataan masuknya file) menjadi Script yang sedang dijalankan. Pada bagian ini Anda akan mempelajari tentang semua struktur kontrol tersebut yang tersedia untuk bahasa PHP.

Pernyataan kondisional

Pernyataan kondisional memungkinkan program komputer anda untuk merespon sesuai dengan berbagai input, menggunakan logika untuk membedakan antara berbagai kondisi berdasarkan nilai input. Fungsi ini sangat dasar untuk pembuatan perangkat lunak komputer yang seharusnya tidak mengejutkan bahwa berbagai pernyataan kondisional adalah pokok dari semua bahasa pemrograman utama, PHP disertakan.

Pernyataan if

Pernyataan if adalah salah satu yang paling umum membangun dari setiap bahasa pemrograman utama, menawarkan cara yang mudah untuk eksekusi kode kondisional. Berikut ini adalah sintaks:

if (expression) {

statement

}

Sebagai contoh, misalkan Anda ingin pesan ucapan selamat ditampilkan jika pengguna menduga nomor rahasia yang telah ditetapkan:

<?php

$secretNumber = 453;

if ($_POST['guess'] == $secretNumber) {

echo "<p>Congratulations!</p>";

}

?>

putus asa pemalas dapat melupakan penggunaan tanda kurung kurawal saat tubuh kondisional hanya terdiri dari pernyataan tunggal. Berikut adalah revisi dari contoh sebelumnya:

<?php

$secretNumber = 453;

if ($_POST['guess'] == $secretNumber) echo "<p>Congratulations!</p>";

?>

■ Catatan Alternatif sintaks penutup tersedia untuk if, while, foreach, for, dan struktur kontrol switch. Ini melibatkan penggantian pembukaan braket dengan tanda titik dua (:) dan menggantikan penutupan braket dengan endif;, endwhile;, endfor;, endforeach;, dan endswitch;, masing-masing. Ada diskusi mengenai mencela sintaks ini di masa mendatang, meskipun kemungkinan akan tetap berlaku untuk masa mendatang.

Pernyataan else

Masalah dengan contoh sebelumnya adalah output yang hanya ditawarkan bagi pengguna yang menduga nomor rahasia. Semua pengguna lain yang tersisa kekurangan, benar-benar dilecehkan karena sebab mungkin berkaitan dengan kurangnya kekuatan psikis. Bagaimana jika Anda ingin memberikan tanggapan yang disesuaikan tidak peduli hasilnya? Untuk melakukannya Anda akan perlu cara untuk menangani mereka yang tidak bertemu tersebut dengan persyaratan kondisional if, fungsi dgn mudah ditawarkan dengan cara pernyataan else. Berikut revisi dari contoh sebelumnya, kali ini menawarkan respon dalam kedua kasus:

<?php

$secretNumber = 453;

if ($_POST['guess'] == $secretNumber) {

echo "<p>Congratulations!!</p>";

} else {

echo "<p>Sorry!</p>";

}

?>

Seperti if, bracket pernyataan else dapat diabaikan jika hanya pernyataan kode tunggal tertutup.

Pernyataan elseif

Kombinasi if-else bekerja dengan baik dalam "salah satu-atau" situasi-yaitu, situasi di mana hanya dua hasil yang mungkin tersedia. Tapi bagaimana jika beberapa hasilnya kemungkinan? Anda akan membutuhkan cara untuk mempertimbangkan setiap hasil yang mungkin, yang dicapai dengan pernyataan elseif. Mari kita merevisi contoh rahasia-nomor lagi, kali ini menawarkan pesan jika menebak pengguna relatif menutup (dalam sepuluh) nomor rahasia:

<?php

$secretNumber = 453;

$_POST['guess'] = 442;

if ($_POST['guess'] == $secretNumber) {

echo "<p>Congratulations!</p>";

} elseif (abs ($_POST['guess'] - $secretNumber) < 10) {

echo "<p>You're getting close!</p>";

} else {

echo "<p>Sorry!</p>";

}

?>

Seperti semua conditional, elseif mendukung penghapusan tanda kurung ketika hanya sebuah pernyataan tunggal tertutup.

Pernyataan Switch

Anda dapat berpikir dari pernyataan switch sebagai variasi dari kombinasi if-else, sering digunakan saat Anda perlu membandingkan variabel terhadap sejumlah besar nilai:

<?php

switch($category) {

case "news":

echo "<p>What's happening around the world</p>";

break;

case "weather":

echo "<p>Your weekly forecast</p>";

break;

case "sports":

echo "<p>Latest sports highlights</p>";

break;

default:

echo "<p>Welcome to my Web site</p>";

}

?>

Catatan adanya pernyataan break pada akhir setiap blok kasus. Jika pernyataan break tidak ada, semua kasus blok berikutnya akan mengeksekusi sampai sebuah pernyataan break berada. Sebagai ilustrasi perilaku ini, mari kita asumsikan

bahwa pernyataan break dihilangkan dari contoh sebelumnya dan bahwa $kategori diatur ke cuaca. Anda akan mendapatkan hasil sebagai berikut:

Pernyataan Looping

Meskipun variasi pendekatan tersedia, statemen looping adalah perlengkapan dalam setiap bahasa pemrograman yang luas. Hal tidak mengejutkan karena mekanisme looping menawarkan cara sederhana untuk menyelesaikan tugas yang umum dalam pemrograman: mengulang urutan dari instruksi sampai kondisi tertentu dipenuhi. PHP menawarkan beberapa seperti mekanisme, tidak ada yang harus mengejutkan jika Anda terbiasa dengan bahasa pemrograman lain.

Pernyataan While

Pernyataan while menetapkan suatu kondisi yang harus dipenuhi sebelum eksekusi dari kode yang tertanam diakhiri. Sintaks-nya adalah sebagai berikut:

while (expression) {

statements

}

Pada contoh berikut, $count adalah diinisialisasi dengan nilai 1. Nilai dari $count kemudian kuadrat dan output. Variabel $ count kemudian bertambah 1, dan loop diulang sampai nilai dari $count mencapai 5.

<?php

$count = 1;

while ($count < 5) {

printf("%d squared = %d <br />", $count, pow($count, 2));

$count++;

}

?>

Output terlihat seperti ini :

Seperti semua struktur kontrol lainnya, ekspresi kondisional ganda mungkin juga tertanam ke dalam pernyataan while. Sebagai contoh, berikut ini blok while mengevaluasi salah satu sampai mencapai end-of-file atau sampai lima baris yang sudah dibaca dan output:

<?php

$linecount = 1;

$fh = fopen("sports.txt","r");

while (!feof($fh) && $linecount<=5) {

$line = fgets($fh, 4096);

echo $line. "<br />";

$linecount++;

}

?>

Dengan adanya conditional, maksimum lima baris akan menjadi output dari file sports.txt, terlepas dari ukurannya.

do...while Statement

pernyataan perulangan Do ... while adalah varian sedangkan do while itu memverifikasi kondisional loop pada akhir blok, bukan pada awal. Berikut ini adalah sintaks:

do {

statements

} while (expression);

Baik while dan do ... while adalah fungsi yang sama. Satu-satunya perbedaan yang nyata adalah bahwa kode tertanam dalam pernyataan while mungkin tidak akan pernah bisa dijalankan, sedangkan kode yang tertanam dalam pernyataan do... while selalu akan mengeksekusi setidaknya sekali. Perhatikan contoh berikut:

<?php

$count = 11;

do {

printf("%d squared = %d <br />", $count, pow($count, 2));

} while ($count < 10);

?>

Berikut ini adalah hasilnya:

Meskipun kenyataan bahwa 11 di luar batas dari kondisional while, kode tertanam akan mengeksekusi sekali karena kondisional tidak dievaluasi sampai dengan kesimpulan.

Pernyataan For

Pernyataan For menawarkan mekanisme looping agak lebih kompleks daripada while. Berikut ini adalah sintaks:

for (expression1; expression2; expression3) {

statements

}

Ada beberapa aturan yang perlu diingat ketika menggunakan for loop PHP:

• Ekspresi pertama, expression1, dievaluasi secara default pada perulangan pertama dari loop.

• Ekspresi kedua, expression2, dievaluasi pada awal setiap iterasi. Ekspresi ini menentukan apakah looping akan terus berlanjut.

• Ekspresi ketiga, expression3, dievaluasi di akhir setiap loop. • Salah satu ekspresi boleh kosong, tujuannya digantikan dengan logika yang

tertanam di dalam blok for.

Dengan adanya aturan dalam pikiran, pertimbangkan contoh berikut, yang semuanya menampilkan sebagian kilometer/mil kesetaraan grafik:

// Example One

for ($kilometers = 1; $kilometers <= 5; $kilometers++) {

printf("%d kilometers = %f miles <br />", $kilometers, $kilometers*0.62140);

}

// Example Two

for ($kilometers = 1; ; $kilometers++) {

if ($kilometers > 5) break;

printf("%d kilometers = %f miles <br />", $kilometers, $kilometers*0.62140);

}

// Example Three

$kilometers = 1;

for (;;) {

// if $kilometers > 5 break out of the for loop.

if ($kilometers > 5) break;

printf("%d kilometers = %f miles <br />", $kilometers, $kilometers*0.62140);

$kilometers++;

}

Hasil untuk ketiga contoh berikut:

Pernyataan foreach

perulangan foreach membangun sintaks yang ahli dalam perulangan melalui array, menariknya setiap tombol / pasangan nilai dari array sampai semua item ini

diambil atau beberapa lainnya kondisional internal telah dipenuhi. Dua variasi sintaks yang tersedia, masing-masing disajikan dengan sebuah contoh.

Variasi Sintaks potongan pertama setiap nilai dari array, memindahkan penunjuk lebih dekat ke akhir dengan perulangan masing-masing. Berikut ini adalah sintaks:

foreach (array_expr as $value) {

statement

}

Pertimbangkan contoh ini. Misalnya anda ingin output array link:

<?php

$links = array("www.apress.com","www.php.net","www.apache.org");

echo "<b>Online Resources</b>:<br />";

foreach($links as $link) {

echo "<a href=\"http://$link\">$link</a><br />";

}

?>

Hal ini akan menghasilkan sebagai berikut:

Variasi kedua adalah sangat cocok untuk bekerja dengan kedua kunci dan nilai array. Sintaks berikut:

foreach (array_expr as $key => $value) {

statement

}

Merevisi contoh sebelumnya, anggaplah bahwa array $links berisi link dan judul link yang sesuai:

$links = array("The Apache Web Server" => "www.apache.org",

"Apress" => "www.apress.com",

"The PHP Scripting Language" => "www.php.net");

Setiap item array terdiri dari kedua kunci dan nilai yang sesuai. Pernyataan foreach dapat dengan mudah mengupas setiap tombol / pasangan nilai dari array, seperti ini:

echo "<b>Online Resources</b>:<br />";

foreach($links as $title => $link) {

echo "<a href=\"http://$link\">$title</a><br />";

}

Hasilnya adalah bahwa setiap link tertanam dengan judul masing-masing, seperti ini:

Ada variasi lain pada metode pengambilan kunci / nilai, yang semuanya diperkenalkan pada Bab 5.

Pernyataan break and goto

Menghadapi pernyataan break akan segera berakhir pelaksanaan do ... while, for, foreach, switch, atau while blok. Sebagai contoh, berikut untuk loop yang akan berakhir jika bilangan prima adalah palsu-acak yang terjadi pada:

<?php

$primes = array(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47);

for($count = 1; $count++; $count < 1000) {

$randomNumber = rand(1,50);

if (in_array($randomNumber,$primes)) {

break;

} else {

printf("Non-prime number found: %d <br />", $randomNumber);

}

}

?>

Contoh output berikut:

Melalui penambahan pernyataan goto, fitur ini telah diperluas pada PHP 6 untuk mendukung label. Ini berarti Anda dapat bisa melompat ke lokasi tertentu di luar suatu perulangan atau pembangunan kondisional. Sebuah contoh berikut:

<?php

for ($count = 0; $count < 10; $count++)

{

$randomNumber = rand(1,50);

if ($randomNumber < 10)

goto less;

else

echo "Number greater than 10: $randomNumber<br />";

}

less:

echo "Number less than 10: $randomNumber<br />";

?>

Ini menghasilkan sebagai berikut (output Anda akan bervariasi):

Pernyataan Continue

pernyataan continue menyebabkan eksekusi iterasi pengulangan saat ini untuk mengakhiri dan memulai pada awal perulangan berikutnya. Sebagai contoh, pelaksanaan berikut saat body akan memulai kembali jika $ username [$ x] adalah ditemukan memiliki nilai yang hilang:

<?php

$usernames = array("grace","doris","gary","nate","missing","tom");

for ($x=0; $x < count($usernames); $x++) {

if ($usernames[$x] == "missing") continue;

printf("Staff member: %s <br />", $usernames[$x]);

}

?>

Hal ini menghasilkan output sebagai berikut:

Pernyataan Pencantuman File

Programmer yang Efisien selalu berpikir dalam hal memastikan bisa dipakai ulang dan modular. Cara paling umum untuk memastikan tersebut adalah dengan memisahkan komponen fungsional ke file terpisah dan kemudian menyusun kembali file-file yang diperlukan. PHP menawarkan empat pernyataan untuk

memasukkan file tersebut ke dalam aplikasi, masing-masing diperkenalkan pada bagian ini.

Pernyataan include ()

pernyataan include () akan mengevaluasi dan menyertakan file ke lokasi di mana itu disebut. Memasukkan file menghasilkan hasil yang sama seperti menyalin data dari file tertentu ke lokasi di mana pernyataan tersebut muncul. Prototipe nya berikut:

include(/path/to/filename)

Seperti pernyataan print dan echo, Anda memiliki pilihan untuk menghilangkan tanda kurung saat menggunakan include (). Sebagai contoh, jika Anda ingin menyertakan serangkaian fungsi standar dan variabel konfigurasi, Anda bisa menempatkan mereka ke dalam sebuah file terpisah (dipanggil init.inc.php , misalnya), dan kemudian include file berada di atas setiap Script PHP, seperti ini:

<?php

include "/usr/local/lib/php/wjgilmore/init.inc.php";

/* the script continues here */

?>

Anda juga dapat mengeksekusi pernyataan kondisional include (). Sebagai contoh, jika pernyataan include () ditempatkan dalam sebuah pernyataan jika, file akan disertakan hanya if pernyataan if di mana ia terlampir bernilai true. Salah satu kekhasan tentang penggunaan include () dalam sebuah kondisional adalah bahwa harus diapit pada pernyataan blok tanda kurung kurawal atau dalam alternatif pernyataan penutup. Pertimbangkan perbedaan sintaks antara kedua potongan kode berikut. Yang pertama menyajikan kesalahan menggunakan pernyataan kondisional include () karena kurangnya penutup blok yang benar:

<?php

if (expression)

include ('filename');

else

include ('another_filename');

?>

Potongan berikutnya menyajikan penggunaan yang benar dari pernyataan kondisional include () dengan menyertakan blok dalam kurung kurawal:

<?php

if (expression) {

include ('filename');

} else {

include ('another_filename');

}

?>

Salah satu kesalahpahaman tentang pernyataan include () adalah keyakinan bahwa karena kode termasuk akan menjadi tertanam pada blok eksekusi PHP, tag lepas PHP tidak diperlukan. Namun, hal ini tidak begitu; pembatas harus selalu disertakan. Karena itu, Anda tidak bisa begitu saja menempatkan perintah PHP dalam file dan berharap untuk mengurai dengan benar,seperti yang ditemukan di sini:

echo "this is an invalid include file";

Sebaliknya, pernyataan PHP harus diapit dengan tag lepas yang benar, seperti yang ditunjukkan di sini:

<?php

echo "this is an invalid include file";

?>

■ Tip Setiap kode ditemukan dalam sebuah file yang disertakan akan mewarisi lingkup variabel lokasi dari pemanggil tersebut.

Menariknya, semua pernyataan include () mendukung dimasukkannya file yang berada pada remote server dengan prakata include () argumen dengan URL yang didukung. Jika server tinggal PHP-diaktifkan, setiap variabel yang ditemukan dalam file yang disertakan bisa diurai dengan melewatkan kunci yang diperlukan / pasangan nilai seperti yang akan dilakukan dalam permintaan GET, seperti ini:

include "http://www.wjgilmore.com/index.html?background=blue";

Dua persyaratan harus dipenuhi sebelum masuknya remote file yang dimungkinkan. Pertama, direktif konfigurasi allow_url_fopen harus diaktifkan. Kedua, wrapper URL yang harus didukung. Persyaratan terakhir ini dibahas lebih lanjut dalam Bab 16.

Memastikan File Apakah Termasuk Hanya Sekali

fungsi include_once () memiliki tujuan yang sama dengan include () kecuali yang pertama kali memeriksa apakah file tersebut telah disertakan. Prototipe nya sebagai berikut:

include_once (filename)

Jika sebuah file sudah dimasukkan, include_once () tidak akan mengeksekusi. Sebaliknya, itu akan menyertakan file yang diperlukan. Selain perbedaan ini, include_once () beroperasi dengan cara yang persis sama dengan include ().

Kekhasan yang sama berkaitan dengan melampirkan include () dalam pernyataan kondisional juga berlaku untuk include_once ().

Memerlukan File

Untuk sebagian besar, require () beroperasi seperti include (), termasuk template ke dalam file di mana memanggil require () yang terletak. Prototipe nya berikut:

require (filename)

Namun, ada dua perbedaan penting antara require () dan include (). Pertama, file akan dimasukkan dalam script di mana require () membangun muncul, terlepas dari mana require () ini terletak. Sebagai contoh, jika require () ditempatkan dalam sebuah pernyataan if yang false, file akan dimasukkan pula.

■ Tip URL dapat digunakan dengan require() jika allow_url_fopen diaktifkan, yang secara default itu.

kedua Perbedaan yang penting adalah eksekusi script akan berhenti jika require () gagal, padahal mungkin terus dalam kasus sebuah include (). Satu kemungkinan penjelasan untuk kegagalan pernyataan require () adalah jalan target kesalahan yang dirujuk.

Memastikan File Apakah Diperlukan Hanya Sekali

Sebagai situs Anda berkembang, Anda dapat menemukan sendiri secara berlebihan meliputi file tertentu. Meskipun ini mungkin tidak selalu menjadi

masalah, terkadang Anda tidak ingin variabel diubah dalam file yang disertakan untuk ditimpa dengan masuknya dari file yang sama. masalah Lain yang timbul adalah berbenturan dari nama fungsi seharusnya mereka ada dalam file penyertaan. Anda dapat memecahkan masalah ini dengan fungsi require_once (). Prototipe nya sebagai berikut:

require_once (filename)

fungsi require_once () memastikan bahwa penyertaan file disertakan hanya sekali dalam script anda. Setelah require_once () ditemui, setiap upaya berikutnya untuk menyertakan file yang sama akan diabaikan.

Di samping prosedur verifikasi dari require_once (), semua aspek lain dari fungsi ini adalah sama seperti untuk require ().

Ringkasan

Meskipun materi yang disajikan di sini tidak begitu mewah sebagai bahan pada bab berikutnya, ini sangat berharga untuk kesuksesan Anda sebagai programmer PHP karena semua fungsi berikutnya didasarkan pada pembangunan blok-blok. Ini akan segera menjadi jelas.

Bab berikutnya adalah dikhususkan untuk pembangunan dan pemanggilan fungsi, penggunaan ulang dari potongan kode yang ditujukan untuk melakukan tugas tertentu. Materi ini dimulai Anda menyusuri path yang diperlukan untuk mulai membangun modular, aplikasi PHP yang dapat digunakan kembali.

■ ■ ■

CHAPTER 4

Functions

Pemrograman komputer yang ada dalam rangka untuk mengotomatisasi segala macam tugas, dari penghitungan pembayaran hak tanggungan untuk menentukan seseorang setiap hari merekomendasikan asupan kalori. Namun, sebagai tugas ini tumbuh semakin kompleks, Anda akan sering menemukan mereka meliputi tugas yang sering berulang lainnya. Sebagai contoh, sebuah aplikasi e-commerce mungkin perlu memvalidasi alamat e-mail pada halaman yang berbeda, seperti ketika seorang pengguna baru mendaftar untuk menggunakan situs Web, ketika seseorang ingin menambahkan review produk, atau ketika pengunjung mendaftar untuk berlangganan berita. Ekspresi reguler digunakan untuk memvalidasi alamat e-mail yang cukup kompleks, oleh karena itu akan menjadi cocok untuk memeliharanya dalam satu lokasi daripada menanamkan ke banyak halaman, terutama jika perlu dimodifikasi dengan account untuk domain baru (seperti. museum).

Syukurlah, konsep dari mewujudkan proses berulang-ulang dalam bagian bernama dari kode dan kemudian memanggil nama ini saat diperlukan telah lama menjadi komponen kunci bahasa komputer modern. Seperti bagian dari kode yang dikenal sebagai fungsi, dan memberi Anda kemudahan dari point tunggal acuan jika Proses ini mendefinisikan memerlukan perubahan di masa depan, yang sangat mengurangi kedua kemungkinan kesalahan pemrograman dan overhead perawatan. Dalam bab ini, Anda akan mempelajari semua tentang fungsi PHP, termasuk cara membuat dan memanggil mereka, melewati input untuk mereka, mengembalikan kedua nilai tunggal dan ganda ke pemanggil, serta membuat dan meliputi fungsi perpustakaan. Selain itu, Anda akan belajar tentang kedua fungsi rekursif dan variabel.

Menjalankan sebuah Fungsi

Lebih dari 1.000 fungsi dibangun ke dalam distribusi standar PHP, banyak dari Anda akan lihat di seluruh buku ini. Anda dapat memanggil fungsi yang Anda inginkan hanya dengan menentukan nama fungsi, dengan asumsi bahwa fungsi telah dibuat tersedia secara baik melalui kompilasi library ke dalam distribusi diinstal atau melalui include pernyataan () atau require (). Misalnya, Anda ingin meningkatkan lima hingga ketiga kekuasaan. Anda bisa memanggil fungsi PHP pow () seperti ini:

<?php

$value = pow(5,3); // returns 125

echo $value;

?>

Jika Anda ingin menampilkan hasil fungsi, Anda dapat melewati memberikan nilai ke variabel, seperti ini:

<?php

echo pow(5,3);

?>

Jika Anda ingin menampilkan hasil fungsi dalam string yang lebih besar, Anda perlu menggabungkannya seperti ini:

echo "Five raised to the third power equals ".pow(5,3).".";

Atau mungkin lebih tegas mengungkapkan, anda dapat menggunakan printf ():

printf("Five raised to the third power equals %d.", pow(5,3));

Pada kedua kasus tersebut, output berikut dikembalikan:

■ Tip Anda dapat menelusuri daftar fungsi besar PHP dengan mengunjungi situs resmi PHP di http://www.php.net/ dan membaca dengan teliti dokumentasi. Di sana Anda akan menemukan tidak hanya definisi dan contoh untuk setiap fungsi yang diuraikan oleh Library, tetapi komentar pembaca berkaitan dengan penggunaan mereka. Jika Anda mengetahui nama fungsi sebelumnya, Anda bisa langsung ke halaman fungsi dengan menambahkan nama fungsi ke dalam akhir URL. Sebagai contoh, jika Anda ingin mempelajari lebih lanjut tentang fungsi pow (), pergi ke http://www.php.net/pow.

Meskipun PHP sangat luas berbagai macam dari fungsi library adalah manfaat yang luar biasa untuk siapa pun berusaha menghindari menciptakan kembali kemudi programatis, cepat atau lambat Anda perlu melampaui apa yang ditawarkan dalam distribusi standar, yang berarti Anda harus membuat fungsi kustom atau bahkan seluruh fungsi perpustakaan. Untuk melakukannya, Anda harus mendefinisikan fungsi menggunakan template yang telah ditetapkan, seperti:

function functionName(parameters)

{

function-body

}

Contoh, perhatikan fungsi berikut, generateFooter(), dimana output halaman footer:

function generateFooter()

{

echo "Copyright 2007 W. Jason Gilmore";

}

Setelah didefinisikan, Anda dapat memanggil fungsi ini seperti:

<?php

generateFooter();

?>

Ini menghasilkan hasil sebagai berikut:

Melewati Argumen menurut Nilai

Anda akan sering menemukan itu berguna untuk melewatkan data ke dalam suatu fungsi. Sebagai contoh, mari kita membuat suatu fungsi yang menghitung total biaya suatu barang dengan menentukan pajak penjualan dan kemudian menambahkan jumlah itu untuk harga:

function calcSalesTax($price, $tax)

{

$total = $price + ($price * $tax);

echo "Total cost: $total";

}

Fungsi ini menerima dua parameter, secara tepat bernama $price dan $tax, yang digunakan dalam perhitungan. Walaupun parameter ini dimaksudkan untuk menjadi poin mengambang, karena mengetik lemah PHP, tidak mencegah Anda melewati pada variabel dari setiap tipe data, tapi hasilnya mungkin tidak akan apa yang Anda harapkan. Selain itu, Anda diperbolehkan untuk mendefinisikan sedikit atau banyak parameter yang Anda anggap perlu, tidak ada bahasa dikenakan kendala dalam hal ini.

Setelah didefinisikan, Anda kemudian dapat memanggil fungsi seperti yang ditunjukkan di bagian sebelumnya. Sebagai contoh, fungsi calcSalesTax () akan dipanggil seperti:

calcSalesTax(15.00, .075);

Tentu saja, Anda tidak terikat untuk mengirimkan nilai statis ke fungsi. Anda juga bisa mengirimkan variabel seperti ini:

<?php

$pricetag = 15.00;

$salestax = .075;

calcSalesTax($pricetag, $salestax);

?>

Saat Anda melewatkan argumen dengan cara ini, ini dipanggil melewati nilai. Ini berarti bahwa setiap perubahan yang dibuat terhadap nilai dalam ruang lingkup fungsi diabaikan di luar fungsi. Jika Anda ingin perubahan ini akan disajikan di luar lingkup fungsi, Anda dapat melewatkan argumen dengan rujukan, diperkenalkan berikutnya.

■ Catatan Anda tidak perlu perlu mendefinisikan fungsi sebelum ini dipanggil karena PHP membaca semua script ke dalam mesin sebelum eksekusi. Oleh karena itu, Anda sebenarnya bisa memanggil calcSalesTax () sebelum itu didefinisikan, meskipun praktik sembrono seperti itu tidak dianjurkan.

Melewati Argumen dengan Rujukan

Pada kesempatan, Anda mungkin ingin perubahan yang dibuat pada argumen dalam fungsi disajikan di luar lingkup function. Melewati argumen dengan acuan menyelesaikan hal ini. Melewati sebuah argumen dengan acuan dilakukan dengan menambahkan ampersand(&) untuk bagian depan argumen. Sebuah contoh sebagai berikut:

<?php

$cost = 20.99;

$tax = 0.0575;

function calculateCost(&$cost, $tax)

{

// Modify the $cost variable

$cost = $cost + ($cost * $tax);

// Perform some random change to the $tax variable.

$tax += 4;

}

calculateCost($cost, $tax);

printf("Tax is %01.2f%% <br />", $tax*100);

printf("Cost is: $%01.2f", $cost);

?>

Berikut hasilnya:

Perhatikan nilai $tax tetap sama, meskipun $cost telah berubah.

Default Nilai Argumen

Nilai Default dapat ditugaskan untuk argumen input, yang akan secara otomatis ditetapkan ke argumen jika tidak ada nilai lainnya yang disediakan. Untuk merevisi contoh pajak penjualan, misalkan bahwa mayoritas penjualan Anda adalah untuk mengambil tempat di Franklin County, Ohio. Anda kemudian dapat menetapkan $tax nilai default sebesar 6,75 persen, seperti hal ini:

function calcSalesTax($price, $tax=.0675)

{

$total = $price + ($price * $tax);

echo "Total cost: $total";

}

Anda masih dapat melewati $tax tarif perpajakan lain; 6,75 persen yang akan digunakan jika calcSalesTax () dipanggil, seperti hal ini:

$price = 15.47;

calcSalesTax($price);

Nilai argumen Default harus tampak pada akhir daftar parameter dan harus di ekspresi yang konstan, Anda tidak bisa memberikan nilai nonconstant seperti panggilan fungsi atau variabel.

Anda dapat menetapkan argumen tertentu sebagai pilihan dengan menempatkan mereka pada akhir daftar dan menempatkan mereka nilai default yang tidak ada, seperti:

function calcSalesTax($price, $tax="")

{

$total = $price + ($price * $tax);

echo "Total cost: $total";

}

Hal ini memungkinkan Anda untuk memanggil calcSalesTax () tanpa parameter kedua jika tidak ada pajak penjualan:

calcSalesTax(42.00);

Ini mengembalikan output sebagai berikut:

Jika argumen pilihan berganda ditentukan, Anda selektif dapat memilih yang mana yang diteruskan. Pertimbangkan contoh ini:

function calculate($price, $price2="", $price3="")

{

echo $price + $price2 + $price3;

}

Anda kemudian dapat memanggil calculate() , melalui parameter $price dan $price3, seperti:

calculate(10, "", 3);

Ini mengembalikan nilai berikut:

Mengembalikan Nilai dari Fungsi

Seringkali, hanya bergantung pada fungsi untuk melakukan sesuatu adalah kurang baik, hasil script yang mungkin bergantung pada hasil fungsi, atau perubahan pada data yang dihasilkan dari pelaksanaannya. Namun lingkup variabel mencegah informasi dengan mudah melewatkan dari fungsi tubuh belakang untuk pemanggil tersebut; jadi bagaimana kita bisa menyelesaikan ini? Anda dapat melewatkan data belakang untuk pemanggil dengan cara pernyataan return ().

Pernyataan return ()

Pernyataan return() mengembalikan setiap nilai berikutnya belakang untuk pemanggil fungsi, mengembalikan kontrol program belakang untuk lingkup pemanggil dalam proses tersebut. Jika return () dipanggil dari dalam lingkup global, eksekusi skrip dihentikan. Merevisi lagi fungsi calcSalestax (), misalkan anda tidak ingin langsung echo total penjualan belakang ke pengguna pada saat perhitungan, tetapi ingin mengembalikan nilai untuk memanggil blok:

function calcSalesTax($price, $tax=.0675)

{

$total = $price + ($price * $tax);

return $total;

}

Sebagai alternatif, Anda bisa mengembalikan perhitungan secara langsung tanpa menugaskan $total, seperti ini:

function calcSalesTax($price, $tax=.0675)

{

return $price + ($price * $tax);

}

Berikut contoh bagaimana Anda akan memanggil fungsi ini:

<?php

$price = 6.99;

$total = calcSalesTax($price);

?>

Mengembalikan Nilai ganda

Ini sering mudah dicapai untuk mengembalikan banyak nilai dari suatu fungsi. Sebagai contoh, misalkan Anda ingin membuat suatu fungsi yang mengambil data user dari database , katakan nama pengguna, alamat e-mail, dan nomor telepon, dan mengembalikannya ke pemanggil. Mencapai ini jauh lebih mudah daripada Anda mungkin berpikir, dengan bantuan bahasa yang sangat berguna menyusun, list (). Penggunaan list() menawarkan cara yang mudah digunakan untuk mengambil nilai dari sebuah array, seperti:

<?php

$colors = array("red","blue","green");

list($red, $blue, $green) = $colors;

?>

Setelah penggunaan list() mengeksekusi, $red, $blue, dan $green yang akan ditugaskan merah, biru, dan hijau, masing-masing.

Membangun konsep yang ditunjukkan pada contoh sebelumnya, Anda dapat membayangkan bagaimana tiga nilai persyaratan yang mungkin dikembalikan dari menggunakan fungsi list():

<?php

function retrieveUserProfile()

{

$user[] = "Jason";

$user[] = "[email protected]";

$user[] = "English";

return $user;

}

list($name, $email, $language) = retrieveUserProfile();

echo "Name: $name, email: $email, language: $language";

?>

Mengeksekusi script ini mengembalikan sebagai berikut:

Fitur ini cukup berguna dan akan digunakan berulang kali dalam buku ini

Fungsi algoritma

Fungsi algoritma, atau fungsi yang memanggil diri mereka, menawarkan nilai praktis yang cukup untuk programmer dan digunakan untuk membagi masalah yang kompleks menjadi kasus sederhana, menegaskan hal itu hingga masalah teratasi.

Hampir setiap contoh rekursi perkenalan melibatkan perhitungan faktorial. Mari kita lakukan sesuatu yang lebih praktis dan membuat kalkulator pembayaran pinjaman. Secara khusus, contoh berikut menggunakan rekursi untuk membuat jadwal pembayaran, memberitahu Anda jumlah pokok dan bunga yang diperlukan setiap pembayaran angsuran untuk melunasi pinjaman. Fungsi rekursif, amortizationTable (), diperkenalkan pada daftar 4-1. Yang diperlukan sebagai input empat argumen: $pNum, yang menunjukkan jumlah pembayaran; $ periodicPayment, yang mengusung total pembayaran bulanan; $balance, yang menandakan saldo pinjaman yang tersisa, dan $monthlyInterest, yang menentukan tingkat bunga persentase per bulan. Isi ini ditunjuk atau ditentukan pada skrip yang tercantum pada Listing 4-2. Listing 4-1. Fungsi Kalkulator Pembayaran, amortizationTable ().

<?php

function amortizationTable($pNum, $periodicPayment, $balance, $monthlyInterest)

{

// Calculate payment interest

$paymentInterest = round($balance * $monthlyInterest, 2);

// Calculate payment principal

$paymentPrincipal = round($periodicPayment - $paymentInterest, 2);

// Deduct principal from remaining balance

$newBalance = round($balance - $paymentPrincipal, 2);

// If new balance < monthly payment, set to zero

if ($newBalance < $paymentPrincipal) {

$newBalance = 0;

}

printf("<tr><td>%d</td>", $pNum);

printf("<td>$%s</td>", number_format($newBalance, 2));

printf("<td>$%s</td>", number_format($periodicPayment, 2));

printf("<td>$%s</td>", number_format($paymentPrincipal, 2));

printf("<td>$%s</td></tr>", number_format($paymentInterest, 2));

# If balance not yet zero, recursively call amortizationTable()

if ($newBalance > 0) {

$pNum++;

amortizationTable($pNum, $periodicPayment,

$newBalance, $monthlyInterest);

} else {

return 0;

}

}

?>

Setelah pengaturan variabel yang bersangkutan dan melakukan beberapa perhitungan awal, properti 4-2 memanggil fungsi (amortizationTable). Karena fungsi ini memanggil dirinya sendiri secara berulang, semua perhitungan tabel amortisasi akan dilakukan internal untuk fungsi ini, setelah selesai, kontrol dikembalikan ke pemanggil.

Listing 4-2. Sebuah Kalkulator Jadwal Pembayaran Menggunakan Rekursi

<?php

// Loan balance

$balance = 10000.00;

// Loan interest rate

$interestRate = .0575;

// Monthly interest rate

$monthlyInterest = $interestRate / 12;

// Term length of the loan, in years.

$termLength = 5;

// Number of payments per year.

$paymentsPerYear = 12;

// Payment iteration

$paymentNumber = 1;

// Determine total number payments

$totalPayments = $termLength * $paymentsPerYear;

// Determine interest component of periodic payment

$intCalc = 1 + $interestRate / $paymentsPerYear;

// Determine periodic payment

$periodicPayment = $balance * pow($intCalc,$totalPayments) * ($intCalc - 1) /

(pow($intCalc,$totalPayments) - 1);

// Round periodic payment to two decimals

$periodicPayment = round($periodicPayment,2);

// Create table

echo "<table width='50%' align='center' border='1'>";

echo "<tr>

<th>Payment Number</th><th>Balance</th>

<th>Payment</th><th>Interest</th><th>Principal</th>

</tr>";

// Call recursive function

amortizationTable($paymentNumber, $periodicPayment, $balance,

$monthlyInterest);

// Close table

echo "</table>";

?>

Function Libraries

Programmer Hebat yang malas, dan programmer malas berpikir dalam hal penggunaan kembali. Fungsi menawarkan cara yang bagus untuk menggunakan kembali kode dan biasanya secara bersama dirakit menjadi library dan kemudian berulang kali digunakan kembali dalam aplikasi yang serupa. Library PHP dibuat melalui penggabungan sederhana dari definisi fungsi dalam satu file, seperti ini:

<?php

function localTax($grossIncome, $taxRate) {

// function body here

}

function stateTax($grossIncome, $taxRate, $age) {

// function body here

}

function medicare($grossIncome, $medicareRate) {

// function body here

}

?>

Simpan Library ini, sebaiknya menggunakan konvensi penamaan yang jelas akan menunjukkan kegunaannya, seperti taxes.library.php. Namun Jangan menyimpan file ini dalam dokumen root server menggunakan ekstensi yang akan menyebabkan server Web melewati isi file tidak diuraikan. Melakukan hal itu membuka kemungkinan bagi pengguna untuk memanggil file dari browser dan memeriksa kode, yang mungkin berisi data sensitif. Anda dapat menyisipkan file ini ke dalam skrip dengan menggunakan include (), include_once (), require (),

atau require_once (), masing-masing yang diperkenalkan dalam Bab 3. (Sebagai alternatif, Anda dapat menggunakan direktif konfigurasi auto_prepend PHP untuk mengotomatisasi tugas penyisipan file untuk Anda.) Sebagai contoh, dengan asumsi bahwa Anda judul Library ini taxation.library.php, Anda dapat memasukkannya ke dalam script seperti ini:

<?php

require_once("taxation.library.php");

...

?>

Setelah disertakan, salah satu dari tiga fungsi yang ditemukan pada Library ini dapat dipanggil sesuai kebutuhan.

Ringkasan

Bab ini berkonsentrasi pada salah satu dari blok pembangun dasar dari bahasa pemrograman modern-hari: penggunaan kembali melalui pemrograman fungsional. Anda belajar bagaimana membuat dan memanggil fungsi, menyampaikan informasi ke dan dari fungsi blok, fungsi sarang, dan membuat kedua fungsi rekursif dan variabel. Akhirnya, Anda belajar bagaimana fungsi keseluruhan bersama seperti library dan meliputi mereka ke dalam script yang diperlukan.

Bab berikutnya memperkenalkan fitur array PHP, mencakup petak bahasa yang luas tentang manajemen array dan kemampuan manipulasi.

■ ■ ■

CHAPTER 5

Arrays

Sebagian besar waktu Anda sebagai seorang programmer dihabiskan bekerja dengan mengatur data. Beberapa contoh set data meliputi nama semua karyawan di sebuah perusahaan; presiden AS dan tanggal lahir yang sesuai mereka, dan tahun-tahun antara tahun 1900 dan 1975. Pada kenyataannya, bekerja dengan mengatur data sangat umum bahwa sebuah cara untuk mengelola kelompok-kelompok dalam kode adalah fitur umum dari semua bahasa pemrograman utama. Dalam bahasa PHP, fitur ini dikenal sebagai array, yang menawarkan cara yang ideal untuk menyimpan, memanipulasi, menyortir, dan mengambil kumpulan data.

Bab ini memperkenalkan array dan berbagai bahasa yang mengesankan dari fungsi yang digunakan untuk bekerja dengan mereka. Khususnya Anda akan belajar bagaimana untuk melakukan hal berikut:

• Membuat array

• Output array

• uji array

• Menambah dan menghapus elemen array

• Mencari elemen array

• Melintasi array

• Menentukan ukuran array dan keunikan elemen

• Urutkan array

• Menggabungkan, irisan, menyambung, dan memotong array

Sebelum memulai gambaran fungsi ini, mari kita sejenak untuk secara formal mendefinisikan sebuah array dan meninjau beberapa konsep dasar tentang bagaimana PHP menganggap penting datatype ini.

Apakah itu Array?

Array secara tradisional didefinisikan sebagai kelompok item yang bagian karakteristik tertentu, seperti kesamaan (model mobil, tim bisbol, jenis buah, dll) dan jenis file (misalnya, semua string atau integer). Setiap item dibedakan dengan pengenal khusus yang dikenal sebagai kunci. PHP mengambil definisi ini selangkah lebih maju, berpantang kebutuhan bahwa item membagi datatype yang sama. Sebagai contoh, sebuah array bisa sangat mungkin berisi item seperti nama negara, kode ZIP, nilai ujian, atau sesuai kartu bermain.

Setiap item terdiri dari dua komponen: kunci di atas dan nilai. Kunci berfungsi sebagai fasilitas pencarian untuk mengambil pasangannya, nilai. Kunci dapat numerik atau asosiatif. Kunci numerik tidak memberikan hubungan yang nyata dengan nilai selain posisi nilai dalam array. Sebagai contoh, array dapat terdiri dari abjad diurutkan menurut daftar nama negara, dengan 0 kunci yang mewakili Alabama, dan 49 kunci yang mewakili Wyoming. Menggunakan sintaks PHP, ini mungkin terlihat seperti berikut:

$states = array(0 => "Alabama", "1" => "Alaska"..."49" => "Wyoming");

Menggunakan pengindeksan angka, Anda bisa mereferensi negara bagian pertama (Alabama) seperti:

$states[0]

■ Catatan Seperti halnya banyak bahasa pemrograman, array PHP diindeks secara numerik dimulai dengan posisi 0, bukan 1.

Kunci asosiatif secara logika dikenakan hubungan langsung ke nilai yang sesuai. Pemetaan array associatively sangat mudah ketika menggunakan nilai indeks angka tidak masuk akal. Misalnya, Anda mungkin ingin membuat array yang peta negara singkatan untuk nama mereka, seperti ini: OH/Ohio, PA/Pennsylvania, dan NY/New York. Menggunakan sintaks PHP, ini mungkin terlihat seperti berikut:

$states = array("OH" => "Ohio", "PA" => "Pennsylvania", "NY" => "New York")

Anda bisa kemudian mengacu Ohio seperti ini:

$states["OH"]

Ini mungkin juga untuk membuat array dari array, yang dikenal sebagai array multidimensi. Sebagai contoh, Anda bisa menggunakan array multidimensi untuk menyimpan informasi negara AS. Menggunakan sintaks PHP, mungkin terlihat seperti ini:

$states = array (

"Ohio" => array("population" => "11,353,140", "capital" => "Columbus"),

"Nebraska" => array("population" => "1,711,263", "capital" => "Omaha")

);

Anda bisa kemudian mengacu penduduk Ohio:

$states["Ohio"]["population"]

Hal ini akan mengembalikan sebagai berikut:

Logikanya Anda akan memerlukan cara untuk melintasi array. Ketika Anda akan belajar seluruh bab ini, PHP menawarkan banyak cara untuk melakukannya. Terlepas dari apakah Anda menggunakan kunci asosiatif atau angka, perlu diingat bahwa semua bergantung pada penggunaan fitur utama yang dikenal sebagai pointer array. Tindakan pointer array seperti bookmark, memberitahu Anda posisi dari array yang Anda saat ini periksa. Anda tidak akan bekerja dengan pointer array secara langsung, melainkan akan melintasi array menggunakan baik fitur bahasa built-in atau fungsi. Namun, ini berguna untuk memahami konsep dasar.

Membuat Array

Tidak seperti bahasa lainnya, PHP tidak mengharuskan Anda menetapkan ukuran suatu array pada waktu penciptaan. Sebenarnya, karena itu bahasa yang bebas diketik, PHP bahkan tidak mengharuskan Anda mendeklarasikan array sebelum menggunakannya, walaupun Anda bebas untuk melakukannya. Setiap pendekatan diperkenalkan di bagian ini, dimulai dengan berbagai formal. Masing-masing elemen dari sebuah array PHP direferensi dengan melambangkan elemen antara sepasang kurung kotak. Karena tidak ada batasan ukuran pada array, Anda dapat membuat array sederhana dengan membuat referensi untuk itu, seperti ini:

$state[0] = "Delaware";

Anda kemudian dapat menampilkan elemen pertama dari array $ state seperti ini:

echo $state[0];

Sebagai tambahan Nilai dapat ditambahkan dengan tiap pemetaan nilai baru untuk indeks array, seperti ini:

$state[1] = "Pennsylvania";

$state[2] = "New Jersey";

...

$state[49] = "Hawaii";

Menariknya, jika Anda berniat untuk nilai indeks menjadi numerik dan Ascending, Anda dapat menghilangkan nilai indeks pada saat penciptaan:

$state[] = "Pennsylvania";

$state[] = "New Jersey";

...

$state[] = "Hawaii";

Membuat array asosiatif dengan cara ini sama mudahnya selain itu kunci selalu diperlukan. Contoh berikut membuat sebuah array yang sesuai negara bagian AS nama-nama dengan tanggal mereka masuk kedalam Persatuan:

$state["Delaware"] = "December 7, 1787";

$state["Pennsylvania"] = "December 12, 1787";

$state["New Jersey"] = "December 18, 1787";

...

$state["Hawaii"] = "August 21, 1959";

pembangunan array (), yang akan didiskusikan, adalah secara fungsional sama tetapi caranya agak lebih formal untuk membuat array.

Membuat array dengan array()

Pembangunan array () mengambil sebagaimana input nol atau lebih banyak item dan mengembalikan array yang terdiri dari unsur-unsur input. prototipenya terlihat seperti ini:

array array([item1 [,item2 ... [,itemN]]])

Berikut adalah contoh dari menggunakan array () untuk membuat sebuah array terindeks:

$languages = array("English", "Gaelic", "Spanish");

// $languages[0] = "English", $languages[1] = "Gaelic", $languages[2] = "Spanish"

Anda juga dapat menggunakan array () untuk membuat sebuah array asosiatif, seperti ini:

$languages = array("Spain" => "Spanish",

"Ireland" => "Gaelic",

"United States" => "English");

// $languages["Spain"] = "Spanish"

// $languages["Ireland"] = "Gaelic"

// $languages["United States"] = "English"

Mengekstrak Array dengan list ()

pembangunan list() mirip dengan array (), walaupun ini digunakan untuk membuat penempatan variabel secara simultan dari nilai diambil dari sebuah array hanya dalam satu operasi. prototipe terlihat seperti ini

void list(mixed...)

Konstruksi ini dapat sangat berguna ketika Anda mengekstrak informasi dari database atau file. Misalnya, Anda ingin format dan output informasi dibaca dari file teks bernama users.txt. Setiap baris dari file tersebut berisi informasi pengguna, termasuk nama, pekerjaan, dan warna favorit dengan masing-masing item dipisahkan oleh baris vertikal. Sebuah garis yang khas akan terlihat seperti berikut:

Nino Sanzi|professional golfer|green

Menggunakan list (), sebuah loop sederhana bisa membaca setiap baris, menetapkan setiap potongan data ke variabel, dan format dan menampilkan data yang diperlukan. Berikut adalah bagaimana Anda dapat menggunakan list () untuk membuat penempatan berbagai variabel secara simultan:

// Open the users.txt file

$users = fopen("users.txt", "r");

// While the EOF hasn't been reached, get next line

while ($line = fgets($users, 4096)) {

// use explode() to separate each piece of data.

list($name, $occupation, $color) = explode("|", $line);

// format and output the data

printf("Name: %s <br />", $name);

printf("Occupation: %s <br />", $occupation);

printf("Favorite color: %s <br />", $color);

}

fclose($users);

Setiap baris dari file users.txt akan dibaca dan diformat sama dengan ini:

Meninjau contoh, list () tergantung pada fungsi explode() untuk memecah setiap baris menjadi tiga unsur, dimana explode() ini dengan menggunakan baris vertikal sebagai unsur pembatas. (fungsi explode() secara resmi diperkenalkan pada Bab 9.). Unsur-unsur ini kemudian ditugaskan ke $name, $occupation, dan $color. Pada point itu, ini hanya masalah format untuk menampilkan ke browser.

Mempopulasikan Array dengan Range Nilai Siap Pakai

range () berfungsi menyediakan cara mudah dengan cepat membuat dan mengisi sebuah array yang terdiri dari jangkauan nilai integer rendah dan tinggi. Array berisi semua nilai integer dalam jangkauan ini dikembalikan. Prototipenya terlihat seperti ini:

array range(int low, int high [, int step])

Misalnya, Anda memerlukan sebuah array yang terdiri dari semua nilai yang mungkin nominal dari sebuah dadu.

$die = range(0,6);

// Same as specifying $die = array(0,1,2,3,4,5,6)

Tapi jika Anda ingin serangkaian terdiri hanya dari nilai genap atau ganjil? Atau kisaran yang terdiri dari nilai hanya habis dibagi dengan lima? pilihan langkah Parameter menawarkan cara yang mudah untuk melakukannya. Sebagai contoh, jika Anda ingin membuat array yang terdiri dari semua nilai bahkan antara 0 dan 20, Anda bisa menggunakan nilai langkah dari 2:

$even = range(0,20,2);

// $even = array(0,2,4,6,8,10,12,14,16,18,20);

function range ()juga dapat digunakan untuk urutan karakter. Misalnya, Anda ingin membuat sebuah array yang terdiri dari huruf A sampai F:

$letters = range("A","F");

// $letters = array("A,","B","C","D","E","F");

MENCETAK ARRAY UNTUK TUJUAN PENGUJIAN Sejauh ini isi array pada contoh sebelumnya telah ditampilkan menggunakan komentar. Sementara ini bekerja dengan baik untuk tujuan pembelajaran, di dunia nyata Anda perlu untuk tahu cara mudah output semua isinya ke layar untuk tujuan pengujian. Hal ini paling sering dilakukan dengan fungsi print_r (). Prototipe nya sebagai berikut: boolean print_r(mixed variable [, boolean return]) fungsi print_r () menerima variabel dan mengirimkan isinya ke output standar, mengembalikan TRUE pada kesuksesan dan FALSE sebaliknya. Hal ini sendiri tidak terlalu menarik, sampai Anda menyadari itu akan mengatur isi sebuah array's (dan juga sebagai objek) ke dalam format yang mudah dibaca. Misalnya, Anda ingin melihat isi dari sebuah array asosiatif yang terdiri dari negara-negara dan yang berhubungan ibukota negara. Anda bisa memanggil print_r () seperti ini: print_r($states); Ini mengembalikan sebagai berikut: Array ( [Ohio] => Columbus [Iowa] => Des Moines [Arizona] => Phoenix ) parameter pilihan mengembalikan modifikasi perilaku fungsi, menyebabkan itu

untuk mengembalikan output untuk di panggil, bukan mengirimkan ke output standar. Oleh karena itu, jika Anda ingin mengembalikan isi array sebelumnya $state, Anda hanya mengatur pengembalian ke TRUE: $stateCapitals = print_r($states, TRUE); Fungsi ini digunakan berulang kali di seluruh bab ini sebagai alat sederhana untuk menampilkan hasil contoh. Perlu diketahui fungsi print_r () bukan satu-satunya cara untuk output array, tetapi lebih menawarkan cara yang mudah untuk melakukannya. Anda bebas untuk output array menggunakan kondisional looping, seperti while atau for, bahkan, menggunakan jenis loop diperlukan untuk mengimplementasikan banyak fitur-fitur aplikasi. Aku akan mengembalikan ke metode ini berulang-ulang di seluruh bab ini dan kemudian.

Menguji untuk sebuah Array

Ketika Anda menggabungkan array ke dalam aplikasi Anda, Anda terkadang harus mengetahui apakah suatu variabel tertentu adalah array. Sebuah fungsi dibangun-pada, is_array (), tersedia untuk menyelesaikan tugas ini. Prototipe nya berikut:

boolean is_array(mixed variable)

fungsi is_array () menentukan apakah variabel adalah array, mengembalikan TRUE jika itu dan FALSE sebaliknya. Catatan meskipun sebuah array terdiri dari nilai tunggal akan tetap dianggap array. Contoh berikut :

$states = array("Florida");

$state = "Ohio";

printf("\$states is an array: %s <br />", (is_array($states) ? "TRUE" : "FALSE"));

printf("\$state is an array: %s <br />", (is_array($state) ? "TRUE" : "FALSE"));

Mengeksekusi contoh ini menghasilkan sebagai berikut:

Menambah dan Menghapus Elemen Array

PHP menyediakan sejumlah fungsi untuk baik tumbuh dan menyusut array. Beberapa fungsi ini disediakan sebagai kemudahan untuk programmer yang ingin meniru berbagai implementasi antrian (FIFO, LIFO, dll), seperti tercermin dari nama mereka (push, pop, shift, dan unshift). Bagian ini memperkenalkan fungsi tersebut dan menawarkan beberapa contoh.

■ Catatan Sebuah antrian tradisional adalah struktur data yang mana elemen dihilangkan dalam urutan yang sama di mana mereka dimasukkan, yang dikenal sebagai pertama-dalam-pertama-keluar atau FIFO. Sebaliknya, susunan adalah struktur data yang mana elemen dihilangkan dalam urutan berlawanan dengan yang mana mereka dimasukkan, yang dikenal sebagai terakhir-dalam-pertama-keluar, atau LIFO.

Menambahkan Nilai ke Bagian depan suatu Array

fungsi array_unshift () menambahkan element ke depan array. Semua kunci angka yang sudah ada sebelumnya dimodifikasi untuk mencerminkan posisi baru mereka pada array, tapi kunci asosiatif tidak terpengaruh. Prototipe nya berikut:

int array_unshift(array array, mixed variable [, mixed variable...])

Contoh berikut menambahkan dua negara ke bagian depan dari array $state:

$states = array("Ohio","New York");

array_unshift($states,"California","Texas");

// $states = array("California","Texas","Ohio","New York");

Menambahkan Nilai ke Akhir dari Array

array_push () berfungsi menambahkan nilai ke akhir array, mengembalikan TRUE pada kesuksesan dan FALSE sebaliknya. Anda dapat menekan beberapa variabel ke dalam array secara bersamaan dengan melewati variabel ini ke dalam fungsi sebagai parameter input. Prototipe nya berikut:

int array_push(array array, mixed variable [, mixed variable...])

Contoh berikut menambahkan dua lebih negara ke dalam array $state:

$states = array("Ohio","New York");

array_push($states,"California","Texas");

// $states = array("Ohio","New York","California","Texas");

Menghilangkan nilai dari bagian depan suatu Array

array_shift () berfungsi menghapus dan mengembalikan item yang ditemukan dalam array. Menghasilkan, jika kunci numerik digunakan, semua nilai terkait akan berubah ke bawah, sedangkan array yang menggunakan kunci asosiatif tidak akan terpengaruh. Prototipe nya berikut:

mixed array_shift(array array)

Contoh berikut menghilangkan negara bagian pertama dari array $state:

$states = array("Ohio","New York","California","Texas");

$state = array_shift($states);

// $states = array("New York","California","Texas")

// $state = "Ohio"

Menghilangkan Nilai dari Akhir sebuah Array

array_pop () berfungsi menghilangkan dan mengembalikan elemen terakhir dari array. Prototipe nya berikut:

mixed array_pop(array target_array)

Contoh berikut menghilangkan negara terakhir dari array $state:

$states = array("Ohio","New York","California","Texas");

$state = array_pop($states);

// $states = array("Ohio", "New York", "California"

// $state = "Texas"

Menemukan Elemen Array

Kemampuan untuk menyaring secara efisien melalui data yang penting sekali pada saat ini informasi-yang digerakkan masyarakat. Bagian ini memperkenalkan beberapa fungsi yang memungkinkan Anda untuk mencari array dalam rangka untuk mencari item yang menarik.

Mencari sebuah Array

in_array () berfungsi mencari array untuk nilai tertentu, mengembalikan TRUE jika nilai ditemukan, dan FALSE sebaliknya. Prototipe nya berikut:

boolean in_array(mixed needle, array haystack [, boolean strict])

Pada contoh berikut, sebuah pesan akan ditampilkan jika negara tertentu (Ohio) ditemukan dalam array yang terdiri dari negara yang memiliki seluruh negara bagian larangan merokok:

$state = "Ohio";

$states = array("California", "Hawaii", "Ohio", "New York");

if(in_array($state, $states)) echo "Not to worry, $state is smoke-free!";

Parameter opsional ketiga, yang tegas, kekuatan in_array () juga mempertimbangkan tipe.

Mencari Kunci Array asosiatif

fungsi array_key_exists () mengembalikan TRUE jika kunci tertentu ditemukan dalam array, dan sebaliknya mengembalikan FALSE. Prototipe nya sebagai berikut:

boolean array_key_exists(mixed key, array array)

Contoh berikut akan mencari kunci sebuah array untuk Ohio, dan jika ditemukan, informasi output akan tentang masuknya ke Union:

$state["Delaware"] = "December 7, 1787";

$state["Pennsylvania"] = "December 12, 1787";

$state["Ohio"] = "March 1, 1803";

if (array_key_exists("Ohio", $state))

printf("Ohio joined the Union on %s", $state["Ohio"]);

berikut adalah hasilnya :

mencari Nilai Array asosiatif

array_search () berfungsi mencari sebuah array untuk nilai tertentu, mengembalikan kunci apabila berada, dan FALSE sebaliknya. Prototipe nya berikut:

mixed array_search(mixed needle, array haystack [, boolean strict])

Contoh berikut mencari $state untuk tanggal tertentu (Desember 7), mengembalikan informasi mengenai negara yang sesuai jika berada:

$state["Ohio"] = "March 1";

$state["Delaware"] = "December 7";

$state["Pennsylvania"] = "December 12";

$founded = array_search("December 7", $state);

if ($founded) printf("%s was founded on %s.", $founded, $state[$founded]);

Output sebagi berikut :

Mengambil Kunci Array

array_keys () berfungsi mengembalikan array yang terdiri dari semua kunci yang terletak dalam array. Prototipe nya berikut:

array array_keys(array array [, mixed search_value])

Jika pilihan parameter search_value disertakan, hanya kunci yang cocok nilai yang akan dikembalikan. Contoh berikut output semua nilai kunci yang ditemukan dalam array $state:

$state["Delaware"] = "December 7, 1787";

$state["Pennsylvania"] = "December 12, 1787";

$state["New Jersey"] = "December 18, 1787";

$keys = array_keys($state);

print_r($keys);

Output sebagai berikut :

Mengambil Nilai Array

array_values () berfungsi mengembalikan semua nilai yang terletak dalam array, secara otomatis menyediakan indeks numerik untuk array dikembalikan. Prototipe nya berikut:

array array_values(array array)

Contoh berikut akan mengambil jumlah populasi untuk semua negara yang ditemukan di $population:

$population = array("Ohio" => "11,421,267", "Iowa" => "2,936,760");

print_r(array_values($population));

Contoh ini akan menampilkan sebagai berikut:

Melintasi Array

Kebutuhan untuk perjalanan seluruh array dan mengambil berbagai kunci, nilai, atau keduanya adalah umum, sehingga tidak heran PHP menawarkan berbagai fungsi yang sesuai untuk kebutuhan ini. Banyak fungsi ini melakukan tugas ganda: mengambil kunci atau nilai yang berada pada penunjuk lokasi saat ini, dan memindahkan penunjuk ke lokasi yang sesuai berikutnya. Fungsi-fungsi ini diperkenalkan di bagian ini.

Mengambil Kunci Array saat ini

fungsi key () mengembalikan Kunci yang terletak pada posisi penunjuk saat input_array. Prototipe nya berikut:

mixed key(array array)

Contoh berikut akan menampilkan kunci array $capital oleh iterasi atas array dan memindahkan penunjuk:

$capitals = array("Ohio" => "Columbus", "Iowa" => "Des Moines");

echo "<p>Can you name the capitals of these states?</p>";

while($key = key($capitals)) {

printf("%s <br />", $key);

next($capitals);

}

Ini mengembalikan sebagai berikut:

Catatan bahwa key () tidak mengedepankan penunjuk dengan setiap panggilan. Sebaliknya, Anda menggunakan fungsi next (), yang tujuan utamanya adalah untuk menyelesaikan tugas ini. Fungsi ini diperkenalkan di akhir bagian ini.

Mengambil Nilai Array saat ini

fungsi current () mengembalikan nilai array yang berada pada saat posisi penunjuk dari array. Prototipe nya berikut:

mixed current(array array)

Mari merevisi contoh sebelumnya, kali ini mengambil nilai array :

$capitals = array("Ohio" => "Columbus", "Iowa" => "Des Moines");

echo "<p>Can you name the states belonging to these capitals?</p>";

while($capital = current($capitals)) {

printf("%s <br />", $capital);

next($capitals);

}

Output sebagai berikut :

Mengambil Kunci Array dan Nilai saat ini

fungsi each() mengembalikan kunci saat ini / nilai pasangan dari array dan kemajuan posisi satu penunjuk. Prototipe nya berikut:

array each(array array)

Array dikembalikan terdiri dari empat kunci, dengan kunci 0 dan kunci yang berisi nama kunci, dan kunci 1 serta nilai yang berisi data yang sesuai. Jika pointer yang berada pada akhir array sebelum menjalankan each(), FALSE dikembalikan.

Memindahkan Pointer Array

Beberapa fungsi yang tersedia untuk memindahkan penunjuk array. Fungsi-fungsi ini diperkenalkan di bagian ini.

Memindahkan Pointer ke Posisi Array Selanjutnya

fungsi next() mengembalikan nilai array yang berada pada posisi yang langsung mengikuti itu dari pointer array saat ini. Prototipe nya berikut:

mixed next(array array)

Contohnya sebagai berikut :

$fruits = array("apple", "orange", "banana");

$fruit = next($fruits); // returns "orange"

$fruit = next($fruits); // returns "banana"

Anda juga dapat memindahkan penunjuk ke belakang, serta langsung ke awal dan akhir dari array. Kemampuan ini diperkenalkan berikutnya.

Memindahkan Penunjuk ke Posisi Array Sebelumnya

prev () berfungsi mengembalikan nilai array yang berada pada lokasi sebelum lokasi pointer saat ini, atau FALSE jika penunjuk berada pada posisi pertama dalam array. Prototipe nya sebagai berikut:

mixed prev(array array)

Karena prev () bekerja pada cara yang sama persis seperti yang berikutnya (), contoh tidak diperlukan.

Memindahkan Penunjuk ke Posisi Array Pertama

fungsi reset() berfungsi untuk mengatur pointer array kembali ke awal dari array. Prototipe nya berikut:

mixed reset(array array)

Fungsi ini umumnya digunakan ketika Anda perlu untuk meninjau atau memanipulasi array beberapa kali dalam skrip, atau ketika menyortir sudah selesai.

Memindahkan Penunjuk ke Posisi Array Terakhir

end () berfungsi memindahkan pointer ke posisi terakhir array, mengembalikan elemen terakhir. Prototipe nya berikut:

mixed end(array array)

Contoh berikut menunjukkan mengambil nilai array pertama dan terakhir:

$fruits = array("apple", "orange", "banana");

$fruit = current($fruits); // returns "apple"

$fruit = end($fruits); // returns "banana"

Melewati Nilai Array ke suatu Fungsi

fungsi array_walk () akan melewati setiap elemen dari sebuah array untuk fungsi yang ditetapkan pengguna. Hal ini berguna ketika Anda perlu untuk melakukan tindakan tertentu berdasarkan setiap elemen array. Jika Anda berniat untuk benar-benar memodifikasi kunci array / pasangan nilai, Anda harus melewati setiap kunci/nilai untuk fungsi sebagai referensi. Prototipenya sebagai berikut :

boolean array_walk(array &array, callback function [, mixed userdata])

Fungsi yang ditetapkan pengguna harus mengambil dua parameter sebagai input. Yang pertama merupakan nilai array saat ini, dan yang kedua merupakan kunci saat ini. Jika parameter pilihan userdata berada di panggil untuk array_walk (), nilainya akan dilewatkan sebagai parameter ketiga untuk fungsi user yang ditentukan.

Anda mungkin garuk-garuk kepala, bertanya-tanya bagaimana fungsi ini mungkin bisa ada gunanya. Mungkin salah satu contoh yang paling efektif melibatkan kewarasan-pengecekan yang disediakan pengguna data form. Misalkan pengguna diminta untuk memberikan enam kata kunci yang ia pikir

paling menggambarkan Negara di mana ia hidup. Contoh formulir disediakan pada Listing 5-1.

Listing 5-1. Menggunakan Array berpengaruh pada Formulir

<form action="submitdata.php" method="post">

<p>

Provide up to six keywords that you believe best describe the state in

which you live:

</p>

<p>Keyword 1:<br />

<input type="text" name="keyword[]" size="20" maxlength="20" value="" /></p>

<p>Keyword 2:<br />

<input type="text" name="keyword[]" size="20" maxlength="20" value="" /></p>

<p>Keyword 3:<br />

<input type="text" name="keyword[]" size="20" maxlength="20" value="" /></p>

<p>Keyword 4:<br />

<input type="text" name="keyword[]" size="20" maxlength="20" value="" /></p>

<p>Keyword 5:<br />

<input type="text" name="keyword[]" size="20" maxlength="20" value="" /></p>

<p>Keyword 6:<br />

<input type="text" name="keyword[]" size="20" maxlength="20" value="" /></p>

<p><input type="submit" value="Submit!"></p>

</form>

Formulir informasi ini kemudian dikirim ke beberapa script, dirujuk sebagai submitdata.php pada form. Script ini harus mensanitasi data pengguna dan kemudian masukkan ke database untuk diperiksa nantinya. Menggunakan array_walk (), Anda dapat dengan mudah menyaring kata kunci menggunakan standar fungsi:

<?php

function sanitize_data(&$value, $key) {

$value = strip_tags($value);

}

array_walk($_POST['keyword'],"sanitize_data");

?>

Hasilnya adalah bahwa setiap nilai pada array yang dijalankan melalui fungsi strip_tags (), yaitu menghasilkan tag HTML dan PHP tidak dihapus dari nilai. Tentu saja, penambahan input memeriksa akan diperlukan, tetapi ini seharusnya cukup untuk menggambarkan kegunaan array_walk ().

■ Catatan Jika Anda tidak terbiasa dengan kemampuan PHP menangani-form, lihat Bab 13.

Menentukan Ukuran Array dan Keunikannya

Sedikit fungsi yang tersedia untuk menentukan jumlah total dan nilai array unik. Fungsi-fungsi ini diperkenalkan di bagian ini.

Menentukan Ukuran sebuah Array

Fungsi count () mengembalikan jumlah total nilai yang ditemukan dalam array. Prototipe nya berikut:

integer count(array array [, int mode])

Jika parameter pilihan mode diaktifkan (diatur ke 1), array akan dihitung secara berulang, fitur yang berguna saat menghitung semua elemen dari sebuah array multidimensi. Contoh pertama akan menghitung jumlah total sayuran yang ditemukan dalam array $garden :

$garden = array("cabbage", "peppers", "turnips", "carrots");

echo count($garden);

Ini mengembalikan sebagai berikut:

Contoh berikut menghitung baik nilai skalar dan nilai-nilai array yang ditemukan di $location:

$locations = array("Italy","Amsterdam",array("Boston","Des Moines"),"Miami");

echo count($locations,1);

Ini mengembalikan sebagai berikut:

Anda mungkin menggaruk kepala Anda di hasil ini karena tampaknya ada hanya lima elemen dalam array. Entitas array memegang Boston dan Des Moines dihitung sebagai item, sama seperti isinya adalah.

■ Catatan Fungsi sizeof() nama lain count(). Secara fungsional sama.

Menghitung Frekuensi Nilai Array

Fungsi array_count_values () mengembalikan array yang terdiri dari kunci asosiatif / pasangan nilai. Prototipe nya berikut :

array array_count_values(array array)

Setiap kunci mewakili nilai yang ditemukan pada input_array, dan nilai yang sesuai menunjukkan frekuensi kemunculan kunci itu (sebagai nilai) di input_array tersebut. Sebuah contoh berikut:

$states = array("Ohio","Iowa","Arizona","Iowa","Ohio");

$stateFrequency = array_count_values($states);

print_r($stateFrequency);

Ini mengembalikan sebagai berikut:

Menentukan Nilai Array Unik

fungsi array_unique () menghilangkan semua duplikat nilai-nilai yang ditemukan dalam array, mengembalikan sebuah array yang terdiri dari hanya nilai unik. Prototipe nya berikut:

array array_unique(array array)

Contoh sebagai berikut :

$states = array("Ohio","Iowa","Arizona","Iowa","Ohio");

$uniqueStates = array_unique($states);

print_r($uniqueStates);

Ini mengembalikan sebagai berikut:

Mengurutkan Array

Yang pasti, pengurutan data adalah topik utama dari ilmu komputer. Siapa pun yang mengambil kelas level pemrograman pemula sangat menyadari algoritma pengurutan seperti gelembung, menumpuk, kulit, dan cepat. Topik ini membangun kepalanya begitu sering selama tugas pemrograman sehari-hari bahwa proses penyortiran data lebih umum seperti menciptakan kondisional if atau while loop. PHP memfasilitasi proses tersebut dengan menawarkan banyak fungsi yang berguna yang mampu menyortir array dalam berbagai tata krama. Fungsi Mereka diperkenalkan pada bagian ini.

■ Tip Secara default, fungsi menyortir PHP seperti yang sesuai dengan aturan yang ditetapkan oleh bahasa Inggris. Jika Anda perlu untuk menyortir dalam bahasa lain, misalnya Perancis atau Jerman, Anda harus mengubah standar perilaku dengan pengaturan lokasi Anda menggunakan fungsi setlocale ().

Menyetel Urutan Elemen Array

array_reverse () berfungsi memutar balik urutan elemen array. Prototipe nya berikut:

array array_reverse(array array [, boolean preserve_keys])

Jika parameter opsional preserve_keys disetel ke TRUE, pemetaan kunci dipertahankan. Jika tidak, setiap nilai yang baru mengatur kembali akan menganggap kunci dari nilai sebelumnya memimpin pada posisi itu:

$states = array("Delaware","Pennsylvania","New Jersey");

print_r(array_reverse($states));

// Array ( [0] => New Jersey [1] => Pennsylvania [2] => Delaware )

Kontras perilaku ini dengan itu menghasilkan dari mengaktifkan preserve_keys:

$states = array("Delaware","Pennsylvania","New Jersey");

print_r(array_reverse($states,1));

// Array ( [2] => New Jersey [1] => Pennsylvania [0] => Delaware )

Membalik Array Kunci dan Nilai

array_flip () berfungsi memutar balik peranan kunci dan nilai yang berhubungan dalam array. Prototipe nya berikut:

array array_flip(array array)

Sebagai contoh berikut :

$state = array("Delaware","Pennsylvania","New Jersey");

$state = array_flip($state);

print_r($state);

contoh ini menghasilkan sebagai berikut :

Mengurutkan suatu Array

sort () berfungsi jenis array, memerintahkan elemen dari terendah ke nilai tertinggi. Prototipe nya berikut:

void sort(array array [, int sort_flags])

sort () fungsi tersebut tidak mengembalikan array yang diurutkan. Sebaliknya, jenis array itu "di tempatnya," tidak mengembalikan, terlepas dari hasilnya. Parameter opsional sort_flags memodifikasi perilaku fungsi default yang sesuai dengan nilai yang diberikan:

SORT_NUMERIC: Mengurutkan item angka. Hal ini berguna ketika menyortir bilangan bulat atau floats.

SORT_REGULAR: Mengurutkan item dengan nilai ASCII mereka. Ini berarti bahwa B akan datang sebelum, misalnya. Sebuah pencarian cepat online menghasilkan beberapa tabel ASCII, sehingga seseorang tidak direproduksi dalam buku ini.

SORT_STRING: Mengurutkan item pada mode itu mungkin lebih baik berhubungan dengan bagaimana manusia mungkin melihat urutan yang benar. Lihat natsort () untuk informasi lebih lanjut mengenai hal ini, diperkenalkan di akhir bagian ini.

Pertimbangkan sebuah contoh. Misalnya anda ingin mengurutkan nilai ujian dari terendah hingga tertinggi:

Hasilnya terlihat seperti ini:

$grades = array(42,98,100,100,43,12);

sort($grades);

print_r($grades);

Sangat penting untuk dicatat kunci/nilai asosiasi tidak dipelihara. Perhatikan contoh berikut:

$states = array("OH" => "Ohio", "CA" => "California", "MD" => "Maryland");

sort($states);

print_r($states);

Berikut output:

Untuk memelihara asosiasi tersebut, gunakan asort (), diperkenalkan selanjutnya.

Mengurutkan Array Sementara Memelihara kunci / Pasangan Nilai

fungsi asort () sama dengan sort (), menyortir array dalam urutan meningkat, kecuali bahwa kunci / nilai korespondensi dipelihara. Prototipe nya berikut:

void asort(array array [,integer sort_flags])

Pertimbangkan suatu array yang berisi negara dalam urutan dimana mereka digabungkan dengan Persatuan:

$state[0] = "Delaware";

$state[1] = "Pennsylvania";

$state[2] = "New Jersey";

Mengurutkan array menggunakan sort () menyebabkan hubungan asosiatif akan hilang, dimana ini mungkin merupakan ide yang buruk. Mengurutkan menggunakan sort () menghasilkan urutan berikut:

Namun, menyortir dengan asort () menghasilkan sebagai berikut:

Jika Anda menggunakan parameter opsional sort_flags, tepatnya perilaku menyortir yang ditentukan oleh nilai seperti disebutkan pada bagian sort().

Mengurutkan suatu Array pada Urutan Mundur

fungsi rsort () sama dengan sort (), selain bahwa item jenis array secara terbalik (descending) urutan. Prototipe nya berikut:

void rsort(array array [, int sort_flags])

Sebuah contoh berikut:

$states = array("Ohio","Florida","Massachusetts","Montana");

rsort($states);

print_r($states);

Ini mengembalikan sebagai berikut:

Jika parameter opsional sort_flags disertakan, tepatnya perilaku menyortir ditentukan oleh nilainya, seperti yang dijelaskan dalam bagian sort ().

Mengurutkan suatu Array pada Urutan Mundur Sementara Memelihara Kunci / Pasangan Nilai

Seperti asort (), arsort () memelihara kunci / hubungan nilai. Namun, jenis array dalam urutan terbalik. Prototipe nya berikut:

void arsort(array array [, int sort_flags])

Contoh sebagi berikut:

$states = array("Delaware","Pennsylvania","New Jersey");

arsort($states);

print_r($states);

ini mengembalikan sebagai berikut :

Jika parameter opsional sort_flags disertakan, tepatnya perilaku menyortir ditentukan oleh nilainya, seperti yang digambarkan dalam bagian sort ().

Mengurutkan Array suatu Secara alami

natsort () berfungsi dimaksudkan untuk menawarkan mekanisme menyortir setara dengan mekanisme yang orang biasa digunakan. Prototipe nya berikut:

void natsort(array array)

Manual PHP menawarkan contoh yang sangat baik, ditampilkan di sini, tentang apa artinya untuk mengurutkan array "alamiah." Pertimbangkan item berikut: picture1.jpg, picture2.jpg, picture10.jpg, picture20.jpg. Mengurutkan item ini menggunakan algoritma yang khas menghasilkan pada urutan sebagai berikut:

Tentu saja tidak apa yang mungkin Anda harapkan, kan? natsort () berfungsi menyelesaikan dilema ini, menyortir array dalam urutan yang Anda harapkan, seperti:

Mengurutkan Kasus-tidak sensitif alami

fungsi natcasesort () secara fungsional sama dengan natsort (), kecuali bahwa itu adalah case insensitive:

void natcasesort(array array)

Mengembalikan untuk menyortir file dilema dibangkitkan pada natsort () bagian, anggaplah bahwa gambar diberi nama seperti ini: Picture1.JPG, picture2.jpg, PICTURE10.jpg, picture20.jpg. natsort () berfungsi akan melakukan yang terbaik, penyortiran item ini seperti:

natcasesort () berfungsi menyelesaikan keanehan ini, pengurutan seperti yang Anda harapkan:

Mengurutkan Array dengan Kunci Nilai

ksort () berfungsi menyortir suatu array dengan kunci nya, mengembalikan TRUE pada kesuksesan dan FALSE sebaliknya. Prototipe nya berikut:

integer ksort(array array [, int sort_flags])

Jika parameter opsional sort_flags disertakan, tepatnya perilaku pengurutan ditentukan dengan nilai sebagaimana diuraikan pada bagian sort(). Perlu diketahui bahwa perilaku akan diterapkan untuk pengurutan kunci tetapi tidak untuk pengurutan nilai.

Mengurutkan Kunci Array pada Urutan Mundur

Fungsi krsort () beroperasi sama persis dengan ksort (), pengurutan dengan kunci, namun pengurutan secara terbalik (descending) urutan. Prototipe nya berikut:

integer krsort(array array [, int sort_flags])

Penyortiran Berdasarkan Kriteria User-yang Ditetapkan

fungsi usort () menawarkan cara untuk menyortir array dengan menggunakan algoritma perbandingan yang ditetapkan pengguna, yang digunakan dalam suatu fungsi. Hal ini berguna saat Anda perlu untuk mengurutkan data dengan cara yang tidak ditawarkan oleh salah satu fungsi menyortir PHP built-in. Prototipe nya berikut:

void usort(array array, callback function_name)

Fungsi yang ditetapkan pengguna harus mengambil sebagai input dua argumen dan harus mengembalikan integer negatif, nol, atau bilangan bulat positif, masing-masing, berdasarkan pada apakah argumen pertama kurang dari, sama dengan, atau lebih besar dari argumen kedua. Tidak mengherankan, fungsi ini harus dibuat tersedia untuk ruang lingkup yang sama di mana usort () ini telah dipanggil. Sebuah contoh yang berlaku di mana usort () sangat berguna melibatkan penataan format tanggal Amerika (bulan, hari, tahun, sebagai lawan ke hari, bulan, tahun yang digunakan oleh negara lain).

Misalkan Anda ingin menyortir berbagai tanggal dalam urutan menaik. Meskipun Anda mungkin berpikir fungsi sort() atau natsort() cocok untuk pekerjaan itu, ternyata, keduanya menghasilkan hasil yang tidak diinginkan. Yang jalan hanya untuk membuat fungsi kustom yang mampu menyortir tanggal-tanggal di pemesanan yang tepat:

<?php

$dates = array('10-10-2003', '2-17-2002', '2-16-2003',

'1-01-2005', '10-10-2004');

sort($dates);

echo "<p>Sorting the array using the sort() function:</p>";

print_r($dates);

natsort($dates);

echo "<p>Sorting the array using the natsort() function: </p>";

print_r($dates);

function DateSort($a, $b) {

// If the dates are equal, do nothing.

if($a == $b) return 0;

// Disassemble dates

list($amonth, $aday, $ayear) = explode('-',$a);

list($bmonth, $bday, $byear) = explode('-',$b);

// Pad the month with a leading zero if leading number not present

$amonth = str_pad($amonth, 2, "0", STR_PAD_LEFT);

$bmonth = str_pad($bmonth, 2, "0", STR_PAD_LEFT);

// Pad the day with a leading zero if leading number not present

$aday = str_pad($aday, 2, "0", STR_PAD_LEFT);

$bday = str_pad($bday, 2, "0", STR_PAD_LEFT);

// Reassemble dates

$a = $ayear . $amonth . $aday;

$b = $byear . $bmonth . $bday;

// Determine whether date $a > $date b

return ($a > $b) ? 1 : -1;

}

usort($dates, 'DateSort');

echo "<p>Sorting the array using the user-defined DateSort() function: </p>";

print_r($dates);

?>

Ini mengembalikan berikut (diformat agar terbaca):

Penggabungan, Mengiris, Penyambungan, dan Membedah Array

Bagian ini memperkenalkan beberapa fungsi mampu melakukan agak lebih kompleks tugas manipulasi array, seperti menggabungkan dan penggabungan beberapa array, mengeluarkan bagian-lintas elemen array, dan membandingkan array.

Penggabungan Array

fungsi array_merge () menggabungkan array bersama-sama, mengembalikan tunggal, array kesatuan. Menghasilkan Array akan dimulai dengan parameter

array input pertama, menambahkan setiap parameter array berikutnya dalam urutan penampilan. Prototipe nya berikut :

array array_merge(array array1, array array2 [..., array arrayN])

Jika sebuah array input terdiri sebuah kunci string yang sudah ada dalam menghasilkan array, bahwa kunci / nilai pasangan akan menimpa entri yang sudah ada sebelumnya. Perilaku ini tidak berlaku untuk kunci angka, dalam hal ini kunci / nilai pasangan akan ditambahkan ke array. Sebuah contoh berikut:

$face = array("J","Q","K","A");

$numbered = array("2","3","4","5","6","7","8","9");

$cards = array_merge($face, $numbered);

shuffle($cards);

print_r($cards);

Ini mengembalikan sesuatu sepanjang baris berikut (hasil Anda akan bervariasi karena shuffle):

Menambahkan Array secara berulang

fungsi array_merge_recursive () beroperasi sama dengan array_merge (), menggabungkan dua atau lebih array bersama untuk membentuk sebuah array, satu kesatuan. Perbedaan antara dua fungsi terletak pada cara fungsi ini berperilaku ketika sebuah kunci string yang terletak di salah satu array input yang sudah ada dalam array yang dihasilkan. array_merge () hanya akan menimpa kunci yang sudah ada sebelumnya / pasangan nilai, menggantinya dengan yang

ditemukan dalam array input. array_merge_recursive () sebagai gantinya akan menggabungkan nilai-nilai bersama, membentuk suatu array baru dengan kunci yang sudah ada sebelumnya sebagai namanya. Prototipe nya berikut:

array array_merge_recursive(array array1, array array2 [, arrayN...])

Sebuah contoh berikut:

$class1 = array("John" => 100, "James" => 85);

$class2 = array("Micky" => 78, "John" => 45);

$classScores = array_merge_recursive($class1, $class2);

print_r($classScores);

Ini mengembalikan sebagai berikut:

Catatan bahwa Kunci John sekarang menunjuk ke sebuah array berindeks yang terdiri dari dua nilai.

Menggabungkan Dua Array

fungsi array_combine() menghasilkan sebuah array baru yang terdiri dari yang diajukan sekumpulan kunci dan nilai-nilai yang sesuai. Prototipe nya berikut:

array array_combine(array keys, array values)

Kedua input array harus sama besar, dan tidak boleh kosong. Sebuah contoh berikut:

$abbreviations = array("AL","AK","AZ","AR");

$states = array("Alabama","Alaska","Arizona","Arkansas");

$stateMap = array_combine($abbreviations,$states);

print_r($stateMap);

Ini mengembalikan sebagai berikut:

Mengiris sebuah Array

fungsi array_slice () mengembalikan bagian array berdasarkan yang disediakan dari mulai dan akhir nilai dikurangkan. Prototipe nya berikut:

array array_slice(array array, int offset [, int length])

Nilai positif dikurangkan yang akan menyebabkan potongan untuk memulai posisi dikurangkan dari awal array, sedangkan nilai negatif dikurangkan akan memulai mengiris posisi dikurangkan dari akhir dari array. Jika parameter opsional panjang dihilangkan, irisan akan dimulai pada dikurangkan dan berakhir pada elemen terakhir dari array. Jika panjang disediakan dan bernilai positif, akan berakhir pada posisi dikurangkan + panjang dari awal array. Sebaliknya, jika panjang disediakan dan negatif, ini akan berakhir pada hitungan (input_array) - panjang posisi dari akhir array. Pertimbangkan sebuah contoh:

$states = array("Alabama", "Alaska", "Arizona", "Arkansas",

"California", "Colorado", "Connecticut");

$subset = array_slice($states, 4);

print_r($subset);

Ini mengembalikan sebagai berikut:

Pertimbangkan contoh kedua, yang satu ini melibatkan panjang negatif:

$states = array("Alabama", "Alaska", "Arizona", "Arkansas",

"California", "Colorado", "Connecticut");

$subset = array_slice($states, 2, -2);

print_r($subset);

ini mengembalikan sebagai berikut :

Penyambungan sebuah Array

fungsi array_splice() menghapus semua elemen array yang ditemukan dalam kisaran tertentu, mengembalikan elemen yang dihapus dalam bentuk array. Prototipe nya berikut:

array array_splice(array array, int offset [, int length [, array replacement]])

Nilai positif dikurangkan akan menyebabkan sambungan untuk memulai yang banyak posisi dari awal array, sementara negatif saling hapus akan dimulai sambungan yang banyak posisi dari akhir array. Jika opsional panjang parameter dihilangkan, semua elemen dari posisi dikurangkan untuk akhir dari array akan dihilangkan. Jika panjang disediakan dan positif, sambungan akan berakhir pada posisi dikurangkan + panjang dari awal array. Sebaliknya, jika panjang disediakan dan negatif, sambungan akan berakhir pada hitungan (input_array) - panjang posisi dari akhir array. Sebuah contoh berikut :

$states = array("Alabama", "Alaska", "Arizona", "Arkansas",

"California", "Connecticut");

$subset = array_splice($states, 4);

print_r($states);

print_r($subset);

Ini menghasilkan sebagai berikut (diformat agar terbaca):

Anda dapat menggunakan penggantian opsional parameter untuk menentukan sebuah array yang akan menggantikan segmen target. Sebuah contoh berikut:

$states = array("Alabama", "Alaska", "Arizona", "Arkansas",

"California", "Connecticut");

$subset = array_splice($states, 2, -1, array("New York", "Florida"));

print_r($states);

ini mengembalikkan sebagi berikut :

Menghitung sebuah perpotongan Array

fungsi array_intersect () mengembalikan sebuah kunci-disimpan array hanya terdiri dari nilai-nilai yang ada dalam array pertama yang juga ada di masing-masing array input lainnya. Prototipe nya berikut:

array array_intersect(array array1, array array2 [, arrayN...])

Contoh sebagai berikut akan mengembalikan semua negara yang ditemukan dalam $array1 yang juga tampak pada $array2 dan $array3:

$array1 = array("OH","CA","NY","HI","CT");

$array2 = array("OH","CA","HI","NY","IA");

$array3 = array("TX","MD","NE","OH","HI");

$intersection = array_intersect($array1, $array2, $array3);

print_r($intersection);

ini mengembalikan sebagai berikut :

Catatan bahwa array_intersect () menganggap dua item yang sama hanya jika mereka juga berbagi datatype yang sama.

Menghitung Persimpangan Array asosiatif

fungsi array_intersect_assoc () beroperasi sama persis dengan array_intersect (), selain itu juga mempertimbangkan kunci array pada perbandingan. Oleh karena itu, hanya kunci/pasangan nilai yang terletak di array pertama yang juga ditemukan pada semua array input lainnya akan dikembalikan pada array yang dihasilkan. Prototipe nya berikut:

array array_intersect_assoc(array array1, array array2 [, arrayN...])

Contoh sebagai berikut mengembalikan array yang terdiri dari semua kunci/ pasangan nilai ditemukan dalam $array1 yang juga tampak pada $array2 dan $array3:

$array1 = array("OH" => "Ohio", "CA" => "California", "HI" => "Hawaii");

$array2 = array("50" => "Hawaii", "CA" => "California", "OH" => "Ohio");

$array3 = array("TX" => "Texas", "MD" => "Maryland", "OH" => "Ohio");

$intersection = array_intersect_assoc($array1, $array2, $array3);

print_r($intersection);

ini mengembalikan sebagai berikut :

Catatan bahwa Hawaii tidak dikembalikan karena kunci yang sesuai pada $array2 adalah 50 bukan HI (seperti yang terjadi pada dua array lainnya).

Menghitung Perbedaan Array

Pada dasarnya kebalikan dari array_intersect() ,fungsi array_diff () mengembalikan nilai tersebut yang terletak dalam array pertama yang tidak yang terletak pada salah satu array berikut:

array array_diff(array array1, array array2 [, arrayN...])

Sebuah contoh berikut:

$array1 = array("OH","CA","NY","HI","CT");

$array2 = array("OH","CA","HI","NY","IA");

$array3 = array("TX","MD","NE","OH","HI");

$diff = array_diff($array1, $array2, $array3);

print_r($intersection);

Ini mengembalikan sebagai berikut:

Menghitung Perbedaan Array asosiatif

fungsi array_diff_assoc () beroperasi sama persis dengan array_diff (), selain itu juga mempertimbangkan kunci array pada perbandingan. Oleh karena itu hanya kunci/pasangan nilai yang terletak dalam array pertama tetapi tidak muncul dalam salah satu array input lainnya akan dikembalikan dalam hasil array. Prototipe nya berikut:

array array_diff_assoc(array array1, array array2 [, arrayN...])

Contoh sebagai berikut hanya menampilkan "HI" => "Hawaii" karena ini kunci tertentu / nilai tampak pada $ array1 tetapi tidak tampak pada $ array2 atau $ array3:

$array1 = array("OH" => "Ohio", "CA" => "California", "HI" => "Hawaii");

$array2 = array("50" => "Hawaii", "CA" => "California", "OH" => "Ohio");

$array3 = array("TX" => "Texas", "MD" => "Maryland", "KS" => "Kansas");

$diff = array_diff_assoc($array1, $array2, $array3);

print_r($diff);

Ini mengembalikan sebagai berikut:

Fungsi Array Lainnya yang berguna

Bagian ini memperkenalkan sejumlah fungsi array yang mungkin tidak mudah jatuh ke dalam salah satu bagian sebelumnya tetapi tetap cukup berguna.

Mengembalikan Pengaturan Kunci Acak

Fungsi array_rand () akan mengembalikan nomor acak dari kunci yang ditemukan dalam array. Prototipe nya berikut:

mixed array_rand(array array [, int num_entries])

Jika anda mengabaikan opsional parameter num_entries, hanya satu nilai acak akan dikembalikan. Anda dapat men-tweak jumlah nilai acak dikembalikan dengan pengaturan num_entries yang sesuai. Sebuah contoh berikut:

$states = array("Ohio" => "Columbus", "Iowa" => "Des Moines",

"Arizona" => "Phoenix");

$randomStates = array_rand($states, 2);

print_r($randomStates);

Ini mengembalikan sebagai berikut (output Anda mungkin bervariasi):

Pengacakan Elemen Array

fungsi shuffle () secara acak pemesanan ulang array. Prototipe nya berikut:

void shuffle(array input_array)

Pertimbangkan array yang berisi nilai yang merupakan bermain kartu:

$cards = array("jh","js","jd","jc","qh","qs","qd","qc",

"kh","ks","kd","kc","ah","as","ad","ac");

// shuffle the cards

shuffle($cards);

print_r($positions);

Ini mengembalikan sesuatu sepanjang baris berikut (hasil Anda akan bervariasi karena shuffle):

Penambahan Nilai Array

fungsi array_sum ()menambahkan semua nilai dari input_array bersama-sama, mengembalikan jumlah akhir. Prototipe nya berikut:

mixed array_sum(array array)

Jika tipe data lainnya (string, misalnya) ditemukan dalam array, mereka akan mengabaikan. Sebuah contoh berikut:

<?php

$grades = array(42,"hello",42);

$total = array_sum($grades);

print $total;

?>

Ini mengembalikan sebagai berikut:

Pengelompokan suatu Array

fungsi array_chunk () jeda input_array menjadi sebuah array multidimensi yang mencakup beberapa array lebih kecil yang terdiri dari ukuran elemen. Prototipe nya berikut:

array array_chunk(array array, int size [, boolean preserve_keys])

Jika input_array tidak dapat merata dibagi dengan ukuran, array terakhir akan terdiri dari sedikit dari elemen ukuran. Mengaktifkan opsional parameter preserve_keys akan menjaga tiap Kunci tiap nilai yang sesuai. Menghilangkan atau menonaktifkan parameter ini menghasilkan dalam pengindeksan numerik dimulai dari nol untuk setiap array. Sebuah contoh berikut:

$cards = array("jh","js","jd","jc","qh","qs","qd","qc",

"kh","ks","kd","kc","ah","as","ad","ac");

// shuffle the cards

shuffle($cards);

// Use array_chunk() to divide the cards into four equal "hands"

$hands = array_chunk($cards, 4);

print_r($hands);

Ini mengembalikan sebagi berikut (hasil Anda akan bervariasi karena shuffle):

Rangkuman

Array memainkan peran yang sangat diperlukan dalam pemrograman dan di mana-mana pada setiap jenis aplikasi yang bisa dibayangkan, berbasis web atau tidak. Tujuan bab ini adalah untuk membawa Anda sampai dengan kecepatan mengenai banyak fungsi PHP yang akan membuat hidup pemrograman Anda jauh lebih mudah karena Anda menangani dengan array tersebut.

Bab selanjutnya berfokus pada topik lain yang sangat penting: pemrograman berorientasi objek. Topik ini memiliki peran yang sangat khusus pada PHP 5 karena proses ini sepenuhnya didesain ulang untuk rilis utama.

■ ■ ■

BAB 6

Berorientasi Objek PHP

Sementara untuk banyak bahasa berorientasi objek hanyalah masalah saja, dibutuhkan waktu beberapa tahun sebelum fitur tersebut telah dimasukkan ke dalam PHP. Namun awal terjun dalam menambahkan fitur berorientasi objek untuk bahasa dianggap oleh banyak orang menjadi upaya buruk yang terbaik.

Walaupun sangat dasar tempat pemrograman berorientasi obyek (OOP) ditawarkan pada versi 4, beberapa kekurangan yang ada, meliputi antara lain:

• Sebuah metodologi mereferensikan object yang tidak lazim

• Tidak ada cara untuk mengatur lingkup (publik, private, protected, abstrak) bidang dan metode

• Tidak ada standar konvensi untuk penamaan konstruktor

• Tidak adanya objek perusak

• Kurangnya fitur objek-kloning

• Kurangnya dukungan untuk antarmuka

Untungnya, versi 5 dihilangkan semua kendala tersebut di atas, menawarkan perbaikan besar atas penerapan yang asli, serta perkumpulan fitur baru OOP. Bab ini dan tujuan berikut untuk memperkenalkan fitur baru dan ditingkatkan fungsi. Sebelum melakukannya, bagaimanapun, bab ini secara singkat membahas keuntungan dari model pengembangan OOP.

■ Catatan Sementara ini dan bab berikut berfungsi untuk menyediakan Anda dengan pengenalan yang luas untuk fitur PHP OOP, perawatan menyeluruh dari konsekuensi mereka untuk pengembang PHP ini sebenarnya layak untuk sebuah buku secara keseluruhan. Secara mudah, Matt Zandstra's Objek PHP, Pola, dan Praktek, Edisi Kedua (Apress, 2007) meliputi topik secara detail yang cukup, disertai dengan pengenalan menarik untuk menerapkan pola desain dengan PHP dan gambaran alat pembangunan penting seperti Phing, PEAR, dan phpDocumentor.

Keuntungan OOP

Kelahiran pemrograman berorientasi objek merupakan suatu perubahan paradigma utama pada strategi pengembangan, memusatkan perhatian pada aplikasi data daripada logika tersebut. Untuk kata lain, OOP menggeser fokus dari kegiatan prosedur sebuah program terhadap entitas kehidupan nyata pada akhirnya model. Hasilnya adalah sebuah aplikasi yang mirip dengan dunia di sekitar kita.

Bagian ini membahas tiga konsep dasar OOP: enkapsulasi, pewarisan, dan polimorfisme. Bersama, ketiga ideal menjadi dasar untuk model pemrograman yang paling kuat masih dirancang.

Enkapsulasi

Pemrogram menikmati membedah segala hal dan belajar bagaimana semua potongan-potongan kecil bekerja sama. Meski menyenangkan, untuk mencapai seperti pengetahuan yang mendalam dari item bagian pekerjaan tidak di perlukan. Misalnya, jutaan orang menggunakan komputer setiap hari, tetapi sedikit yang tahu bagaimana itu sesungguhnya bekerja. Ide yang sama berlaku untuk kendaraan bermotor, microwave, dan setiap jumlah item lainnya. Kita dapat pergi dengan ketidaktahuan tersebut melalui penggunaan antarmuka.

Sebagai contoh, Anda tahu memutar pengatur radio memungkinkan Anda untuk mengubah stasiun radio; tidak apa kenyataan bahwa apa yang Anda benar-benar lakukan adalah memberitahu radio untuk mendengarkan sinyal yang ditransmisikan pada frekuensi tertentu, prestasi dilakukan menggunakan sebuah demodulator. Kegagalan untuk memahami proses ini tidak mencegah Anda menggunakan radio karena antarmuka membutuhkan perawatan untuk menyembunyikan rincian seperti itu. Praktek memisahkan pengguna dari bagian pekerjaan sebenarnya dari aplikasi melalui antarmuka dikenal sebagai enkapsulasi.

Pemrograman berorientasi obyek mempromosikan konsep yang sama menyembunyikan kerja bagian dalam aplikasi dengan menerbitkan yang didefinisikan dengan baik antarmuka dari tiap komponen aplikasi dapat diakses. Daripada terjebak pada rincian mengerikan, pengembang OOP-berpikiran desain masing-masing komponen aplikasi sehingga mandiri dari yang lain, yang tidak hanya mendorong penggunaan kembali tetapi juga memungkinkan pengembang untuk menyusun komponen-komponen seperti puzzle daripada kuat menyerang, atau Beberapa, mereka bersama-sama. Komponen ini dikenal sebagai objek, dan objek diciptakan dari template yang dikenal sebagai sebuah kelas, yang menentukan jenis data objek yang mungkin berisi dan satu perilaku yang diharapkan. Strategi ini menawarkan beberapa keuntungan:

• Pengembang dapat mengubah penerapan aplikasi tanpa mempengaruhi objek pengguna karena hanya interaksi pengguna dengan objek melalui antarmuka.

• Potensi terjadinya kesalahan pengguna berkurang karena kontrol yang dilakukan atas interaksi pengguna dengan aplikasi.

Pewarisan

Banyak objek merupakan lingkungan kita dapat dimodelkan menggunakan serangkaian yang didefinisikan cukup baik dari aturan. Ambil contoh, konsep dari karyawan. Seluruh karyawan membagi seperangkat karakteristik: nama, ID karyawan, dan upah, misalnya. Namun, ada banyak berbagai jenis karyawan: pegawai, supervisor, kasir, dan pejabat CEO, antara lain, masing-masing kemungkinan memiliki beberapa superset dari karakteristik tersebut yang didefinisikan oleh definisi karyawan umum. Dalam hal berorientasi obyek, berbagai tipe karyawan mewarisi definisi karyawan umum, termasuk semua karakteristik dan perilaku yang berkontribusi untuk definisi ini. Pada gilirannya, masing-masing tipe karyawan tertentu dapat diwarisi dengan jenis lain yang lebih spesifik. Sebagai contoh, tipe Petugas mungkin diwariskan dengan petugas siang dan malam seorang pegawai, yang masing-masing mewarisi semua sifat yang ditentukan oleh kedua definisi karyawan dan definisi petugas. Membangun pada ide ini, Anda bisa kemudian membuat kelas Manusia, dan kemudian membuat kelas karyawan sebuah subclass dari Manusia. Efeknya adalah bahwa kelas Karyawan dan semua kelas turunan nya (Petugas, Kasir, Eksekutif, dll) akan segera mewarisi semua karakteristik dan perilaku yang didefinisikan oleh Manusia.

Metodologi Pengembangan berorientasi objek menempatkan persediaan besar pada konsep dari warisan. Strategi ini mendorong penggunaan kembali kode karena Ini mengasumsikan bahwa seseorang akan dapat menggunakan kelas yang dirancang dengan baik (yaitu, kelas yang cukup abstrak untuk memungkinkan untuk digunakan kembali) dalam berbagai aplikasi.

Polimorfisme

Polimorfisme, istilah yang berasal dari bahasa Yunani yang berarti "memiliki berbagai bentuk," mendefinisikan kemampuan OOP untuk mendefinisi ulang, atau berubah bentuk, karakteristik kelas atau perilaku tergantung pada konteks yang digunakan. Kembali ke contoh, anggaplah bahwa perilaku yang berjudul

clockIn dimasukkan dalam definisi karyawan. Untuk karyawan kelas Petugas, perilaku ini mungkin melibatkan sesungguhnya menggunakan sebuah jam waktu untuk tanda waktu sebuah kartu. Untuk karyawan jenis lainnya, Programmer misalnya, clocking mungkin melibatkan penandatanganan ke jaringan perusahaan. Meskipun kedua kelas menurunkan perilaku ini dari kelas karyawan, penerapan sebenarnya dari masing-masing tergantung pada konteks di mana " pada penetapan waktu " diimplementasikan. Ini adalah kekuatan polimorfisme.

Ketiganya Kunci konsep OOP, enkapsulasi, pewarisan, dan polimorfisme, selanjutnya diperkenalkan sebagaimana mereka diterapkan untuk PHP melalui bab ini dan berikutnya.

Konsep kunci OOP

Bagian ini memperkenalkan kunci berorientasi objek konsep pelaksanaanya, termasuk contoh-contoh PHP yang spesifik.

Kelas-kelas

Lingkungan sehari-hari kami terdiri dari entitas yang tak terhitung: tanaman, orang, kendaraan, makanan ... aku bisa berlangsung berjam-jam hanya daftar mereka. Setiap entitas didefinisikan oleh serangkaian tertentu dari karakteristik dan perilaku yang pada akhirnya berfungsi untuk mendefinisikan entitas untuk apa. Sebagai contoh, kendaraan bisa didefinisikan seperti memiliki karakteristik seperti warna, jumlah ban, membuat, model, dan kapasitas, dan perilaku seperti berhenti, pergi, mengaktifkan, dan membunyikan klakson. Dalam kosakata dari OOP, seperti itu wujud dari entitas mendefinisikan atribut dan perilaku yang dikenal sebagai sebuah kelas.

Kelas dimaksudkan untuk mewakili item dalam kehidupan nyata yang Anda ingin untuk memanipulasi dalam aplikasi. Misalnya, jika Anda ingin membuat aplikasi untuk mengelola perpustakaan umum, Anda mungkin ingin memasukkan kelas mewakili buku, majalah, karyawan, acara khusus, pelanggan, dan hal lain yang akan membutuhkan pengawasan. Setiap entitas mencakup serangkaian karakteristik tertentu dan perilaku, yang lebih dikenal dalam OOP sebagai bidang dan metode, masing-masing, yang mendefinisikan entitas sebagai apa itu. Kelas umum PHP penciptaan sintaks sebagai berikut:

class Class_Name

{

// Field declarations defined here

// Method declarations defined here

}

Properti 6-1 menggambarkan sebuah kelas yang mewakili karyawan.

Properti 6-1. Pembuatan Kelas

class Employee

{

private $name;

private $title;

protected $wage;

protected function clockIn() {

echo "Member $this->name clocked in at ".date("h:i:s");

}

protected function clockOut() {

echo "Member $this->name clocked out at ".date("h:i:s");

}

}

Judul Karyawan, kelas ini mendefinisikan tiga bidang, nama, judul, dan upah, di samping dua metode, clockIn dan clockOut. Jangan khawatir jika Anda tidak terbiasa dengan beberapa tata bahasa dan syntax, melainkan akan menjadi jelas kemudian dalam bab ini.

■ Catatan Meskipun tidak ada kode PHP resmi konvensi yang ada, perhatikan hal berikut ini Ekstensi PHP dan panduan Aplikasi Repositori saat membuat kelas Anda. Anda dapat mempelajari lebih lanjut tentang konvensi di http://pear.php.net/. Konvensi ini digunakan di seluruh buku ini.

Objek

Sebuah Kelas menyediakan dasar dari mana Anda dapat membuat contoh yang spesifik dari entitas model kelas, lebih dikenal sebagai objek. Sebagai contoh, sebuah aplikasi manajemen karyawan mungkin termasuk kelas karyawan. Anda kemudian dapat memanggil kelas ini untuk membuat dan memelihara kasus yang spesifik, Sally dan Jim, misalnya.

■ Catatan Praktek membuat objek berdasarkan kelas yang telah ditetapkan sering disebut sebagai Instansiasi kelas.

Objek dibuat menggunakan kata kunci baru, seperti ini:

$employee = new Employee();

Setelah objek dibuat, semua karakteristik dan perilaku yang didefinisikan dalam kelas yang dibuat tersedia untuk objek baru Instansiasi. Tepatnya bagaimana ini dicapai ini diungkapkan di bagian berikut.

Field

Fields adalah atribut yang dimaksudkan untuk menjelaskan beberapa aspek dari sebuah kelas. Mereka sangat mirip dengan standar variabel PHP, kecuali beberapa perbedaan kecil, yang akan Anda pelajari dalam bagian ini. Anda juga akan belajar bagaimana cara mendeklarasikan dan memanggil field dan cara untuk membatasi akses, menggunakan lingkup field.

Mendeklarasikan Field

peraturan tentang deklarasi field sangat mirip dengan pada tempat untuk deklarasi variabel, pada dasarnya, tidak ada satu pun. Karena PHP adalah bahasa longgar diketik, field bahkan tidak selalu perlu dideklarasikan, mereka hanya dapat diciptakan dan ditugaskan secara bersamaan oleh objek kelas, meskipun Anda akan jarang ingin melakukan itu. Sebaliknya, praktek yang umum adalah untuk menyatakan field di awal kelas. Jika diinginkan, Anda dapat memberikan mereka nilai awal saat ini. Sebuah contoh berikut:

class Employee

{

public $name = "John";

private $wage;

}

Dalam contoh ini, dua field, nama dan upah, yang diawali dengan deskripsi lingkup (publik atau pribadi), sebuah praktek yang umum ketika menyatakan field. Setelah dideklarasikan, setiap field dapat digunakan di bawah persyaratan yang diberikan kepadanya dengan deskripsi ruang lingkup. Jika Anda tidak tahu apa ruang lingkup memainkan peran pada field kelas, jangan khawatir, topik itu dibahas kemudian pada bab ini.

Menjalankan Field

Field dirujuk menggunakan operator -> dan, tidak seperti variabel, tidak diawali dengan tanda dolar. Selanjutnya, karena nilai sebuah Field biasanya khusus untuk objek tertentu, maka berhubungan dengan objek seperti ini:

$object->field

Sebagai contoh, kelas Karyawan meliputi nama field, judul, dan upah. Jika Anda membuat sebuah objek bernama $employee dari tipe karyawan, Anda akan mengacu pada bidang-bidang seperti ini:

$employee->name

$employee->title

$employee->wage

Ketika Anda merujuk ke field dari dalam kelas dimana ia didefinisikan, masih diawali dengan operator ->, walaupun bukan berhubungan ke nama kelas, Anda menggunakan kata kunci $this. $this menunjukkan bahwa Anda mengacu pada field yang berada pada kelas yang sama di mana field sedang diakses atau dimanipulasi. Oleh Karena itu, jika Anda untuk menciptakan sebuah metode untuk mengatur nama field di kelas Karyawan, mungkin terlihat seperti ini:

function setName($name)

{

$this->name = $name;

}

Lingkup Field

PHP mendukung lima field kelas lingkup: publik, private, protected, final, dan static. Empat pertama diperkenalkan di bagian ini, dan ruang lingkup static diperkenalkan dalam bagian berikutnya, "Static Class Members."

Public

Anda dapat mendeklarasikan field dalam lingkup publik dengan prakata field dengan kata kunci public. Sebuah contoh berikut:

class Employee

{

public $name;

// Other field and method declarations follow...

}

Field Public kemudian dapat dimanipulasi dan diakses langsung dengan objek yang sesuai, seperti:

$employee = new Employee();

$employee->name = "Mary Swanson";

$name = $employee->name;

echo "New employee: $name";

Mengeksekusi kode ini menghasilkan sebagai berikut:

New employee: Mary Swanson

Walaupun ini mungkin terlihat seperti cara logika untuk menjaga field kelas, Field public sebenarnya umumnya dianggap tabu untuk OOP, dan untuk alasan yang baik. Alasannya untuk menghindari penerapan seperti akses langsung merampas kelas dengan cara yang mudah untuk menegakkan segala macam validasi data. Sebagai contoh, tidak akan mencegah pengguna dari menetapkan nama seperti:

$employee->name = "12345";

Hal ini tentu saja bukan jenis input yang Anda harapkan. Untuk mencegah kecelakaan tersebut dari yang terjadi, dua solusi yang tersedia. Salah satu solusi melibatkan mengenkapsulasi data dalam objek, sehingga hanya tersedia melalui serangkaian antarmuka, yang dikenal sebagai public metode. Data dikemas dengan cara ini dikatakan sebagai private pada lingkup. Solusi kedua yang disarankan melibatkan penggunaan properti dan sebenarnya cukup mirip dengan solusi pertama, meskipun Agak lebih mudah pada banyak kasus. pelingkupan Private diperkenalkan berikutnya, dan bagian pada properti segera berikut.

■ Catatan Pada PHP 6, Anda dapat menggunakan var pada tempat public. Sebelum PHP 6, melakukannya mengangkat peringatan. Namun, Anda harus memastikan menggunakan var untuk alasan kompatibilitas yang harus Anda menciptakan perangkat lunak yang dapat digunakan pada instalasi server yang berbeda.

Private

field private hanya dapat diakses dari dalam kelas dimana mereka didefinisikan. Sebuah contoh berikut:

class Employee

{

private $name;

private $telephone;

}

Fields ditunjuk sebagai private tidak langsung dapat diakses oleh objek contoh, mereka juga tidak tersedia untuk subclass. Jika Anda ingin membuat field Tersedia untuk subclass, pertimbangkan untuk menggunakan lingkup protected sebaliknya, diperkenalkan berikutnya. Sebaliknya, field private harus diakses melalui antarmuka publik terbuka, yang memenuhi salah satu prinsip utama OOP yang diperkenalkan pada awal bab ini: enkapsulasi. Perhatikan contoh berikut, di mana field private dimanipulasi dengan metode public:

class Employee

{

private $name;

public function setName($name) {

$this->name = $name;

}

}

$staff = new Employee;

$staff->setName("Mary");

Mengenkapsulasi pengelolaan field seperti dalam metode memungkinkan pengembang untuk mempertahankan kendali yang ketat atas bagaimana bidang yang ditetapkan. Misalnya, Anda dapat menambahkan ke metode setName () kemampuan untuk memvalidasi bahwa nama ditetapkan untuk hanya karakter abjad dan untuk memastikan bahwa itu tidak kosong. Strategi ini jauh lebih diandalkan daripada meninggalkan ke pengguna akhir untuk memberikan informasi yang valid.

Protected

Sama seperti fungsi yang sering memerlukan variabel dimaksudkan untuk digunakan hanya di dalam fungsi, kelas dapat mencakup field yang digunakan untuk tujuan internal saja. field tersebut dianggap dilindungi dan diawali yang sesuai. Sebuah contoh berikut:

class Employee

{

protected $wage;

}

Field Protected juga dibuat Tersedia mewarisi kelas untuk akses dan manipulasi, suatu sifat yang tidak dimiliki oleh field private. Setiap usaha dengan suatu objek untuk mengakses field Protected akan menghasilkan kesalahan fatal. Karena itu, jika anda berencana untuk memperluas kelas, Anda harus menggunakan field Protected sebagai pengganti field private.

Final

Menandai sebuah field sebagai final mencegah karena ditimpa dengan suatu subclass, masalah dibahas lebih lanjut dalam bab berikutnya. Bidang dirampungkan dinyatakan seperti:

class Employee

{

final $ssn;

}

Anda juga dapat mendeklarasikan metode sebagai final, prosedur untuk melakukan hal itu dijelaskan di bagian selanjutnya "Metode."

Properties

Properties merupakan contoh yang meyakinkan dari fitur OOP yang kuat telah ditawarkan, memastikan perlindungan field dengan memaksa akses dan manipulasi untuk dilakukan melalui metode, namun memungkinkan data yang akan diakses jika itu merupakan field public. Metode ini, dikenal sebagai accesor dan mutator, atau lebih informal sebagai getter dan setter, secara otomatis memicu setiap kali field diakses atau dimanipulasi, masing-masing.

Sayangnya, PHP tidak menawarkan fungsi properti yang mungkin Anda gunakan jika Anda terbiasa dengan bahasa OOP lain seperti C++ dan Java. Oleh karena itu, Anda harus membuat dengan menggunakan metode public untuk meniru fungsi tersebut. Sebagai contoh, Anda mungkin akan membuat metode getter dan setter untuk nama properti dengan mendeklarasikan dua fungsi, getName () dan setName (), masing-masing, dan menanamkan sintaks yang tepat dalam masing-masing. Contoh dari strategi ini disajikan pada akhir bagian ini. Versi PHP 5 dan yang lebih baru memang menawarkan beberapa kemiripan dukungan untuk properti, dilakukan dengan kelebihan beban metode __set dan __get. Metode ini dipakai jika Anda mencoba untuk acuan variabel Member yang tidak ada dalam definisi kelas. Properties dapat digunakan untuk berbagai keperluan, seperti untuk memanggil sebuah pesan kesalahan, atau bahkan untuk

memperluas kelas dengan benar-benar membuat variabel baru dengan cepat. Baik __get dan __set diperkenalkan di bagian ini.

Pengaturan Properties

mutator, atau metode setter, bertanggung jawab baik untuk menyembunyikan properti penerapan tugas dan validasi data kelas sebelum menugaskan ke field kelas. Prototipe nya berikut:

boolean __set([string property name],[mixed value_to_assign])

Yang diperlukan sebagai input nama properti dan nilai yang sesuai, mengembalikan TRUE jika metode ini berhasil dijalankan, dan FALSE sebaliknya. Sebuah contoh berikut:

class Employee

{

var $name;

function __set($propName, $propValue)

{

echo "Nonexistent variable: \$$propName!";

}

}

$employee = new Employee ();

$employee->name = "Mario";

$employee->title = "Executive Chef";

Ini menghasilkan output sebagai berikut:

Tentu saja, Anda dapat menggunakan metode ini untuk benar-benar memperluas kelas dengan Properti baru, seperti ini:

class Employee

{

var $name;

function __set($propName, $propValue)

{

$this->$propName = $propValue;

}

}

$employee = new Employee();

$employee->name = "Mario";

$employee->title = "Executive Chef";

echo "Name: ".$employee->name;

echo "<br />";

echo "Title: ".$employee->title;

Ini menghasilkan sebagai berikut:

Mendapatkan Properties

accessor, atau metode mutator, bertanggung jawab untuk mengenkapsulasi kode yang diperlukan untuk mengambil sebuah variabel kelas. Prototipe nya berikut:

boolean __get([string property name])

Yang diperlukan sebagai input salah satu parameter, nama properti yang nilainya Anda ingin untuk mengambil. Ini harus mengembalikan nilai TRUE pada eksekusi sukses, dan FALSE sebaliknya. Sebuah contoh berikut:

class Employee

{

var $name;

var $city;

protected $wage;

function __get($propName)

{

echo "__get called!<br />";

$vars = array("name","city");

if (in_array($propName, $vars))

{

return $this->$propName;

} else {

return "No such variable!";

}

}

}

$employee = new Employee();

$employee->name = "Mario";

echo $employee->name."<br />";

echo $employee->age;

ini mengembalikan sebagi berikut :

Membuat Custom getter dan setter

Sejujurnya, meskipun ada beberapa keuntungan dengan metode __set () dan __get (), mereka sebenarnya tidak memadai untuk mengelola properti dalam aplikasi berorientasi objek yang kompleks. Karena PHP tidak menawarkan dukungan untuk pembuatan properti pada mode Java atau C #, Anda perlu untuk mengimplementasikan metodologi Anda sendiri. Pertimbangkan untuk membuat dua metode untuk setiap field private, seperti:

<?php

class Employee

{

private $name;

// Getter

public function getName() {

return $this->name;

}

// Setter

public function setName($name) {

$this->name = $name;

}

}

?>

Meskipun strategi semacam ini tidak menawarkan kemudahan yang sama dengan menggunakan properti, hal ini merangkum tugas manajemen dan pengambilan menggunakan standar penamaan konvensi. Tentu saja, Anda harus menambahkan fungsi validasi tambahan untuk setter, namun, contoh sederhana ini seharusnya cukup untuk mendorong poin rumah.

Konstan

Anda dapat mendefinisikan konstanta, atau nilai-nilai yang tidak dimaksudkan untuk diubah, di dalam kelas. Nilai ini akan tetap tidak berubah sepanjang masa instantiated setiap obyek dari kelas itu. Kelas konstanta dibuat seperti ini :

const NAME = 'VALUE';

Misalnya, Anda membuat kelas matematika yang berhubungan berisi sejumlah metode mendefinisikan fungsi matematika, di samping berbagai konstanta:

class math_functions

{

const PI = '3.14159265';

const E = '2.7182818284';

const EULER = '0.5772156649';

// define other constants and methods here...

}

Kelas konstanta kemudian dapat dipanggil seperti ini:

echo math_functions::PI;

Method

Method sangat mirip dengan fungsi, hanya saja ini dimaksudkan untuk menentukan perilaku kelas tertentu. Seperti fungsi, method dapat menerima argumen sebagai input dan dapat mengembalikan nilai ke pemanggil. Method juga dipanggil seperti fungsi, hanya saja method ini diawali dengan nama objek yang memanggil method, seperti ini:

$object->method_name();

Pada bagian ini Anda akan mempelajari semua tentang method, termasuk deklarasi method, pemanggilan method, dan lingkup.

Mendeklarasikan Method

Method dibuat dalam cara yang sama persis seperti fungsi, menggunakan sintaks identik. Perbedaannya hanya antara method dan fungsi normal adalah bahwa deklarasi method biasanya diawali dengan lingkup Penjelas. Sintaks umum berikut:

scope function functionName()

{

// Function body goes here

}

Misalnya, method public berjudul calculateSalary() akan terlihat seperti ini:

public function calculateSalary()

{

return $this->wage * $this->hours;

}

Dalam contoh ini, method ini langsung memanggil dua bidang kelas, upah dan jam, menggunakan kata kunci $this . Ini menghitung gaji dengan mengalikan dua nilai field bersama-sama dan mengembalikan hasilnya seperti fungsi mungkin. Namun, perlu diketahui itu metode tidak terbatas untuk bekerja hanya dengan field kelas; itu sempurna yang valid untuk melewati dalam argumen dengan cara yang sama Anda dapat dengan fungsi.

■ Tip Dalam hal method public Anda dapat secara tegas melupakan menyatakan lingkup dan hanya menyatakan method seperti Anda akan fungsi (tanpa lingkup apapun).

Memanggil Method

Method dipanggil hampir persis dengan cara yang sama seperti fungsi. Melanjutkan contoh sebelumnya, calculateSalary () method akan dipanggil seperti:

$employee = new Employee("Janie");

$salary = $employee->calculateSalary();

Lingkup Method

PHP mendukung enam lingkup method : publik, private, protected, abstrak, final, dan static. Lima lingkup pertama diperkenalkan di bagian ini. Keenam, statis, diperkenalkan dalam bagian berikutnya "Static Class Members."

Public

Method Public dapat diakses dari mana saja kapan saja. Anda menyatakan method public dengan prakata kata kunci public atau dengan berpantang prakata apapun. Contoh berikut menunjukkan kedua praktek deklarasi, selain menunjukkan bagaimana method public bisa dipanggil dari luar kelas:

<?php

class Visitors

{

public function greetVisitor()

{

echo "Hello<br />";

}

function sayGoodbye()

{

echo "Goodbye<br />";

}

}

Visitors::greetVisitor();

$visitor = new Visitors();

$visitor->sayGoodbye();

?>

Berikut ini adalah hasilnya:

Private

Method ditandai sebagai private yang tersedia untuk digunakan hanya di dalam kelas berasal dan tidak dapat dipanggil dengan objek instantiated, atau oleh salah satu subkelas kelas berasal. Method hanya dimaksudkan untuk penolong bagi metode lain yang terletak di dalam kelas yang harus ditandai sebagai private. Sebagai contoh, mempertimbangkan sebuah method, validateCardNumber dipanggil (), digunakan untuk menentukan validitas sintaks pelindung nomor kartu perpustakaan. Meskipun method ini tentu akan terbukti berguna untuk memuaskan sejumlah tugas, seperti membuat pelindung dan diri sendiri-keluar, fungsi tidak digunakan saat dieksekusi sendirian. Oleh karena itu, validateCardNumber () harus ditandai sebagai private, seperti ini:

private function validateCardNumber($number)

{

if (! ereg('^([0-9]{4})-([0-9]{3})-([0-9]{2})') ) return FALSE;

else return TRUE;

}

Mencoba untuk memanggil metode dari objek instantiated menghasilkan pada kesalahan fatal.

Protected

Metode Kelas ditandai sebagai yang dilindungi tersedia hanya untuk kelas yang berasal dan subclass-nya. Method tersebut dapat digunakan untuk membantu kelas atau subclass melakukan penghitungan internal. Misalnya, sebelum mengambil informasi tentang seorang anggota staf tertentu, Anda mungkin ingin memastikan nomor identifikasi karyawan (EIN) yang disahkan pada sebagai argumen ke inisiasi kelas. Anda kemudian akan memverifikasi EIN ini untuk kebenaran sintaks menggunakan method verifyEIN (). Karena metode ini dimaksudkan untuk digunakan hanya dengan metode lain di dalam kelas dan

berpotensi dapat berguna untuk kelas berasal dari karyawan, harus dideklarasikan sebagai protected:

<?php

class Employee

{

private $ein;

function __construct($ein)

{

if ($this->verifyEIN($ein)) {

echo "EIN verified. Finish";

}

}

protected function verifyEIN($ein)

{

return TRUE;

}

}

$employee = new Employee("123-45-6789");

?>

Upaya untuk memanggil verifyEIN () dari luar kelas akan menghasilkan kesalahan fatal karena status ruang lingkup yang dilindungi tersebut.

Abstract

Method Abstrak khusus dimana mereka dinyatakan hanya dalam sebuah kelas induk tetapi diimplementasikan di kelas anak. Hanya saja kelas dinyatakan sebagai abstrak yang dapat mengandung method abstrak. Anda mungkin mendeklarasikan method abstrak jika anda ingin mendefinisikan antarmuka pemrograman aplikasi (API) yang nantinya dapat digunakan sebagai model untuk implementasi. Seorang Pengembang akan tahu bahwa implementasi tertentu tentang metode yang seharusnya bekerja asalkan memenuhi semua persyaratan seperti yang didefinisikan oleh method abstrak. method Abstrak dinyatakan seperti ini:

abstract function methodName();

Misalkan Anda ingin membuat sebuah abstrak kelas karyawan, yang kemudian akan berfungsi sebagai kelas dasar untuk berbagai jenis karyawan (manajer, petugas, kasir, dll):

abstract class Employee

{

abstract function hire();

abstract function fire();

abstract function promote();

abstract demote();

}

Kelas ini kemudian bisa diperpanjang dengan masing-masing kelas karyawan, seperti Manager, Petugas, dan Kasir. Bab 7 memperluas pada konsep ini dan terlihat jauh lebih mendalam pada kelas abstrak.

Final

Menandai metode sebagai final mencegah dari ditimpa oleh subclass. Sebuah metode diselesaikan dinyatakan seperti ini:

class Employee

{

...

final function getName() {

...

}

}

Upaya untuk kemudian menimpa metode diselesaikan menghasilkan pada kesalahan fatal. PHP mendukung enam lingkup metode : publik, private, protected, abstrak, final, dan static.

■ Catatan topik kelas warisan dan mengesampingkan dari method dan field dibahas pada bab berikutnya.

Tipe mengisyaratkan

Tipe mengisyaratkan adalah fitur yang diperkenalkan dengan rilis PHP 5. Tipe mengisyaratkan memastikan bahwa obyek yang dilewatkan ke metode tersebut memang anggota kelas yang diharapkan.

private function takeLunchbreak(Employee $employee)

{

...

}

Perlu diketahui bahwa tipe mengisyaratkan hanya bekerja untuk obyek dan array. Anda tidak dapat menawarkan petunjuk untuk jenis seperti integer, float, atau string.

Konstruktor dan Destructors

Seringkali, Anda ingin mengeksekusi sejumlah tugas saat membuat dan menghancurkan objek. Sebagai contoh, Anda mungkin ingin untuk segera menetapkan beberapa bidang objek baru instantiated. Namun, jika Anda harus melakukannya secara manual, Anda pasti akan lupa untuk mengeksekusi semua tugas yang diperlukan. Pemrograman berorientasi obyek pergi jauh ke arah menghapus kemungkinan seperti kesalahan dengan menawarkan metode khusus, dipanggil constructor dan destructor, yang secara otomatis penciptaan objek dan proses kehancuran.

Constructors

Anda sering ingin menginisialisasi field tertentu dan bahkan memicu melaksanakan metode yang ditemukan ketika suatu objek baru instantiated. Tidak ada yang salah dengan melakukan hal itu segera setelah Instansiasi, tetapi akan lebih mudah jika ini dilakukan untuk anda secara otomatis. Mekanisme tersebut ada pada OOP, yang dikenal sebagai konstruktor. Cukup sederhana, konstruktor didefinisikan sebagai sebuah blok kode yang secara otomatis

menjalankan pada saat Instansiasi objek. Konstruktor OOP menawarkan sejumlah keuntungan :

• Konstruktor dapat menerima parameter, yang bertugas untuk field objek tertentu pada saat penciptaan.

• Konstruktor dapat memanggil metode kelas atau fungsi lainnya.

• Kelas konstruktor dapat memanggil konstruktor lainnya, termasuk yang berasal dari kelas induk.

Bagian ini membahas bagaimana semua keuntungan ini bekerja dengan PHP 5 meningkatkan fungsi konstruktor.

■ Catatan PHP 4 juga ditawarkan konstruktor kelas, tetapi digunakan perbedaan sintaks yang lebih rumit dari yang digunakan pada versi 5. Konstruktor Versi 4 hanyalah metode kelas dengan nama yang sama seperti kelas yang mereka wakili. Konvensi tersebut membuat membosankan untuk mengubah nama kelas. Konvensi Penamaan Konstruktor baru mengatasi masalah ini. Untuk alasan kompatibilitas, namun jika kelas ditemukan tidak mengandung sebuah konstruktor yang memenuhi konvensi penamaan baru, kelas kemudian akan mencari metode dengan nama yang sama seperti kelas, jika terletak, metode ini dianggap konstruktor.

PHP mengenal konstruktor dengan nama __construct. Sintaks umum untuk deklarasi konstruktor berikut:

function __construct([argument1, argument2, ..., argumentN])

{

// Class initialization code

}

Sebagai contoh, misalkan Anda ingin segera mengisi field buku tertentu dengan informasi spesifik untuk yang disediakan ISBN. Sebagai contoh, Anda mungkin ingin mengetahui judul dan pengarang buku, selain berapa banyak salinan perpustakaan memiliki dan berapa banyak saat ini tersedia untuk pinjaman. Kode ini mungkin terlihat seperti ini:

<?php

class Book

{

private $title;

private $isbn;

private $copies;

public function _construct($isbn)

{

$this->setIsbn($isbn);

$this->getTitle();

$this->getNumberCopies();

}

public function setIsbn($isbn)

{

$this->isbn = $isbn;

}

public function getTitle() {

$this->title = "Beginning Python";

print "Title: ".$this->title."<br />";

}

public function getNumberCopies() {

$this->copies = "5";

print "Number copies available: ".$this->copies."<br />";

}

}

$book = new book("159059519X");

$book->getTitle();

$book->getNumberCopies();

?>

Hasilnya adalah sebagai berikut:

Tentu saja, implementasi kehidupan nyata mungkin akan melibatkan agak lebih cerdas mendapatkan metode (misalnya, metode yang query database), tetapi intinya adalah dibuat. instantiate buku objek menghasilkan dalam pemanggilan konstruktor secara otomatis, yang pada gilirannya memanggil setIsbn (), getTitle (), dan getNumberCopies () metode.

Selain itu, jika Anda ingin memastikan bahwa metode ini dipanggil hanya melalui konstruktor, Anda harus menetapkan lingkup mereka dengan private, memastikan bahwa mereka tidak dapat langsung dipanggil oleh objek atau dengan subclass.

Memanggil Konstruktor Induk

PHP tidak secara otomatis memanggil konstruktor induk, Anda harus menyebut secara tegas menggunakan kata kunci induk. Sebuah contoh berikut:

<?php

class Employee

{

protected $name;

protected $title;

function __construct()

{

echo "<p>Staff constructor called!</p>";

}

}

class Manager extends Employee

{

function __construct()

{

parent::__construct();

echo "<p>Manager constructor called!</p>";

}

}

$employee = new Manager();

?>

Hasilnya adalah sebagai berikut:

Mengabaikan untuk menyertakan panggilan dengan parrent:: __construct () hasil dalam pemanggilan hanya konstruktor Manager, seperti ini:

Memanggil Konstruktor yang tidak berhubungan

Anda dapat memanggil konstruktor kelas yang tidak memiliki hubungan dengan objek instantiated hanya dengan prakata __constructor dengan nama kelas, seperti:

classname::__construct()

Sebagai contoh, asumsikan bahwa kelas Manager dan Karyawan yang digunakan dalam contoh sebelumnya tidak dikenakan hubungan hirarkis, melainkan, mereka hanya dua kelas yang terletak di dalam perpustakaan yang sama. Karyawan konstruktor masih bisa dipanggil dalam Manajer konstruktor, seperti ini:

Employee::__construct()

Memanggil konstruktor Karyawan seperti ini menghasilkan hasil yang sama seperti yang ditunjukkan pada contoh.

■ Catatan Anda mungkin bertanya-tanya mengapa sangat berguna fitur konstruktor overloading, tersedia dalam banyak bahasa OOP, belum dibahas. Jawabannya sederhana: PHP tidak mendukung fitur ini.

Destructors

Walaupun objek secara otomatis dihancurkan setelah script selesai pada PHP 4, itu tidak mungkin untuk menyesuaikan proses pembersihan. Dengan diperkenalkannya destructors di PHP 5, kendala ini tidak lebih. Destructors dibuat seperti method lainnya tetapi harus berjudul __destruct (). Sebuah contoh berikut:

<?php

class Book

{

private $title;

private $isbn;

private $copies;

function __construct($isbn)

{

echo "<p>Book class instance created.</p>";

}

function __destruct()

{

echo "<p>Book class instance destroyed.</p>";

}

}

$book = new Book("1893115852");

?>

Sebagai berikut hasilnya :

Saat script selesai, PHP akan menghancurkan segala benda yang berada di memori. Oleh karena itu, jika kelas instantiated dan setiap informasi yang dibuat akibat dari Instansiasi tersebut berada dalam memori, Anda tidak diharuskan untuk secara tegas menyatakan sebuah destructor. Namun, jika data mudah kurang dibuat (katakanlah, disimpan dalam database) sebagai akibat dari Instansiasi dan harus dihancurkan pada saat kehancuran objek, Anda harus membuat destructor kustom.

Kelas Static Member

Terkadang berguna untuk membuat field dan metode yang tidak dipanggil oleh objek tertentu tetapi lebih berkaitan dengan dan dimiliki oleh semua instance kelas. Sebagai contoh, anggaplah bahwa Anda menulis sebuah kelas yang melacak jumlah pengunjung halaman web. Anda tidak ingin menghitung pengunjung untuk me-reset ke nol setiap kali kelas adalah instantiated, dan karena itu Anda akan menetapkan field menjadi ruang lingkup statis:

<?php

class Visitor

{

private static $visitors = 0;

function __construct()

{

self::$visitors++;

}

static function getVisitors()

{

return self::$visitors;

}

}

/* Instantiate the Visitor class. */

$visits = new Visitor();

echo Visitor::getVisitors()."<br />";

/* Instantiate another Visitor class. */

$visits2 = new Visitor();

echo Visitor::getVisitors()."<br />";

?>

Menghasilkan sebagi berikut :

Karena field $visitors dinyatakan sebagai statis, setiap perubahan yang dibuat ke nilai (dalam hal ini melalui kelas konstruktor) disajikan di semua objek instantiated. Juga dicatat bahwa field static dan method yang dirujuk dengan menggunakan kata kunci self dan nama kelas, daripada melalui $this dan operator tanda panah. Hal ini karena mengacu pada field static menggunakan cara yang diperbolehkan untuk "reguler" saudara mereka tidak mungkin dan akan menghasilkan kesalahan sintaks jika dicoba.

■ Catatan Anda tidak dapat menggunakan $this di dalam kelas untuk merujuk ke field yang dideklarasikan sebagai static.

Kata Kunci instanceOf

kata kunci diperkenalkan dengan PHP 5. Dengan itu Anda dapat menentukan apakah suatu objek merupakan turunan dari kelas, adalah subkelas dari kelas, atau mengimplementasikan antarmuka tertentu, dan melakukan sesuatu yang sesuai. Misalnya, Anda ingin mengetahui apakah sebuah objek bernama manajer berasal dari kelas Karyawan:

$manager = new Employee();

...

if ($manager instanceof Employee) echo "Yes";

Ada dua hal yang patut dicatat di sini. Pertama, nama kelas ini tidak dikelilingi oleh semacam pembatas (tanda kutip). Termasuk mereka akan menghasilkan kesalahan sintaks. Kedua, jika perbandingan ini gagal, script akan membatalkan eksekusi. Kata kunci instanceOf ini sangat berguna ketika Anda bekerja dengan sejumlah objek secara bersamaan. Sebagai contoh, Anda mungkin berulang kali memanggil fungsi tertentu tetapi ingin untuk menyiasati tingkah laku fungsi itu sesuai dengan Tipe objek tertentu. Anda mungkin menggunakan pernyataan kasus dan kata kunci instanceOf untuk mengelola perilaku pada cara ini.

Fungsi Penolong

Sejumlah fungsi yang tersedia untuk membantu pengembang mengelola dan menggunakan perpustakaan kelas. Fungsi-fungsi ini diperkenalkan pada bagian ini.

Menentukan Apakah Kelas tersebut ada

fungsi class_exists () mengembalikan TRUE jika kelas ditentukan dengan class_name yang ada dalam konteks skrip yang sedang dijalankan, dan mengembalikan FALSE sebaliknya. Prototipe Its berikut:

boolean class_exists(string class_name)

Menentukan Konteks Objek

fungsi get_class () mengembalikan nama kelas untuk objek yang dimiliki dan mengembalikan FALSE jika objek bukan obyek. Prototipe nya berikut:

string get_class(object object)

Mempelajari Tentang Method Kelas

fungsi get_class_methods () mengembalikan array yang berisi semua nama method yang didefinisikan oleh kelas class_name. Prototipe nya berikut:

array get_class_methods(mixed class_name)

Mempelajari Tentang Field Kelas

fungsi get_class_vars () mengembalikan sebuah array asosiatif yang berisi nama semua field dan Nilai yang berhubungan didefinisikan dalam kelas yang ditentukan oleh class_name. Prototipe nya berikut:

array get_class_vars(string class_name)

Mempelajari Tentang Deklarasi Kelas

fungsi get_declared_classes () mengembalikan sebuah array yang berisi nama semua kelas yang didefinisikan dalam script yang sedang dijalankan. Output dari fungsi ini akan bervariasi sesuai dengan bagaimana PHP Anda distribusi yang dikonfigurasi. Sebagai contoh, melaksanakan get_declared_classes () pada server tes menghasilkan daftar dari 97 kelas. Prototipe nya berikut:

array get_declared_classes(void)

Mempelajari Tentang Field Obyek

fungsi get_object_vars () mengembalikan sebuah array asosiatif yang berisi field yang didefinisikan tersedia untuk objek dan Nilai yang berhubungan. Field yang tidak memiliki nilai akan diberikan NULL dalam array asosiatif. Prototipe nya berikut:

array get_object_vars(object object)

Menentukan Kelas Induk sebuah Objek

fungsi get_parent_class () mengembalikan nama induk dari kelas untuk objek yang dimiliki. Jika kelas objek merupakan kelas dasar, nama kelas akan dikembalikan. Prototipe nya berikut :

string get_parent_class(mixed object)

Menentukan Keberadaan Antarmuka

fungsi interface_exists () menentukan apakah sebuah antarmuka ada, mengembalikan TRUE jika melakukan, dan FALSE sebaliknya. Prototipe nya berikut:

boolean interface_exists(string interface_name [, boolean autoload])

Menentukan tipe Obyek

fungsi is_a() mengembalikan TRUE jika objek dimiliki oleh tipe kelas class_name atau jika milik kelas adalah anak class_name. Jika objek dikenakan tidak ada hubungannya dengan tipe class_name, FALSE dikembalikan. Prototipe nya berikut

boolean is_a(object object, string class_name)

Menentukan Tipe Objek Subkelas

fungsi is_subclass_of () mengembalikan TRUE jika objek dimiliki oleh kelas yang diwariskan dari class_name, dan kembali FALSE sebaliknya. Prototipe nya berikut :

boolean is_subclass_of(object object, string class_name)

Menentukan Keberadaan Method

fungsi method_exists() mengembalikan TRUE jika method bernama method_name tersedia untuk objek, dan mengembalikan FALSE sebaliknya. Prototipe nya berikut:

boolean method_exists(object object, string method_name)

Autoloading Objek

Untuk alasan organisasi, itu praktek umum untuk menempatkan setiap kelas pada file terpisah. Mengembalikan ke skenario perpustakaan, misalkan memanggil aplikasi manajemen untuk kelas mewakili buku, karyawan, acara, dan pelindung. Ditugaskan dengan proyek ini, Anda dapat membuat direktori bernama kelas dan menempatkan file berikut di dalamnya: Books.class.php, Employees.class.php, Events.class.php, dan Patrons.class.php. Sementara ini memang memudahkan manajemen kelas, itu juga mensyaratkan bahwa setiap file terpisah dibuat tersedia untuk setiap script yang membutuhkan itu, umumnya melalui pernyataan require_once (). Oleh karena itu, script meminta semua empat kelas yang akan memerlukan bahwa pernyataan berikut dimasukkan di awal:

require_once("classes/Books.class.php");

require_once("classes/Employees.class.php");

require_once("classes/Events.class.php");

require_once("classes/Patrons.class.php");

Mengelola Penyertaan kelas dengan cara ini bisa menjadi agak membosankan dan menambah langkah tambahan untuk yang rumit proses pengembangan. Untuk menghilangkan tugas tambahan ini, konsep objek autoloading diperkenalkan pada

PHP 5. Autoloading memungkinkan Anda untuk menentukan fungsi khusus __autoload yang secara otomatis dipanggil setiap kali kelas dirujuk yang belum didefinisikan pada script. Anda dapat menghilangkan kebutuhan secara manual menyertakan setiap file kelas dengan mendefinisikan fungsi berikut:

function __autoload($class) {

require_once("classes/$class.class.php");

}

Mendefinisikan fungsi ini menghilangkan kebutuhan untuk pernyataan require_once () karena ketika kelas dipanggil untuk pertama kalinya, __autoload () akan dipanggil, loading kelas sesuai dengan perintah didefinisikan pada __autoload (). Fungsi ini dapat ditempatkan pada file konfigurasi aplikasi global, yang berarti bahwa fungsi hanya akan memerlukan dibuat tersedia untuk script.

■ Catatan require_once () fungsi dan saudaranya diperkenalkan pada Bab 3

RANGKUMAN

Bab ini memperkenalkan dasar pemrograman berorientasi obyek, diikuti dengan gambaran fitur dasar PHP berorientasi objek, mencurahkan perhatian khusus untuk peningkatan dan penambahan yang dibuat tersedia dengan rilis PHP 5.

Bab selanjutnya memperluas pada informasi perkenalan ini, yang mencakup topik-topik seperti warisan, antarmuka, kelas abstrak, dan banyak lagi.

■ ■ ■

CHAPTER 7

Fitur Lanjutan OOP

Bab 6 memperkenalkan dasar-dasar pemrograman berorientasi obyek (OOP). Bab ini dibangun di atas fondasi itu dengan memperkenalkan beberapa fitur OOP lebih maju yang harus Anda pertimbangkan setelah Anda telah menguasai dasar. Secara khusus, bab ini memperkenalkan empat fitur berikut:

Obyek Kloning: Salah satu peningkatan besar model berorientasi objek PHP pada versi 5 adalah perawatan semua objek sebagai referensi dan bukan nilai.

Warisan: Sebagaimana dibahas dalam Bab 6, kemampuan untuk membangun hirarki kelas melalui warisan adalah konsep kunci dari OOP. Bab ini memperkenalkan warisan fitur PHP dan sintaks, dan terdiri dari beberapa contoh yang menunjukkan kunci fitur OOP.

Interface: antarmuka adalah sebuah koleksi tidak diimplementasikan definisi metode dan konstanta yang berfungsi sebagai cetak biru kelas. Antarmuka mendefinisikan tepatnya apa yang dapat dilakukan dengan kelas , tanpa terhenti pada rincian implementasi yang spesifik. Bab ini memperkenalkan dukungan antarmuka PHP dan menawarkan beberapa contoh menunjukkan fitur OOP yang kuat.

Kelas Abstrak: Sebuah Kelas Abstrak adalah kelas yang tidak dapat instantiated. Abstrak kelas dimaksudkan untuk diwariskan oleh kelas yang dapat instantiated, lebih dikenal sebagai kelas nyata. Abstrak kelas bisa sepenuhnya diimplementasikan, diimplementasikan secara parsial, atau tidak diterapkan sama sekali. Bab ini menyajikan konsep-konsep umum sekitar kelas Abstrak, digabungkan dengan pengenalan terhadap kemampuan Kelas abstraksi PHP.

Ruang nama: Ruang nama membantu Anda untuk lebih efektif mengelola basis kode Anda dengan Pemilahan berbagai perpustakaan dan kelas-kelas sesuai dengan konteks. Dalam bab ini saya akan memperkenalkan Anda dengan PHP 6 fitur ruang nama yang baru.

■ Catatan Semua fitur yang diuraikan dalam bab ini hanya tersedia untuk PHP 5 dan di atas.

Lanjutan Fitur OOP Tidak Didukung oleh PHP

Jika Anda memiliki pengalaman pada bahasa berorientasi objek lainnya, Anda mungkin garuk-garuk kepala mengapa daftar sebelumnya fitur tidak termasuk salah satu atau lebih fitur tertentu OOP bahwa Anda sudah terbiasa dengan dari bahasa lain. Alasannya mungkin adalah bahwa PHP tidak mendukung fitur tersebut. Untuk menyelamatkan Anda lebih lanjut dari menggaruk kepala, daftar berikut merinci OOP fitur lanjutan yang tidak didukung oleh PHP dan dengan demikian tidak tercakup dalam bab ini:

Method overloading: Kemampuan dengan mengimplementasikan polimorfisme melalui overloading fungsional tidak didukung oleh PHP dan mungkin tidak akan pernah.

Operator overloading: Kemampuan untuk menetapkan makna tambahan untuk operator berdasarkan pada tipe data yang Anda mencoba dengan memodifikasi tidak membuat potongan kali ini. Berdasarkan diskusi yang ditemukan pada milis pengembang PHP, tidak mungkin bahwa fitur ini akan pernah diimplementasikan.

Warisan Berganda: PHP tidak mendukung pewarisan berganda. Implementasi dari beberapa interface didukung, namun.

Hanya waktu yang akan mengatakan apakah salah satu atau semua fitur tersebut akan didukung dalam versi PHP mendatang.

Object Cloning

Salah satu kelemahan terbesar dari PHP 4 kemampuan berorientasi obyek adalah perlakuan terhadap obyek hanya datatype lain, yang menghambat penggunaan banyak metodologi OOP yang umum, seperti pola desain. Metodologi tersebut tergantung pada kemampuan untuk melewatkan objek dengan metode Kelas lain sebagai acuan, bukan sebagai nilai-nilai, yang tidak lagi praktek default PHP. Syukurlah, hal ini telah diselesaikan dengan PHP 5, dan sekarang semua objek diperlakukan secara default sebagai acuan. Namun, karena semua objek diperlakukan sebagai acuan bukan sebagai nilai, sekarang lebih sulit untuk menyalin objek. Jika Anda mencoba untuk menyalin objek referensi, itu hanya akan menunjuk kembali untuk lokasi pengalamatan objek asli. Untuk memperbaiki masalah dengan menyalin, PHP menawarkan cara tegas untuk kloning sebuah objek.

Contoh Kloning

Anda dapat mengkloning sebuah objek dengan kata kunci clone, seperti:

destinationObject = clone targetObject;

Properti 7-1 menyajikan contoh objek-kloning. Contoh ini menggunakan Contoh Kelas bernama Corporate_Drone, yang berisi dua anggota (employeeid dan tiecolor) dan yang sesuai getter dan setter untuk para anggota. Contoh kode instantiates Objek Corporate_Drone dan menggunakannya sebagai dasar untuk menunjukkan efek dari operasi clone.

Properti 7-1. Mengkloning sebuah Object dengan Kata Kunci clone

<?php

class Corporate_Drone {

private $employeeid;

private $tiecolor;

// Define a setter and getter for $employeeid

function setEmployeeID($employeeid) {

$this->employeeid = $employeeid;

}

function getEmployeeID() {

return $this->employeeid;

}

// Define a setter and getter for $tiecolor

function setTieColor($tiecolor) {

$this->tiecolor = $tiecolor;

}

function getTieColor() {

return $this->tiecolor;

}

}

// Create new Corporate_Drone object

$drone1 = new Corporate_Drone();

// Set the $drone1 employeeid member

$drone1->setEmployeeID("12345");

// Set the $drone1 tiecolor member

$drone1->setTieColor("red");

// Clone the $drone1 object

$drone2 = clone $drone1;

// Set the $drone2 employeeid member

$drone2->setEmployeeID("67890");

// Output the $drone1 and $drone2 employeeid members

printf("drone1 employeeID: %d <br />", $drone1->getEmployeeID());

printf("drone1 tie color: %s <br />", $drone1->getTieColor());

printf("drone2 employeeID: %d <br />", $drone2->getEmployeeID());

printf("drone2 tie color: %s <br />", $drone2->getTieColor());

?>

Mengeksekusi kode ini menghasilkan output sebagai berikut :

Seperti yang Anda lihat, $drone2 menjadi objek Tipe orporate_Drone dan mewarisi nilai anggota dari $drone1. Untuk lebih menunjukkan bahwa $drone2 memang dari tipe Corporate_Drone, anggota employeeid yang juga dipindahkan.

Method __clone()

Anda dapat men-tweak tingkah laku kloning suatu objek dengan mendefinisikan method __clone () dalam Kelas objek. Setiap kode dalam metode ini akan mengeksekusi selama operasi kloning. Hal ini terjadi selain menyalin semua anggota obyek yang ada untuk objek target. Sekarang kelas Corporate_Drone direvisi, menambahkan metode berikut:

function __clone() {

$this->tiecolor = "blue";

}

Dengan menempatkan ini, mari kita membuat objek baru Corporate_Drone, menambahkan nilai anggota employeeid, klon, dan kemudian output beberapa data untuk menunjukkan bahwa objek kloning tiecolor itu memang ditetapkan melalui method __clone (). Properti 7-2 menawarkan contoh.

Properti 7-2. Memperluas Kemampuan clone dengan Method __clone ()

// Create new Corporate_Drone object

$drone1 = new Corporate_Drone();

// Set the $drone1 employeeid member

$drone1->setEmployeeID("12345");

// Clone the $drone1 object

$drone2 = clone $drone1;

// Set the $drone2 employeeid member

$drone2->setEmployeeID("67890");

// Output the $drone1 and $drone2 employeeid members

printf("drone1 employeeID: %d <br />", $drone1->getEmployeeID());

printf("drone2 employeeID: %d <br />", $drone2->getEmployeeID());

printf("drone2 tie color: %s <br />", $drone2->getTieColor());

Mengeksekusi kode ini mengembalikan output sebagai berikut:

Pewarisan

Orang cukup mahir berpikir dalam hal hierarki organisasi, oleh karena itu tidak datang sebagai kejutan bahwa kita membuat pengunaan luas pandangan konsep untuk mengelola berbagai aspek kehidupan kita sehari-hari. Struktur manajemen perusahaan, sistem pajak AS, dan pandangan kita dari tumbuhan dan kerajaan hewan ini hanya beberapa contoh sistem yang sangat bergantung pada konsep hirarki. Karena OOP didasarkan pada dasar pemikiran yang memungkinkan manusia untuk model yang erat dengan sifat dan perilaku lingkungan dunia nyata kita mencoba untuk menerapkan dalam kode, masuk akal juga dapat mewakili hubungan hirarkis.

Sebagai contoh, anggaplah bahwa aplikasi Anda memanggil untuk kelas berjudul Karyawan, yang ditujukan untuk mewakili karakteristik dan perilaku yang bisa diperkirakan dari karyawan. Beberapa anggota kelas yang mewakili karakteristik akan mencakup hal berikut:

• name: Nama Pekerja

• age: Umur Pekerja

• salary: Gaji Karyawan

• yearsEmployed: Jumlah tahun karyawan dengan perusahaan

Beberapa method kelas karyawan mungkin mencakup hal berikut:

• doWork: Melakukan beberapa tugas yang berkaitan dengan pekerjaan

• eatLunch: Mengambil istirahat makan siang

• takeVacation: Memanfaatkan dua minggu yang berharga

Karakteristik ini dan perilaku akan terkait untuk semua tipe karyawan, apapun dari tujuan karyawan atau perawakan dalam organisasi. Tentu saja, meskipun, ada juga perbedaan antara karyawan; sebagai contoh, pihak eksekutif mungkin memegang opsi kepemilikan saham dan dapat menjarah perusahaan, sementara karyawan lain tidak diberikan kemewahan tersebut. Seorang asisten harus dapat mengambil sebuah memo, dan manajer kantor perlu untuk mengambil persediaan pasokan. Meskipun perbedaan tersebut, maka akan sangat efisien jika Anda harus membuat dan memelihara struktur kelas yang berlebihan untuk atribut mereka bahwa semua bagian kelas. Paradigma pengembangan OOP mempertimbangkan hal ini, memungkinkan Anda untuk mewarisi dan membangun kelas yang ada.

Pewarisan Kelas

Sebagaimana diterapkan pada PHP, pewarisan kelas ini dilakukan dengan menggunakan kata kunci extends. Properti 7-3 menunjukkan kemampuan ini, terlebih dahulu menciptakan kelas karyawan dan kemudian menciptakan kelas Executive yang mewarisi dari karyawan.

■ Catatan Sebuah kelas yang mewarisi dari kelas lain dikenal sebagai kelas anak, atau subclass. Kelas yang merupakan diwarisi anak kelas dikenal sebagai induk, atau kelas dasar.

Properti 7-3. Mewarisi dari Kelas dasar

<?php

// Define a base Employee class

class Employee {

private $name;

// Define a setter for the private $name member.

function setName($name) {

if ($name == "") echo "Name cannot be blank!";

else $this->name = $name;

}

// Define a getter for the private $name member

function getName() {

return "My name is ".$this->name."<br />";

}

} // end Employee class

// Define an Executive class that inherits from Employee

class Executive extends Employee {

// Define a method unique to Employee

function pillageCompany() {

echo "I'm selling company assets to finance my yacht!";

}

} // end Executive class

// Create a new Executive object

$exec = new Executive();

// Call the setName() method, defined in the Employee class

$exec->setName("Richard");

// Call the getName() method

echo $exec->getName();

// Call the pillageCompany() method

$exec->pillageCompany();

?>

Ini menghasilkan sebagai berikut :

Karena semua karyawan memiliki nama, kelas Executive diwarisi dari kelas karyawan, menghemat anda dari kerumitan yang harus membuat nama anggota dan getter dan setter yang sesuai. Anda kemudian bisa fokus hanya pada karakteristik yang spesifik untuk seorang eksekutif, dalam hal ini method bernama pillageCompany (). Method ini tersedia hanya untuk tipe objek Executive, dan tidak untuk kelas Karyawan atau kelas lain, kecuali tentu saja Anda membuat

sebuah kelas yang diwarisi dari Executive. Contoh berikut menunjukkan konsep itu, menghasilkan kelas berjudul CEO, yang diwarisi dari Executive:

<?php

class Employee {

...

}

class Executive extends Employee {

...

}

class CEO extends Executive {

function getFacelift() {

echo "nip nip tuck tuck";

}

}

$ceo = new CEO();

$ceo->setName("Bernie");

$ceo->pillageCompany();

$ceo->getFacelift();

?>

Karena Executive telah diwarisi dari karyawan, objek dari tipe CEO juga memiliki semua anggota dan metode yang tersedia untuk Executive, sebagai tambahan method getFacelift (), yang disediakan hanya untuk objek tipe CEO.

Pewarisan dan Konstruktor

Sebuah pertanyaan umum yang berkaitan dengan pewarisan kelas harus dilakukan dengan menggunakan konstruktor. Apakah sebuah konstruktor kelas induk mengeksekusi saat seorang anak instantiated? Jika demikian, apa yang terjadi jika kelas anak juga memiliki konstruktor sendiri? Apakah ini mengeksekusi sebagai tambahan atas konstruktor induk, atau apakah itu menimpa induk? Pertanyaan semacam ini dijawab dalam bagian ini. Jika sebuah kelas induk menawarkan konstruktor, hal ini mengeksekusi saat kelas anak instantiated, asalkan bahwa kelas anak tidak juga memiliki konstruktor. Sebagai contoh, anggaplah bahwa kelas Karyawan menawarkan konstruktor ini:

function __construct($name) {

$this->setName($name);

}

Kemudian Anda menginisiasi kelas CEO dan mengambil nama anggota:

$ceo = new CEO("Dennis");

echo $ceo->getName();

Ini akan menghasilkan sebagai berikut:

Namun, jika kelas anak juga memiliki konstruktor, konstruktor itu akan mengeksekusi saat kelas anak instantiated, terlepas dari apakah kelas induk juga memiliki konstruktor. Sebagai contoh, anggaplah bahwa tambahan kelas

Karyawan berisi konstruktor yang telah dijelaskan sebelumnya, kelas CEO berisi konstruktor ini:

function __construct() {

echo "<p>CEO object created!</p>";

}

Kemudian Anda menginisiasi kelas CEO:

$ceo = new CEO("Dennis");

echo $ceo->getName();

Kali ini akan menghasilkan output berikutnya karena konstruktor CEO mengesampingkan konstruktor Karyawan:

■ ■ ■

CHAPTER 8

Error and Exception Handling

Bahkan jika Anda memakai S pada dada Anda ketika datang ke pemrograman, Anda dapat memastikan bahwa error akan merambat ke semuanya tapi yang paling sepele dari aplikasi. Beberapa dari error -disebabkan- programmer merupakan akibat dari kesalahan yang dibuat selama proses pengembangan. Yang lainnya-disebabkan pengguna, disebabkan oleh ketidakinginan pengguna akhir atau ketidakmampuan untuk menyesuaikan diri dengan kendala aplikasi. Misalnya, pengguna mungkin memasukkan 12341234 ketika ditanya untuk alamat e-mail, tentu saja mengabaikan apa yang sebaliknya akan diharapkan sebagai masukan yang valid. Namun terlepas dari sumber kesalahan, aplikasi Anda harus mampu menemukan dan bereaksi dengan error tak terduga dalam cara anggun, berharap melakukannya tanpa kehilangan data atau menabrak aplikasi. Sebagai tambahan, aplikasi Anda harus mampu memberikan pengguna dengan tanggapan yang diperlukan untuk memahami alasan error tersebut dan berpotensi menyesuaikan perilaku mereka yang sesuai.

Bab ini memperkenalkan beberapa fitur PHP yang ditawarkan untuk menangani error. Secara khusus, topik berikut meliputi:

Konfigurasi direktif: PHP error yang terkait konfigurasi direktif menentukan sebagian besar perilaku penanganan error bahasa itu. Banyak yang paling penting direktif diperkenalkan dalam bab ini.

Error logging : Menjaga log berjalan adalah cara terbaik untuk merekam kemajuan mengenai koreksi error berulang-ulang, serta cepat mengidentifikasi masalah-masalah yang baru diperkenalkan. Dalam bab ini,

anda akan belajar bagaimana untuk log pesan baik syslog sistem operasi Anda dan file log kustom.

Penanganan Pengecualian : Umum di kalangan bahasa populer (Java, C #, dan Python, untuk beberapa nama), penanganan pengecualian telah ditambahkan ke PHP dengan rilis versi 5. Penanganan Pengecualian menawarkan proses standar untuk mendeteksi, menanggapi, dan melaporkan error.

Menurut sejarah, komunitas pengembang telah terkenal lemah dalam mengimplementasikan penanganan error aplikasi yang tepat. Namun, sebagai aplikasi terus tumbuh semakin kompleks dan berat, pentingnya menggabungkan strategi penanganan error yang tepat ke dalam rutinitas Pengembangan harian Anda tidak bisa dibesar-besarkan. Oleh karena itu, Anda harus menginvestasikan beberapa waktu menjadi terbiasa dengan banyak fitur PHP yang ditawarkan dalam hal ini.

Petunjuk Konfigurasi

Sejumlah perintah konfigurasi menentukan perilaku PHP melaporkan error. Banyak dari direktif ini diperkenalkan di bagian ini.

Pengaturan Tingkat Kepekaan Error yang diinginkan

direktif error_reporting menentukan tingkat kepekaan laporan. Empat belas tingkat terpisah yang tersedia, dan berbagai kombinasi dari tingkat ini adalah valid. Lihat Tabel 8-1 untuk daftar lengkap dari tingkat ini. Catatan bahwa setiap level termasuk semua level yang berada di bawahnya. Sebagai contoh, level E_ALL melaporkan setiap pesan menghasilkan dari 13 tingkat lain yang berada di bawahnya dalam tabel.

Tabel 8-1. Tingkat Melaporkan Error PHP

Tingkat Error Deskripsi E_ALL Semua error dan peringatan E_COMPILE_ERROR Fatal error saat kompilasi E_COMPILE_WARNING Peringatan Saat kompilasi E_CORE_ERROR Fatal error yang terjadi selama start awal PHP E_CORE_WARNING Peringatan yang terjadi saat start awal PHP E_ERROR Fatal error saat berjalan E_NOTICE pemberitahuan Menjalankan waktu E_PARSE Saat kompilasi mengurai error E_RECOVERABLE_ERROR Dekat dengan fatal error (diperkenalkan dalam

PHP 5.2) E_STRICT Usulan portabilitas versi PHP (diperkenalkan pada

PHP 5.0) E_USER_ERROR error yang dihasilkan Pengguna E_USER_NOTICE pemberitahuan yang dihasilkan Pengguna E_USER_WARNING peringatan yang dihasilkan Pengguna E_WARNING Peringatan saat berjalan

Diperkenalkan dalam PHP 5, E_STRICT menyarankan kode mengubah berdasarkan penentuan pengembang inti 'untuk metodologi pengkodean yang tepat dan dimaksudkan untuk menjamin portabilitas di seluruh versi PHP. Jika Anda menggunakan fungsi atau sintaks kadaluarsa, menggunakan referensi salah, gunakan var bukan tingkat lingkup untuk field kelas, atau memperkenalkan perbedaan gaya lainnya, E_STRICT memanggil untuk perhatian Anda. Dalam PHP 6, E_STRICT diintegrasikan ke dalam E_ALL, sehingga ketika menjalankan PHP 6, Anda harus mengatur direktif error_reporting untuk E_ALL sehingga melihat saran ini mudah dibawa.

■ Catatan Direktif error_reporting menggunakan karakter tilde (~) untuk mewakili operator logika NOT.

Selama tahap Pengembangan, Anda mungkin akan ingin semua error harus dilaporkan. Oleh karena itu, pertimbangkan pengaturan direktif seperti ini:

error_reporting = E_ALL

Namun, misalkan Anda hanya memperhatikan tentang fatal saat berjalan, mengurai, dan inti error. Anda bisa menggunakan operator logika untuk mengatur direktif sebagai berikut:

error_reporting E_ERROR | E_PARSE | E_CORE_ERROR

Sebagai contoh terakhir, misalkan Anda ingin semua error dilaporkan selain untuk yang dihasilkan pengguna:

error_reporting E_ALL & ~(E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE)

Seperti yang sering terjadi, nama permainan ini adalah untuk tetap baik-informasi tentang permasalahan yang sedang berlangsung aplikasi Anda tanpa menjadi begitu dibanjiri dengan informasi yang Anda berhenti melihat pada log. Luangkan saat bereksperimen dengan berbagai tingkat saat proses Pengembangan, setidaknya sampai Anda menyadari berbagai tipe data laporan bahwa tiap konfigurasi tersedia.

Menampilkan Error ke Browser

Mengaktifkan direktif display_errors menghasilkan tampilan kesalahan memenuhi kriteria yang ditetapkan oleh error_reporting. Anda harus telah direktif ini diaktifkan hanya selama pengujian dan tetap dinonaktifkan ketika situs sedang hidup. Tampilan pesan tersebut tidak hanya memungkinan untuk lebih membingungkan pengguna akhir tetapi juga dapat memberikan informasi lebih lanjut tentang aplikasi / server anda dari yang Anda mungkin ingin membuat tersedia. Misalnya, Anda menggunakan file datar untuk menyimpan pelanggan berita alamat e-mail.

Karena kesalahan konfigurasi hak akses, aplikasi tidak dapat menulis ke file. Namun bukan menangkap kesalahan dan menawarkan respon yang user-friendly, Anda malah memilih untuk memungkinkan PHP untuk melaporkan hal tersebut kepada pengguna akhir. Kesalahan yang ditampilkan akan terlihat seperti ini:

Memang, Anda sudah melanggar aturan utamanya dengan menempatkan sebuah file sensitif dalam pohon document root, tapi sekarang Anda sudah sangat diperburuk masalah dengan menginformasikan pengguna dari lokasi berada dan nama file. Lalu user dapat cukup masukkan URL yang mirip dengan http://www.example.com/subscribers.txt dan dilanjutkan dengan melakukan apa yang dia akan dengan segera Anda untuk menjadi dasar pelanggan murka.

Menampilkan Startup Error

Mengaktifkan direktif display_startup_errors akan menampilkan error yang ditemui saat inisialisasi dari mesin PHP. Seperti display_errors, Anda harus memiliki direktif diaktifkan selama pengujian dan dinonaktifkan ketika situs sedang hidup.

Logging Errors

Error seharusnya login setiap contoh karena rekaman tersebut menyediakan cara yang paling penting untuk menentukan masalah khusus untuk aplikasi Anda dan mesin PHP. Oleh karena itu, Anda harus menjaga log_errors diaktifkan setiap saat. Tepatnya di mana pernyataan log direkam tergantung pada direktif error_log.

Mengidentifikasi File Log

Error dapat dikirim ke syslog sistem atau dapat dikirim ke file ditentukan oleh administrator melalui direktif error_log. Jika direktif ini diatur ke syslog, laporan kesalahan akan dikirim ke syslog pada Linux atau ke event log pada Windows.

Jika Anda tidak terbiasa dengan syslog, itu fasilitas logging berbasis Linux yang menawarkan API untuk log pesan yang berkaitan dengan sistem dan pelaksanaan aplikasi. Windows event log pada dasarnya setara dengan syslog Linux. Log ini umumnya dilihat menggunakan Event Viewer.

Pengaturan Maksimum Panjang Garis Log

direktif log_errors_max_len menetapkan panjang maksimum, dalam byte, setiap item masuk. Default adalah 1.024 byte. Pengaturan direktif ini ke 0 berarti tidak ada panjang maksimum dikenakan.

Mengabaikan Error berulang

Mengaktifkan ignore_repeated_errors menyebabkan PHP untuk mengabaikan pesan error berulang yang terjadi dalam file yang sama dan pada baris yang sama.

Mengabaikan Error Yang Berasal dari Lokasi yang sama

Mengaktifkan ignore_repeated_source Menyebabkan PHP untuk mengabaikan pesan kesalahan berulang yang berasal dari file yang berbeda atau baris yang berbeda dalam file yang sama.

Menyimpan Error Terbaru pada sebuah Variabel

Mengaktifkan track_errors menyebabkan PHP untuk menyimpan pesan eror paling terakhir pada variabel $php_errormsg. Setelah terdaftar, Anda dapat melakukan apa yang Anda harapkan dengan data variabel, termasuk output, simpan ke database, atau melakukan tugas lainnya setelan variabel.

Error Logging

Jika Anda memutuskan untuk log error Anda ke file teks terpisah, pemilik server Web memproses harus memiliki izin yang memadai untuk menulis ke file ini. Selain itu, pastikan untuk menempatkan file ini di luar document root untuk mengurangi kemungkinan penyerang bisa terjadi melewatinya dan berpotensi menemukan beberapa informasi yang berguna untuk diam-diam masuk ke server Anda.

Anda memiliki pilihan untuk pengaturan direktif error_log untuk fasilitas logging sistem operasi (syslog pada Linux, Event Viewer pada Windows), yang akan menghasilkan pesan error PHP yang ditulis dengan fasilitas logging sistem operasi atau ke sebuah file teks. Ketika Anda menulis ke syslog, pesan error terlihat seperti ini:

Ketika Anda menulis ke file teks terpisah, pesan error terlihat seperti ini:

Seperti mana yang akan digunakan, yaitu keputusan bahwa Anda harus membuat pada basis per-lingkungan. Jika situs Web Anda berjalan pada server bersama, menggunakan file teks terpisah atau tabel database mungkin satu-satunya solusi Anda. Jika Anda kontrol server menggunakan syslog mungkin akan ideal karena Anda dapat mengambil keuntungan dari kegunaan syslog-parsing untuk meninjau dan menganalisis log. Berhati-hati untuk menguji kedua rute dan memilih strategi yang paling sesuai dengan konfigurasi lingkungan server Anda.

PHP memungkinkan Anda untuk mengirim pesan khusus serta output error umumnya ke syslog sistem. Empat fungsi memfasilitasi fitur ini. Fungsi-fungsi ini diperkenalkan dalam bagian ini, diikuti dengan contoh kesimpulan.

Inisialisasi Fasilitas Logging PHP

fungsi define_syslog_variables () inisialisasi konstanta yang diperlukan untuk menggunakan openlog (), closelog (), dan syslog () fungsi. Prototipe nya berikut:

void define_syslog_variables(void)

Anda perlu untuk menjalankan fungsi ini sebelum menggunakan fungsi logging berikut.

Membuka Koneksi Logging

fungsi openlog () membuka koneksi ke logger sistem platform dan menentukan tahapan untuk penyisipan satu atau lebih pesan ke dalam log sistem dengan menunjuk beberapa parameter yang akan digunakan dalam konteks log. Prototipe nya berikut:

int openlog(string ident, int option, int facility)

Beberapa parameter yang didukung, termasuk yang berikut:

ident: Mengidentifikasi pesan. Hal ini ditambahkan ke awal setiap masuk. Biasanya nilai ini ditetapkan untuk nama program. Oleh karena itu, Anda mungkin ingin untuk mengidentifikasi pesan terkait PHP seperti "PHP" atau "PHP5."

option: Menentukan pilihan logging digunakan saat menghasilkan pesan. Sebuah daftar pilihan yang tersedia ditawarkan pada Tabel 8-2. Jika lebih dari satu opsi yang dibutuhkan, pisahkan setiap opsi dengan baris vertikal. Misalnya, Anda bisa menentukan tiga pilihan seperti: LOG_ODELAY | LOG_PERROR | LOG_PID.

fasilitas: Membantu menentukan kategori dari program merupakan logging pesan. Ada beberapa kategori, termasuk LOG_KERN, LOG_USER, LOG_MAIL, LOG_DAEMON, LOG_AUTH, LOG_LPR, and LOG_LOCALN, dimana N adalah nilai berkisar antara 0 dan 7. Catatan bahwa fasilitas ditunjuk menentukan tujuan pesan. Misalnya, menunjuk LOG_CRON menghasilkan pada pengajuan pesan berikutnya ke log cron, sedangkan menunjuk LOG_USER meghasilkan pada pengiriman pesan ke file pesan. Kecuali PHP sedang digunakan sebagai interpreter baris perintah, Anda mungkin akan mengatur ini untuk LOG_USER. Ini umum untuk menggunakan LOG_CRON ketika menjalankan skrip PHP dari crontab. Lihat dokumentasi syslog untuk informasi lebih lanjut tentang hal ini.

Tabel 8-2. Pilihan Logging

Option Deskripsi LOG_CONS Jika error terjadi saat menulis ke syslog, mengirim output ke

sistem konsol. LOG_NDELAY Segera membuka koneksi ke syslog. LOG_ODELAY Jangan membuka koneksi sampai pesan pertama telah

diajukan untuk logging. Ini adalah default. LOG_PERROR Output pesan log untuk kedua syslog dan standard error. LOG_PID Menyertakan setiap pesan dengan proses ID (PID).

Menutup Koneksi Logging

fungsi closelog () menutup koneksi yang dibuka oleh openlog (). Prototipe nya berikut:

int closelog(void)

Mengirim pesan ke Tujuan Logging

fungsi syslog () bertanggung jawab untuk mengirimkan pesan khusus ke syslog. Prototipe nya berikut:

int syslog(int priority, string message)

Parameter pertama, prioritas, menentukan tingkat prioritas syslog, disajikan dalam urutan kerumitan di sini:

LOG_EMERG: Sebuah masalah sistem yang serius, kemungkinan sinyal tabrakan

LOG_ALERT: Sebuah kondisi yang harus segera diselesaikan untuk menghindari membahayakan integritas sistem

LOG_CRIT: Sebuah error yang kritis, yang bisa membuat layanan tidak dapat digunakan tetapi tidak harus menempatkan sistem dalam bahaya

LOG_ERR: Kesalahan umum

LOG_WARNING: Peringatan umum

LOG_NOTICE: normal, tetapi Kondisi menonjol

LOG_INFO: Pesan informasi umum

LOG_DEBUG: Informasi yang biasanya hanya terkait ketika debug aplikasi

parameter kedua, pesan, menentukan teks dari pesan bahwa Anda ingin untuk masuk. Jika Anda ingin log pesan error yang disediakan oleh mesin PHP, Anda dapat menyertakan string % m dalam pesan. String ini akan digantikan oleh string pesan error (strerror) yang ditawarkan oleh mesin pada waktu eksekusi.

Sekarang bahwa Anda telah mengenal dengan fungsi terkait, berikut contohnya:

<?php

define_syslog_variables();

openlog("CHP8", LOG_PID, LOG_USER);

syslog(LOG_WARNING,"Chapter 8 example warning.");

closelog();

?>

Potongan ini akan menghasilkan sebuah entri log dalam pesan syslog file seperti berikut:

Penanganan Eksepsi

Bahasa seperti Java, C #, dan Python telah lama digembar-gemborkan untuk efisien kemampuan manajemen error, dicapai melalui penggunaan penanganan eksepsi. Jika Anda memiliki pengalaman sebelumnya bekerja dengan penangan eksepsi, Anda mungkin menggaruk kepala Anda ketika bekerja dengan bahasa apapun, termasuk PHP, yang tidak menawarkan kemampuan serupa. Perasaan ini tampaknya umum di komunitas PHP karena, pada versi 5, penanganan-pengecualian kemampuan telah dimasukkan ke dalam bahasa tersebut. Pada bagian ini, Anda akan mempelajari semua tentang fitur ini, termasuk dasar

konsep, sintaks, dan praktik terbaik. Karena penanganan eksepsi adalah baru untuk PHP, Anda mungkin tidak memiliki pengalaman sebelumnya memasukkan fitur ini ke dalam aplikasi Anda. Oleh karena itu, gambaran umum disajikan tentang hal tersebut. Jika Anda sudah terbiasa dengan konsep dasar, merasa bebas untuk langsung beralih ke bahan PHP-yang spesifik nantinya di bagian ini.

Mengapa Penanganan Exception berguna

Dalam dunia yang sempurna, program anda akan berjalan seperti mesin yg berjalan lancar, yang tidak memiliki baik internal dan pengguna yang diprakarsai error yang mengganggu aliran eksekusi. Namun, pemrograman, seperti dunia nyata, tetap apapun kecuali mimpi indah, dan kejadian tak terduga yang mengganggu mata rantai peristiwa biasa yang terjadi sepanjang waktu. Dalam bahasa programmer, ini kejadian tak terduga yang dikenal sebagai eksepsi. Beberapa bahasa pemrograman memiliki kemampuan untuk bereaksi anggun untuk eksepsi dengan menempatkan sebuah blok kode yang dapat menangani kesalahan. Hal ini dimaksud sebagai melempar eksepsi. Selanjutnya, kode penanganan error mengambil kepemilikan eksepsi, atau menangkap itu. Keuntungan seperti strategi banyak.

Sebagai permulaan, penanganan eksepsi dasarnya untuk membawa proses error-manajemen melalui penggunaan strategi umum tidak hanya mengidentifikasi dan melaporkan error aplikasi, tetapi juga menentukan program apa yang harus dilakukan setelah sebuah kesalahan ditemui. Selanjutnya, sintaks penanganan-eksepsi meningkatkan pemisahan menangani error dari logika aplikasi umumnya, sehingga jauh lebih terorganisir, kode dibaca. Kebanyakan bahasa yang mengimplementasikan penanganan eksepsi abstrak prosesnya menjadi empat langkah:

1. Aplikasi ini mencoba sesuatu. 2. Jika percobaan gagal, fitur penanganan-eksepsi melempar eksepsi.

3. Penangan ditugaskan menangkap eksepsi dan melakukan tugas apapun yang diperlukan.

4. Fitur penanganan-eksepsi membersihkan setiap sumber daya yang dikonsumsi selama usaha.

Hampir semua bahasa dipinjam dari bahasa sintaks penangan C++, yang dikenal sebagai try/catch. Berikut adalah contoh pseudocode sederhana:

try {

perform some task

if something goes wrong

throw exception("Something bad happened")

// Catch the thrown exception

} catch(exception) {

output the exception message

}

Anda juga dapat mengatur beberapa blok penangan, yang memungkinkan Anda untuk menjelaskan berbagai error. Anda bisa melakukannya baik dengan menggunakan berbagai penangan yang telah ditetapkan atau dengan memperluas salah satu penangan yang telah ditetapkan, pada dasarnya menciptakan penangan kustom Anda sendiri. PHP saat ini hanya menawarkan penangan tunggal, eksepsi. Namun, penangan bisa diperpanjang jika diperlukan. Kemungkinan penambahan penangan default akan tersedia pada rilis masa mendatang. Untuk keperluan ilustrasi, mari kita membangun contoh pseudocode sebelumnya, menggunakan kelas penanganan untuk mengelola I / O dan bagian terkait error:

try {

perform some task

if something goes wrong

throw IOexception("Could not open file.")

if something else goes wrong

throw Numberexception("Division by zero not allowed.")

// Catch IOexception

} catch(IOexception) {

output the IOexception message

}

// Catch Numberexception

} catch(Numberexception) {

output the Numberexception message

}

Jika Anda baru untuk eksepsi, seperti sintaks penanganan error standar sepertinya menghirup udara segar. Bagian berikutnya menerapkan konsep untuk PHP dengan memperkenalkan dan menunjukkan berbagai prosedur penanganan-eksepsi yang tersedia pada versi 5.

Penerapan Penanganan Eksepsi PHP

Bagian ini memperkenalkan fitur penanganan-pengecualian PHP. Secara khusus, saya menyinggung dasar kelas eksepsi internal dan menunjukkan bagaimana untuk memperluas kelas dasar ini, menentukan menangkap beberapa blok, dan

memperkenalkan tugas-tugas lain penanganan lanjutan. Mari kita mulai dengan dasar: kelas dasar eksepsi.

Memperluas Dasar Kelas Eksepsi

Kelas dasar eksepsi PHP sebenarnya cukup sederhana pada sifatnya, menawarkan constructor default yang terdiri dari tanpa parameter, sebuah konstruktor overload terdiri dari dua parameter opsional, dan enam method. Masing-masing parameter dan metode diperkenalkan di bagian ini.

Konstruktor Default

default constructor eksepsi dipanggil tanpa parameter. Sebagai contoh, Anda dapat memanggil kelas eksepsi seperti:

throw new Exception();

Setelah eksepsi telah instantiated, Anda dapat menggunakan salah satu dari enam metode diperkenalkan di akhir bagian ini. Namun, hanya empat akan ada gunanya, sedangkan dua lainnya hanya berguna jika Anda instantiate kelas dengan konstruktor overload, diperkenalkan berikutnya.

Overloaded Constructor

konstruktor overload menawarkan fungsionalitas tambahan yang tidak tersedia untuk konstruktor default melalui penerimaan dari dua parameter opsional:

message: Dimaksudkan untuk penjelasan user-friendly yang mungkin akan diteruskan ke pengguna melalui method getMessage (), yang diperkenalkan pada bagian berikut.

Kode error: Dimaksudkan untuk menampung kesalahan identifikasi yang mungkin akan dipetakan untuk beberapa identifier-tabel-pesan. Kode Error sering

digunakan untuk alasan internasionalisasi dan lokalisasi. Kode kesalahan ini dibuat tersedia melalui method getCode (), yang diperkenalkan pada bagian berikutnya. Nanti Anda akan mempelajari bagaimana dasar kelas eksepsi yang dapat diperluas untuk menghitung identifikasi-untuk pencarian- tabel pesan.

Anda dapat memangil konstruktor dalam berbagai cara, masing-masing yang ditunjukkan di sini:

throw new Exception("Something bad just happened", 4)

throw new Exception("Something bad just happened");

throw new Exception("", 4);

Tentu saja, tidak ada yang terjadi pada eksepsi sampai itu tertangkap, seperti yang ditunjukkan kemudian dalam bagian ini.

Method

Enam method yang tersedia untuk kelas eksepsi:

getMessage():Mengembalikan pesan jika ini dilewatkan ke konstruktor.

getCode():Mengembalikan Kode error jika ini dilewatkan ke konstruktor.

getLine():Mengembalikan nomor baris dimana eksepsi dilemparkan.

getFile():Mengembalikan nama dari file melemparkan eksepsi.

getTrace():Mengembalikan array yang terdiri dari informasi yang berhubungan dengan konteks di mana kesalahan terjadi. Secara khusus, array ini termasuk nama file, baris, fungsi, dan parameter fungsi.

getTraceAsString():Mengembalikan semua informasi yang sama seperti yang disediakan olehgetTrace (), selain itu informasi ini dikembalikan sebagai string bukan sebagai array.

■Perhatian Meskipun Anda dapat memperpanjang kelas dasar eksepsi, anda tidak bisa menimpa salah satu metode sebelumnya karena mereka semua dinyatakan sebagai final. Lihat Bab 6 lebih banyak untuk informasi tentang lingkup final.

Properti 8-1 menawarkan contoh sederhana yang mencakup penggunaan konstruktor kelas dasar overload, serta beberapa metode.

Properti 8-1. Meningkatkan Eksepsi

try {

$fh = fopen("contacts.txt", "r");

if (! $fh) {

throw new Exception("Could not open the file!");

}

}

catch (Exception $e) {

echo "Error (File: ".$e->getFile().", line ".

$e->getLine()."): ".$e->getMessage();

}

Jika eksepsi dimunculkan, sesuatu seperti berikut ini akan menjadi output:

Memperluas Kelas Eksepsi

Walaupun kelas dasar eksepsi PHP menawarkan beberapa fitur bagus, dalam beberapa situasi Anda mungkin ingin untuk memperpanjang kelas untuk memungkinkan kemampuan tambahan. Misalnya, Anda ingin internasionalisasi aplikasi Anda untuk memungkinkan menerjemahkan pesan kesalahan. Pesan ini berada dalam array yang terletak di sebuah file teks terpisah. Kelas eksepsi diperpanjang akan membaca dari flat file, pemetaan kode kesalahan dilewatkan ke konstruktor untuk pesan yang sesuai (dimana mungkin telah dilokalisasi ke bahasa yang sesuai). Sebuah contoh file flat berikut :

1,Could not connect to the database!

2,Incorrect password. Please try again.

3,Username not found.

4,You do not possess adequate privileges to execute this command.

Ketika My_Exception adalah instantiated dengan bahasa dan kode error, ini akan dibaca pada file bahasa yang sesuai, menguraikan setiap baris dalam sebuah array asosiatif yang terdiri dari kode error dan pesan yang sesuai. Kelas My_Exception dan penggunaan contoh ditemukan pada properti 8-2.

Listing 8-2. Kelas My_Exception dalam Aksi

class My_Exception extends Exception {

function __construct($language,$errorcode) {

$this->language = $language;

$this->errorcode = $errorcode;

}

function getMessageMap() {

$errors = file("errors/".$this->language.".txt");

foreach($errors as $error) {

list($key,$value) = explode(",",$error,2);

$errorArray[$key] = $value;

}

return $errorArray[$this->errorcode];

}

} # end My_Exception

try {

throw new My_Exception("english",4);

}

catch (My_Exception $e) {

echo $e->getMessageMap();

}

Menangkap Banyak Eksepsi

Programmer yang baik harus selalu memastikan bahwa semua skenario kemungkinan harus dipertimbangkan. Pertimbangkan skenario di mana situs Anda menawarkan bentuk HTML dimana pengguna dapat berlangganan newsletter dengan mengirimkan dia atau alamat e-mail dia. Beberapa hasil mungkin. Sebagai contoh, pengguna dapat melakukan salah satu dari berikut:

• Memberikan alamat e-mail yang valid

• Menyediakan alamat e-mail tidak valid

• Pengabaian untuk memasukkan setiap alamat e-mail pada semua

• Mencoba untuk meningkat serangan seperti SQL injection

Penanganan eksepsi yang tepat akan menghitung semua skenario tersebut. Namun, Anda perlu menyediakan cara untuk menangkap setiap eksepsi. Syukurlah, hal ini mudah dilakukan dengan PHP. Properti 8-3 menunjukkan kode yang memenuhi persyaratan ini.

Properti 8-3. Menangkap Beberapa Eksepsi

<?php

/* The Invalid_Email_Exception class is responsible for notifying the site

administrator in the case that the e-mail is deemed invalid. */

class Invalid_Email_Exception extends Exception {

function __construct($message, $email) {

$this->message = $message;

$this->notifyAdmin($email);

}

private function notifyAdmin($email) {

mail("[email protected]","INVALID

EMAIL",$email,"From:[email protected]");

}

}

/* The Subscribe class is responsible for validating an e-mail address

and adding the user e-mail address to the database. */

class Subscribe {

function validateEmail($email) {

try {

if ($email == "") {

throw new Exception("You must enter an e-mail address!");

} else {

list($user,$domain) = explode("@", $email);

if (! checkdnsrr($domain, "MX"))

throw new Invalid_Email_Exception(

"Invalid e-mail address!", $email);

else

return 1;

}

} catch (Exception $e) {

echo $e->getMessage();

} catch (Invalid_Email_Exception $e) {

echo $e->getMessage();

}

}

/* This method would presumably add the user's e-mail address to

a database. */

function subscribeUser() {

echo $this->email." added to the database!";

}

} #end Subscribe class

/* Assume that the e-mail address came from a subscription form. */

$_POST['email'] = "[email protected]";

/* Attempt to validate and add address to database. */

if (isset($_POST['email'])) {

$subscribe = new Subscribe();

if($subscribe->validateEmail($_POST['email']))

$subscribe->subscribeUser($_POST['email']);

}

?>

Anda dapat melihat bahwa hal itu mungkin untuk dua eksepsi yang berbeda untuk kebakaran, salah satu berasal dari kelas dasar dan satu diperpanjang dari kelas Invalid_Email_Exception.

Ringkasan

Topik yang dibahas dalam bab ini menyentuh banyak pada praktek penanganan error inti yang digunakan dalam industri pemrograman saat ini. Sementara penerapan fitur tersebut sayangnya masih keinginan lebih dari kebijakan, pengenalan kemampuan seperti logging dan penanganan error telah memberikan kontribusi besar terhadap kemampuan programmer untuk mendeteksi dan menanggapi jika masalah tak terduga pada kode mereka.

Bab selanjutnya mengambil pandangan mendalam pada kemampuan PHP –menguraikan string, meliputi bahasa yang kuat fitur ekspresi reguler, dan menawarkan wawasan ke dalam banyak fungsi yang kuat manipulasi string.

■ ■ ■

CHAPTER 9

Strings and

Regular Expressions

Programmer membangun aplikasi yang didasarkan pada peraturan yang ditetapkan mengenai klasifikasi, menguraikan, penyimpanan, dan menampilkan informasi, apakah informasi terdiri dari resep masakan lezat, kuitansi toko penjualan, puisi, atau beberapa koleksi lain dari data. Bab ini memperkenalkan banyak fungsi dari PHP, Anda pasti akan menggunakan secara teratur saat melakukan tugas-tugas seperti.

• Regular ekspresi: Sebuah pengenalan singkat untuk ekspresi regular menyentuh pada fitur dan sintaks PHP dua implementasi yang mendukung ekspresi reguler: POSIX dan Perl. Setelah itu adalah pengenalan yang lengkap untuk perpustakaan masing-masing fungsi PHP.

• manipulasi String: Ini masuk akal bahwa sepanjang karir pemrograman Anda, Anda bagaimanapun akan diminta untuk memodifikasi seluruh aspek dari sebuah string. Banyak fungsi PHP yang kuat yang dapat membantu Anda untuk melakukan itu diperkenalkan dalam bab ini.

• Paket PEAR Validate_US: Dalam bab ini dan selanjutnya, berbagai paket PEAR diperkenalkan yang berkaitan dengan masing-masing hal bab subjek. Bab ini memperkenalkan Validate_US, paket PEAR yang berguna untuk memvalidasi sintaks untuk item yang umum digunakan pada aplikasi dari semua jenis, termasuk nomor telepon, nomor Jaminan Sosial (SSN), kode ZIP, dan singkatan negara. (Jika Anda tidak terbiasa dengan PEAR, itu diperkenalkan pada Bab 11.)

Regular Ekspresi

Ekspresi reguler memberikan dasar untuk menggambarkan atau pencocokan data menurut aturan sintaks yang ditetapkan. Sebuah ekspresi reguler adalah tidak lebih dari suatu pola karakter sendiri, dicocokkan dengan sebidang tertentu dari teks. Urutan ini mungkin pola dengan yang Anda sudah terbiasa, seperti kata anjing, atau mungkin pola dengan makna khusus pada konteks dunia pencocokan pola, <(?)>.*<\ /.?>, untuk contoh.

PHP dibundel dengan fungsi library yang mendukung baik POSIX dan Perl implementasi ekspresi reguler. Masing-masing memiliki gaya yang unik dari sintaks dan dibahas sesuai dalam bagian berikutnya. Perlu diketahui bahwa banyak sekali tutorial telah ditulis mengenai hal ini; Anda dapat menemukan informasi di Web dan pada berbagai buku. Oleh karena itu, bab ini hanya menyediakan pengenalan dasar masing-masing, meninggalkan kepada Anda untuk mencari informasi lebih lanjut.

Jika Anda belum terbiasa dengan mekanisme ekspresi umum, silakan mengambil beberapa waktu untuk membaca tutorial pendek yang menyusun sisa dari bagian ini. Jika Anda sudah menjadi pro ekspresi reguler, merasa bebas untuk melewatkan tutorial untuk bagian " Fungsi Ekspresi Regular PHP (POSIX Extended)."

Sintaks Ekspresi Regular (POSIX)

struktur ekspresi regular POSIX mirip dengan sebuah ekspresi aritmatika yang khas: berbagai elemen (operator) dikombinasikan untuk membentuk suatu ekspresi yang lebih kompleks. Arti dari digabungkan ekspresi reguler elemen adalah apa yang membuat mereka begitu kuat. Anda dapat menempatkan tidak hanya ekspresi literal, seperti kata tertentu atau angka, tetapi juga sejumlah besar perbedaan redaksional namun sintak string yang sama, seperti semua tag HTML pada sebuah file.

Catatan POSIX singkatan dari Portable Operating System Interface for Unix, dan merupakan perwakilan dari serangkaian standar awalnya ditujukan untuk sistem operasi berbasis Unix. POSIX syntax ekspresi reguler adalah suatu usaha untuk menstandarisasi bagaimana ekspresi reguler diterapkan pada banyak bahasa pemrograman.

Ekspresi reguler yang paling sederhana adalah salah satu yang cocok dengan satu karakter, seperti g, yang akan cocok dengan string seperti Gog, haggle, dan bag. Anda bisa menggabungkan beberapa huruf sama untuk membentuk ekspresi yang lebih besar, seperti gan, dimana secara logika akan cocok dengan string yang berisi gan: gang, Organize, atau Reagan, misalnya.

Anda juga dapat menguji beberapa ekspresi berbeda secara bersamaan dengan menggunakan karakter pipa (|).Sebagai contoh, Anda bisa menguji untuk php atau zend melalui ekspresi reguler php|zend.

Sebelum masuk ke dalam PHP fungsi berbasis ekspresi reguler POSIX, mari kita tinjau tiga method POSIX mendukung untuk menempatkan urutan karakter yang berbeda: kurung, bilangan, dan rentang karakter yang telah ditentukan.

Bracket

Braket ([]) digunakan untuk mewakili suatu daftar, atau range, karakter yang harus dicocokkan. Sebagai contoh, bertentangan dengan php ekspresi reguler, yang akan mencari string yang berisi secara tegas string php, ekspresi reguler [php] akan menemukan string yang berisi karakter p atau h. Beberapa karakter yang umum digunakan berkisar berikut:

• [0-9] kecocokan apapun angka desimal dari 0 sampai 9.

• [a-z] kecocokan apapun karakter dari huruf kecil a sampai huruf kecil z.

• [A-Z] cocok dengan karakter dari huruf besar A sampai huruf besar Z.

• [A-Za-z] kecocokan apapun karakter dari huruf besar A sampai huruf kecil z.

Tentu saja, rentang yang ditampilkan di sini bersifat umum, Anda juga dapat menggunakan rentang [0-3] untuk menyesuaikan digit desimal mulai dari 0 sampai 3, atau cakupan [bv] untuk menyesuaikan karakter huruf kecil mulai dari b sampai v. Singkatnya, Anda dapat menentukan setiap rentang ASCII yang Anda inginkan.

Kata bilangan

Terkadang Anda mungkin ingin membuat ekspresi reguler yang mencari karakter berdasarkan frekuensi atau posisi. Sebagai contoh, Anda mungkin ingin mencari string yang berisi satu atau lebih instances dari huruf p, string yang berisi setidaknya dua p, atau bahkan string dengan huruf p sebagai awal mereka atau mengakhiri karakter. Anda dapat membuat permintaan ini dengan memasukkan karakter khusus ke dalam ekspresi reguler. Berikut adalah beberapa contoh karakter ini:

• p+ cocok dengan string apapun yang berisi setidaknya satu p.

• p* cocok dengan string yang berisi nol atau lebih p.

• p? cocok dengan string yang berisi nol atau satu p.

• p{2} cocok dengan string yang berisi serangkaian dua p.

• p{2,3} cocok dengan string yang berisi serangkaian dua atau tiga p.

• p{2,} cocok dengan string yang berisi serangkaian setidaknya dua p.

• p$ cocok dengan string p pada akhir itu.

Masih tanda lainnya dapat dimasukkan sebelum dan dalam rangkaian karakter:

• ^p cocok dengan string p pada awal itu.

• [^a-zA-Z] cocok dengan string bukan yang berisi salah satu karakter mulai dari a sampai z dan A sampai Z.

• p.p cocok dengan string yang berisi p, diikuti oleh karakter apapun, kemudian diikuti dengan p lainnya.

Anda juga dapat menggabungkan karakter khusus untuk membentuk ekspresi yang lebih kompleks. Perhatikan contoh berikut:

• ^.{2}$ cocok dengan string yang berisi tepatnya dua karakter.

• <b>(.*)</b> cocok dengan string apapun tertutup dalam <b> dan </ b>.

• p(hp)* cocok dengan string yang berisi p diikuti dengan nol atau lebih instances dari rangkaian hp.

Anda mungkin ingin mencari karakter khusus pada string bukan menggunakan mereka pada konteks yang khusus saja digambarkan. Untuk melakukannya, karakter harus diganti dengan backslash (\).Sebagai contoh, jika Anda ingin mencari jumlah dolar, ekspresi reguler dapat diterima akan menjadi sebagai berikut: ([\$])([0-9]+); yaitu tanda dolar diikuti dengan satu atau lebih integer. Perhatikan backslash sebelum tanda dolar. Sesuai dengan potensi dari ekspresi regular termasuk $42, $560, dan $3.

Rentang Karakter yang ditetapkan (Kelas Karakter)

Untuk alasan kemudahan, beberapa rentang karakter yang telah ditetapkan, juga dikenal sebagai kelas karakter, yang tersedia. Karakter kelas menentukan seluruh rentang karakter sebagai contoh, alfabet atau mengatur integer. Kelas standar meliputi berikut ini:

[:alpha:]: Huruf kecil dan karakter abjad huruf besar. Hal ini juga dapat ditetapkan sebagai [A-Za-z].

[:alnum:]: Huruf kecil dan karakter abjad huruf besar dan digit angka. Hal ini juga dapat ditetapkan sebagai [A-Za-Z0-9].

[:cntrl:]: Kontrol karakter seperti tab, escape, atau backspace.

[:digit:]: digit Angka 0 sampai 9. Hal ini juga dapat ditetapkan sebagai [0-9].

[:graph:]: Karakter dapat dicetak ditemukan pada jangkauan ASCII 33 sampai 126.

[:lower:]: Karakter abjad huruf kecil. Hal ini juga dapat ditetapkan seperti [a-z].

[:punct:]: Tanda baca karakter, meliputi ~ ` ! @ # $ % ^ & * ( ) - _ + = { } [ ] : ; ' < > , . ? and /.

[:upper:]: karakter abjad Huruf kapital. Hal ini juga dapat ditetapkan seperti [A-Z].

[:space:]: Karakter spasi, meliputi ruang, tab horisontal, tab vertikal, baris baru, form feed, atau mengembalikan carriage.

[:xdigit:]: karakter Heksadesimal. Hal ini juga dapat ditetapkan seperti [a-fa-F0-9].

PHP Fungsi ekspresi Regular (POSIX diperluas)

PHP menawarkan tujuh fungsi untuk mencari string dengan menggunakan POSIX style ekspresi reguler: ereg(), ereg_replace(), eregi(), eregi_replace(), split(), spliti(), and sql_regcase().

Melakukan Pencarian Case-Sensitive

fungsi ereg () mengeksekusi mencari case-sensitif string untuk pola yang ditetapkan, mengembalikan TRUE jika pola ditemukan, dan FALSE sebaliknya. Prototipe nya berikut:

boolean ereg(string pattern, string string [, array regs])

Berikut adalah bagaimana Anda bisa menggunakan ereg () untuk memastikan bahwa username hanya terdiri dari huruf kecil:

<?php

$username = "jasoN";

if (ereg("([^a-z])",$username))

echo "Username must be all lowercase!";

else

echo "Username is all lowercase!";

?>

Dalam hal ini, ereg () akan mengembalikan TRUE, menyebabkan pesan kesalahan ke output.

opsional input parameter regs berisi array dari semua ekspresi dicocokkan yang dikelompokkan dengan tanda kurung pada ekspresi reguler. Memanfaatkan

array ini, Anda dapat segmen sebuah URL menjadi beberapa bagian, seperti ditunjukkan di sini:

<?php

$url = "http://www.apress.com";

// Break $url down into three distinct pieces:

// "http://www", "apress", and "com"

$parts = ereg("^(http://www)\.([[:alnum:]]+)\.([[:alnum:]]+)", $url, $regs);

echo $regs[0]; // outputs the entire string "http://www.apress.com"

echo "<br />";

echo $regs[1]; // outputs "http://www"

echo "<br />";

echo $regs[2]; // outputs "apress"

echo "<br />";

echo $regs[3]; // outputs "com"

?>

Ini mengembalikan sebagai berikut:

Melakukan Pencarian Case-tidak sensitif

fungsi eregi ()mencari string untuk pola yang didefinisikan dalam cara yang case-tidak sensitif. Prototipe nya berikut:

int eregi(string pattern, string string, [array regs])

Fungsi ini dapat berguna ketika memeriksa validitas string, seperti password. Konsep ini diilustrasikan dalam contoh berikut:

<?php

$pswd = "jasonasdf";

if (!eregi("^[a-zA-Z0-9]{8,10}$", $pswd))

echo "Invalid password!";

else

echo "Valid password!";

?>

Dalam contoh ini, user harus memberikan password alphanumeric yang terdiri dari delapan sampai sepuluh karakter, kalau tidak pesan error ditampilkan.

Menggantikan teks pada cara Case-Sensitif

fungsi ereg_replace () beroperasi banyak seperti ereg (), kecuali bahwa kekuatannya diperluas untuk menemukan dan mengganti pola dengan pengganti string, bukan hanya lokasi itu. Prototipe nya berikut:

string ereg_replace(string pattern, string replacement, string string)

Jika tidak cocok yang ditemukan, string akan tetap tidak berubah. Seperti ereg (), ereg_replace () adalah case sensitive. Pertimbangkan contoh:

<?php

$text = "This is a link to http://www.wjgilmore.com/.";

echo ereg_replace("http://([a-zA-Z0-9./-]+)$",

"<a href=\"\\0\">\\0</a>",

$text);

?>

Ini mengembalikan sebagai berikut:

Sebuah fitur yang agak menarik dari kemampuan PHP mengganti string adalah mampu untuk dirujuk kembali substring tanda kurung. Ini bekerja mirip dengan opsional parameter input regs pada fungsi ereg (), kecuali bahwa substring dirujuk menggunakan backslash, seperti \ 0, \ 1, \ 2, dan seterusnya, di mana \ 0 merujuk ke seluruh string, \ 1 pertama yang berhasil yang cocok, dan seterusnya. Sampai sembilan referensi kembali dapat digunakan. Contoh ini menunjukkan bagaimana untuk mengganti semua referensi ke URL bekerja dengan hyperlink:

$url = "Apress (http://www.apress.com)";

$url = ereg_replace("http://([a-zA-Z0-9./-]+)([a-zA-Z/]+)",

"<a href=\"\\0\">\\0</a>", $url);

echo $url;

// Displays Apress (<a href="http://www.apress.com">http://www.apress.com</a>)

■ Catatan Meskipun ereg_replace () bekerja dengan baik, fungsi lain yang sudah ditetapkan bernama str_replace () sebenarnya jauh lebih cepat ketika ekspresi reguler yang kompleks tidak diperlukan. str_replace () dibahas pada bagian berikutnya "Menggantikan Semua Contoh dari sebuah String dengan String lain."

Menggantikan teks pada cara Case-tidak sensitif

Fungsi eregi_replace() beroperasi tepatnya seperti ereg_replace, kecuali mencari pola pada string yang tidak case sensitive. Prototipenya sebagai berikut :

string eregi_replace(string pattern, string replacement, string string)

Memisahkan string kedalam berbagai element berdasarkan pada pola case sensitive

fungsi split () membagi sebuah string ke dalam berbagai elemen, dengan batasan setiap elemen berdasarkan terjadinya pola yang ditetapkan dalam string. Prototipe nya berikut:

array split(string pattern, string string [, int limit])

opsional batas input parameter digunakan untuk menentukan sejumlah elemen ke mana string harus dibagi, mulai dari ujung kiri dari string dan bekerja ke kanan. Dalam kasus di mana pola ini karakter abjad, split () adalah case sensitive. Berikut adalah bagaimana Anda akan menggunakan split () untuk memecah string menjadi potongan-potongan berdasarkan terjadinya tab horisontal dan karakter baris baru:

<?php

$text = "this is\tsome text that\nwe might like to parse.";

print_r(split("[\n\t]",$text));

?>

Ini mengembalikan sebagai berikut:

Memisahkan String ke Berbagai Elemen Berdasarkan Pola Case-tidak sensitif

fungsi spliti () beroperasi persis pada cara yang sama seperti saudaranya, split (), kecuali bahwa pola diperlakukan dengan cara yang case-tidak sensitif. Prototipe nya berikut:

array spliti(string pattern, string string [, int limit])

Menampung Produk hanya Mendukung Regular Ekspresi Case-Sensitif

fungsi sql_regcase () mengubah setiap karakter pada string menjadi ekspresi tanda kurung yang berisi dua karakter. Jika karakter adalah abjad, braket akan berisi kedua bentuk, jika tidak, karakter asli akan dibiarkan tidak berubah. Prototipe nya berikut:

string sql_regcase(string string)

Anda mungkin menggunakan fungsi ini sebagai solusi ketika menggunakan aplikasi PHP untuk berbicara dengan aplikasi lain yang hanya mendukung ekspresi reguler case-sensitive. Bagaimana Anda akan menggunakan sql_regcase () untuk mengkonversi string:

<?php

$version = "php 4.0";

echo sql_regcase($version);

// outputs [Pp] [Hh] [Pp] 4.0

?>

Syntax ekspresi Regular (Perl)

Perl telah lama dianggap sebagai salah satu bahasa penguraian paling kuat yang pernah ditulis, dan menyediakan bahasa ekspresi reguler yang menyeluruh yang dapat digunakan untuk mencari dan mengganti bahkan yang paling rumit dari pola string. Para pengembang PHP merasa bahwa alih-alih menciptakan kembali kemudi ekspresi reguler, sehingga untuk berbicara, mereka harus membuat Perl yang terkenal sintaks ekspresi reguler yang tersedia untuk pengguna PHP.

Sintaks ekspresi reguler Perl sebenarnya merupakan turunan dari implementasi POSIX, menghasilkan kemiripan antara keduanya. Anda dapat menggunakan salah satu kata bilangan diperkenalkan pada bagian POSIX sebelumnya. Sisa dari bagian ini dikhususkan untuk pengenalan singkat dari sintaks ekspresi reguler Perl. Mari kita mulai dengan contoh sederhana dari ekspresi reguler berbasis Perl:

/food/

Perhatikan string food ditutupi antara dua slash ke depan. Sama seperti dengan ekspresi regular POSIX, Anda dapat membangun sebuah string yang lebih kompleks melalui penggunaan kata bilangan:

/fo+/

Ini akan cocok untuk diikuti oleh satu atau lebih karakter. Beberapa sesuai dengan potensi meliputi food, fool, dan fo4. Berikut ini adalah contoh lain menggunakan Sebuah quantifier:

/fo{2,4}/

Sesuai dengan ini f diikuti oleh 2 sampai 4 kejadian o. Beberapa sesuai dengan potensi adalah fool, fooool, dan foosball.

Pengubah

Seringkali Anda ingin men-tweak penafsiran ekspresi reguler, misalnya, Anda mungkin ingin memberitahu ekspresi reguler untuk mengeksekusi pencarian case-insensitive atau untuk mengabaikan komentar tertanam di dalam sintaks. Tweak ini dikenal sebagai pengubah, dan mereka pergi jauh ke arah membantu Anda untuk menulis ekspresi pendek dan ringkas. Beberapa dari pengubah lebih banyak menarik diuraikan pada Tabel 9-1.

Table 9-1. enam contoh modifikasi.

Pengubah Deskripsi i Melakukan pencarian case-tidak sensitif. g Mencari semua kejadian (melakukan pencarian global). m Perlakukan string sebagai beberapa (m for ganda) baris. Secara

default, ^ dan $ karakter sesuai dengan pada awal dan akhir dari string yang bersangkutan. Menggunakan pengubah m akan memungkinkan untuk ^ dan $ untuk menyesuaikan pada awal dari setiap baris dalam sebuah string.

s Perlakukan string sebagai garis tunggal, mengabaikan karakter baris baru yang ditemukan di dalam; ini menyelesaikan hanya kebalikan dari pengubah m.

x Mengabaikan spasi kosong dan komentar dalam ekspresi reguler. U Berhenti pada pencocokan pertama. Banyak bilangan yang

"serakah", mereka menyesuaikan pola sebanyak mungkin bukan hanya berhenti pada pencocokan pertama. Anda dapat menyebabkan mereka menjadi "tidak serakah" dengan pengubah ini.

Pengubah ini ditempatkan langsung setelah ekspresi regular, misalnya, /string/i. Mari kita pertimbangkan beberapa contoh:

/wmd/i: Cocok dengan WMD, wMD, WMd, wmd, dan setiap variasi kasus lainnya string wmd.

/taxation/gi: Menempatkan semua kejadian dari kata taxation. Anda mungkin menggunakan pengubah global untuk menghitung sampai jumlah keseluruhan terjadinya, atau menggunakannya sehubungan dengan fitur pengganti untuk mengganti semua kejadian dengan beberapa string lain.

Metacharacter

Perl ekspresi reguler juga mempekerjakan metakarakter untuk lebih menyaring pencarian mereka. Metakarakter hanya karakter abjad didahului dengan backslash yang melambangkan arti khusus. Daftar metakarakter yang berguna berikut:

\A: Cocok dengan hanya pada awal string.

\b: Cocok dengan batas kata.

\B: Cocok dengan apapun tetapi batas kata.

\d: Cocok dengan karakter digit. Ini sama dengan [0-9].

\D: Cocok dengan bukan karakter digit.

\s: Cocok dengan karakter spasi kosong.

\S: Cocok dengan bukan karakter spasi kosong.

[]:Melampirkan karakter kelas.

():Melampirkan pengelompokan karakter atau mendefinisikan referensi kembali.

$: Cocok dengan akhir baris.

^: Cocok dengan awal baris.

.: Cocok dengan karakter kecuali untuk baris baru.

\: Tanda kutip metakarakter selanjutnya

\w: Cocok dengan setiap string yang berisi hanya garis bawah dan karakter alfanumerik. Ini adalah sama seperti [a-zA-Z0-9_].

\W: Cocok dengan string, menghilangkan garis bawah dan karakter alfanumerik.

Mari kita pertimbangkan beberapa contoh. Ekspresi reguler pertama akan cocok dengan string seperti Pisa dan lisa tetapi bukan sand:

/sa\b/

Berikutnya mengembalikan terjadinya kasus-tidak sensitif pertama dari kata linux:

/\blinux\b/i

Kebalikan dari metakarakter batasan kata \B, pencocokan pada apa pun selain batas kata. Oleh karena itu contoh ini akan cocok dengan string seperti sand dan Sally tetapi bukan Melissa:

/sa\B/

Contoh terakhir mengembalikan semua contoh dari string yang cocok dengan tanda dolar diikuti oleh satu atau lebih banyak digit:

/\$\d+\g

Fungsi Ekspresi Reguler PHP (kompatibel Perl)

PHP menawarkan tujuh fungsi untuk mencari string menggunakan ekspresi reguler kompatibel dengan Perl : preg_grep (), preg_match (), preg_match_all (), preg_quote (), preg_replace (), preg_replace_callback (), dan preg_split (). Fungsi-fungsi ini diperkenalkan pada bagian berikut ini.

Mencari sebuah Array

preg_grep () fungsi pencarian seluruh elemen array, mengembalikan sebuah array yang terdiri dari semua elemen yang cocok dengan suatu pola tertentu. Prototipe nya berikut:

array preg_grep(string pattern, array input [, flags])

Pertimbangkan contoh yang menggunakan fungsi ini untuk mencari array untuk makanan yang diawali dengan p:

<?php

$foods = array("pasta", "steak", "fish", "potatoes");

$food = preg_grep("/^p/", $foods);

print_r($food);

?>

Ini mengembalikan sebagai berikut:

Perhatikan bahwa array sesuai dengan urutan diindeks dari array input. Jika nilai pada posisi indeks cocok, itu termasuk dalam posisi yang sesuai dari output array. Sebaliknya, posisi itu kosong. Jika Anda ingin menghapus terhadap hal dari array yang kosong, menyaring output array melalui array_values fungsi (), yang diperkenalkan pada Bab 5.

Opsional tanda input parameter ditambahkan pada versi PHP 4.3. Ia menerima satu nilai, PREG_GREP_INVERT. Melewati tanda ini akan menghasilkan pengambilan elemen array yang tidak cocok dengan pola.

Mencari Pola

fungsi preg_match () mencari string untuk pola tertentu, mengembalikan TRUE jika ada, dan FALSE sebaliknya. Prototipe nya berikut:

int preg_match(string pattern, string string [, array matches]

[, int flags [, int offset]]])

opsional input parameter pattern_array dapat berisi berbagai bagian dari sub pola yang terkandung dalam pola pencarian, jika berlaku. Berikut adalah contoh menggunakan preg_match () untuk melakukan pencarian case-tidak sensitif:

<?php

$line = "vim is the greatest word processor ever created!";

if (preg_match("/\bVim\b/i", $line, $match)) print "Match found!";

?>

Untuk contoh script ini akan mengkonfirmasi kecocokan jika kata Vim atau vim tersedia, tetapi bukan simplevim, vims, atau evim.

Pencocokan Semua Kemunculan suatu Pola

fungsi preg_match_all () mencocokan semua pemunculan dari pola pada sebuah string, menetapkan setiap kejadian array dalam urutan yang Anda tentukan melalui opsional parameter input. Prototipe nya berikut:

int preg_match_all(string pattern, string string, array pattern_array

[, int order])

urutan Parameter menyetujui dua nilai:

• PREG_PATTERN_ORDER default jika opsional urutan parameter tidak termasuk. PREG_PATTERN_ORDER menentukan urutan dalam cara yang Anda mungkin pikir paling logis: $pattern_array[0] adalah array dari semua yang lengkap cocok dengan pola, $pattern_array[1] adalah array dari semua string pertama yang cocok dengan ekspresi reguler tanda kurung, dan seterusnya.

• PREG_SET_ORDER perintah array sedikit berbeda dari pengaturan default. $pattern_array[0] berisi elemen dicocokkan dengan tanda kurung pertama ekspresi reguler, $pattern_array[1] berisi elemen cocok dengan kedua tanda kurung ekspresi reguler, dan seterusnya.

Berikut ini bagaimana Anda akan menggunakan preg_match_all () untuk menemukan semua string yang tertutup dalam tag HTML tebal:

<?php

$userinfo = "Name: <b>Zeev Suraski</b> <br> Title: <b>PHP Guru</b>";

preg_match_all("/<b>(.*)<\/b>/U", $userinfo, $pat_array);

printf("%s <br /> %s", $pat_array[0][0], $pat_array[0][1]);

?>

Ini mengembalikan sebagai berikut:

Membatasi Spesial Karakter Ekspresi Reguler

fungsi preg_quote () menyisipkan pembatas backslash sebelum setiap karakter dari makna khusus untuk syntax ekspresi reguler. karakter khusus Ini meliputi $ ^ * ( ) + = { } [ ] | \\ : < >. Prototipe nya berikut :

string preg_quote(string str [, string delimiter])

opsional parameter Pemisah menentukan apakah pembatas digunakan untuk ekspresi reguler, menyebabkan itu untuk juga diganti dengan garis miring terbalik. Pertimbangkan contoh:

<?php

$text = "Tickets for the bout are going for $500.";

echo preg_quote($text);

?>

Ini mengembalikan sebagai berikut:

Mengganti Semua Kemunculan suatu Pola

fungsi preg_replace () beroperasi identik dengan ereg_replace (), kecuali bahwa itu menggunakan syntax ekspresi reguler berbasis Perl, mengganti semua kejadian pola dengan penggantinya, dan mengembalikan hasil modifikasi. Prototipe nya berikut:

mixed preg_replace(mixed pattern, mixed replacement, mixed str [, int limit])

opsional input parameter membatasi menentukan berapa banyak kecocokan harus dilakukan. Gagal untuk mengatur batasan atau pengaturan ke -1 akan mengakibatkan penggantian semua kejadian. Pertimbangkan contoh:

<?php

$text = "This is a link to http://www.wjgilmore.com/.";

echo preg_replace("/http:\/\/(.*)\//", "<a href=\"\${0}\">\${0}</a>", $text);

?>

Ini mengembalikan sebagai berikut:

Menariknya, pola dan penggantian parameter input juga bisa menjadi array. Fungsi ini akan siklus melalui tiap elemen dari array masing-masing, membuat penggantian saat ditemukan. Pertimbangkan contoh ini, yang dapat dipasarkan sebagai perusahaan menyaring Laporan:

<?php

$draft = "In 2007 the company faced plummeting revenues and scandal.";

$keywords = array("/faced/", "/plummeting/", "/scandal/");

$replacements = array("celebrated", "skyrocketing", "expansion");

echo preg_replace($keywords, $replacements, $draft);

?>

Ini mengembalikan sebagai berikut:

Membuat custom Penggantian Fungsi

Dalam beberapa situasi Anda mungkin ingin mengganti string berdasarkan pada yang agak lebih kompleks sekumpulan dari kriteria melampaui apa yang disediakan oleh kemampuan default PHP. Sebagai contoh, pertimbangkan situasi di mana Anda ingin memindai beberapa teks untuk singkatan seperti IRS dan memasukkan nama lengkap langsung berikut singkatan. Untuk melakukannya, anda perlu membuat fungsi kustom dan kemudian menggunakan fungsi preg_replace_callback () untuk sementara mengikatnya ke dalam bahasa tersebut. Prototipe nya berikut:

mixed preg_replace_callback(mixed pattern, callback callback, mixed str

[, int limit])

pola Parameter menentukan apa yang Anda cari, sedangkan parameter str mendefinisikan string yang Anda cari. Parameter callback mendefinisikan nama fungsi yang akan digunakan untuk tugas pengganti. Batasan parameter opsional menentukan berapa banyak kecocokan sebaiknya dilakukan. Gagal untuk mengatur batas atau pengaturan ke -1 akan menghasilkan penggantian semua kejadian. Pada contoh berikut, fungsi bernama akronim () dilewatkan ke preg_replace_callback () dan digunakan untuk memasukkan bentuk panjang berbagai singkatan ke dalam string target:

<?php

// This function will add the acronym's long form

// directly after any acronyms found in $matches

function acronym($matches) {

$acronyms = array(

'WWW' => 'World Wide Web',

'IRS' => 'Internal Revenue Service',

'PDF' => 'Portable Document Format');

if (isset($acronyms[$matches[1]]))

return $matches[1] . " (" . $acronyms[$matches[1]] . ")";

else

return $matches[1];

}

// The target text

$text = "The <acronym>IRS</acronym> offers tax forms in

<acronym>PDF</acronym> format on the <acronym>WWW</acronym>.";

// Add the acronyms' long forms to the target text

$newtext = preg_replace_callback("/<acronym>(.*)<\/acronym>/U", 'acronym',

$text);

print_r($newtext);

?>

Ini menghasilkan sebagai berikut :

Memecah String ke Berbagai Elemen Berdasarkan Pola Case-tidak sensitif

fungsi preg_split () beroperasi persis seperti split (), kecuali bahwa pola juga dapat didefinisikan dalam bentuk ekspresi reguler. Prototipe nya berikut:

array preg_split(string pattern, string string [, int limit [, int flags]])

Jika input parameter opsional batas yang ditentukan, hanya membatasi sejumlah penggantian string yang dikembalikan. Pertimbangkan contoh:

<?php

$delimitedText = "Jason+++Gilmore+++++++++++Columbus+++OH";

$fields = preg_split("/\+{1,}/", $delimitedText);

foreach($fields as $field) echo $field."<br />";

?>

Ini mengembalikan sebagai berikut:

■ Catatan Selanjutnya dalam bab ini, pada bagian yang berjudul "Alternatif untuk Fungsi Ekspresi Reguler" menawarkan beberapa fungsi standar yang dapat digunakan sebagai pengganti dari kalimat biasa untuk Tugas tertentu. Dalam banyak kasus, fungsi alternatif ini sebenarnya tampil lebih cepat daripada rekan ekspresi reguler mereka.

Fungsi String Spesifik Lainnya

Selain untuk fungsi berbasis ekspresi reguler dibahas pada paruh pertama dari bab ini, PHP menawarkan lebih dari 100 fungsi kolektif dapat memanipulasi hampir setiap aspek yang bisa dibayangkan dari string. Untuk memperkenalkan setiap fungsi akan keluar dari ruang lingkup buku ini dan hanya akan mengulangi banyak informasi pada dokumentasi PHP. Bagian ini dikhususkan untuk kategori semacam FAQ, fokus pada masalah yang berhubungan dengan string yang

tampaknya paling sering muncul dalam forum komunitas. Bagian ini dibagi menjadi topik sebagai berikut:

• Menentukan panjang string

• Membandingkan dua string

• Manipulasi kasus string

• Konversi string ke dan dari HTML

• Alternatif untuk fungsi ekspresi reguler

• Lapisan dan mengupas string

• Menghitung karakter dan Kata

Menentukan Panjang suatu String

Menentukan panjang string adalah tindakan yang diulang dalam aplikasi yang tak terhitung jumlahnya. Fungsi PHP strlen () menyelesaikan tugas ini cukup baik. Fungsi ini mengembalikan panjang string, dimana setiap karakter dalam string sama dengan satu unit. Prototipe nya berikut :

int strlen(string str)

Contoh berikut memeriksa apakah password pengguna adalah panjang yang dapat diterima:

<?php

$pswd = "secretpswd";

if (strlen($pswd) < 10)

echo "Password is too short!";

else

echo "Password is valid!";

?>

Dalam hal ini, pesan error tidak akan muncul karena password yang dipilih terdiri dari sepuluh karakter, sedangkan ekspresi kondisional memvalidasi apakah target string terdiri kurang dari sepuluh karakter.

Membandingkan Dua String

Membandingkan String bisa dikatakan salah satu fitur yang paling penting dari kemampuan penanganan string-bahasa apapun. Meskipun ada banyak cara di mana dua string dapat dibandingkan untuk kesetaraan, PHP menyediakan empat fungsi untuk melakukan tugas ini: strcmp (), strcasecmp (), strspn (), dan strcspn (). Fungsi-fungsi ini dibahas dalam bagian berikut.

Membandingkan Dua String Kasus sensitif

strcmp () fungsi melakukan, binari-yang aman Membandingkan case-sensitive dari dua string. Prototipe nya berikut:

int strcmp(string str1, string str2)

Ini akan mengembalikan satu dari tiga nilai yang mungkin didasarkan pada hasil perbandingan:

• 0 jika str1 dan str2 adalah sama

• -1 jika str1 kurang dari str2

• 1 jika str2 kurang dari str1

Situs Web sering memerlukan pengguna mendaftar untuk masuk dan kemudian konfirmasikan password, mengurangi kemungkinan salah memasukkan password sebagai akibat dari kesalahan mengetik. strcmp () adalah fungsi yang hebat untuk membandingkan dua entri password karena password sering case sensitif:

<?php

$pswd = "supersecret";

$pswd2 = "supersecret2";

if (strcmp($pswd,$pswd2) != 0)

echo "Passwords do not match!";

else

echo "Passwords match!";

?>

catatan bahwa string harus sama persis agar strcmp () untuk mempertimbangkan mereka sama. Sebagai contoh, Supersecret berbeda dari supersecret. Jika Anda ingin membandingkan string dua kasus tidak peka, pertimbangkan strcasecmp (), diperkenalkan selanjutnya. Hal lain yang umum membingungkan tentang fungsi ini melingkupi perilakunya mengembalikan 0 jika kedua string sama. Hal ini berbeda dengan mengeksekusi sebuah perbandingan string dengan menggunakan operator ==, seperti:

if ($str1 == $str2)

Saat kedua mencapai tujuan yang sama, yaitu untuk membandingkan dua string, perlu diingat bahwa nilai mereka mengembalikan dalam melakukan hal yang berbeda.

Membandingkan Dua String Case tidak peka

fungsi strcasecmp () beroperasi persis seperti strcmp (), kecuali bahwa perbandingan adalah case tidak sensitif. Prototipe nya berikut:

int strcasecmp(string str1, string str2)

Contoh berikut membandingkan dua alamat e-mail, penggunaan ideal untuk strcasecmp () karena kasus tidak menentukan keunikan alamat e-mail:

<?php

$email1 = "[email protected]";

$email2 = "[email protected]";

if (! strcasecmp($email1, $email2))

echo "The email addresses are identical!";

?>

Dalam contoh ini, pesan output karena strcasecmp () melakukan perbandingan case-insensitive dari $email1 dan $email2 dan menentukan bahwa mereka memang identik.

Menghitung Kemiripan Antara Dua String

fungsi strspn () mengembalikan panjang dari segmen pertama pada string yang berisi karakter juga yang ditemukan dalam string lainnya. Prototipe nya berikut:

int strspn(string str1, string str2)

Berikut bagaimana Anda dapat menggunakan strspn () untuk memastikan bahwa password tidak terdiri hanya angka:

<?php

$password = "3312345";

if (strspn($password, "1234567890") == strlen($password))

echo "The password cannot consist solely of numbers!";

?>

Dalam hal ini, pesan kesalahan dikembalikan karena $password memang terdiri hanya dari angka.

Menghitung Perbedaan Antara Dua String

fungsi strcspn () mengembalikan panjang segmen pertama dari sebuah string yang berisi karakter tidak ditemukan dalam string lain. Prototipe nya berikut:

int strcspn(string str1, string str2)

Berikut adalah contoh validasi password dengan menggunakan strcspn ():

<?php

$password = "a12345";

if (strcspn($password, "1234567890") == 0) {

echo "Password cannot consist solely of numbers!";

}

?>

Dalam hal ini, pesan kesalahan tidak akan ditampilkan karena $password tidak terdiri hanya dari angka.

Memanipulasi Kasus String

Empat fungsi yang tersedia untuk membantu Anda dalam memanipulasi kasus karakter dalam string: strtolower (), strtoupper (), ucfirst (), dan ucwords (). Fungsi-fungsi ini dibahas dalam bagian ini.

Mengubah String ke huruf kecil Semua

strtolower () berfungsi mengubah string ke semua huruf kecil, mengembalikan string dimodifikasi. Karakter Nonalphabetical tidak terpengaruh. Prototipe nya berikut:

string strtolower(string str)

Contoh berikut ini menggunakan strtolower () untuk mengkonversi URL ke semua huruf kecil:

<?php

$url = "http://WWW.EXAMPLE.COM/";

echo strtolower($url);

?>

Ini mengembalikan sebagai berikut:

Mengubah String ke Huruf Besar Semua

Sama seperti Anda dapat mengkonversi string menjadi huruf kecil, Anda dapat mengubahnya ke huruf besar. Hal ini dicapai dengan fungsi strtoupper (). Prototipe nya berikut:

string strtoupper(string str)

Karakter Nonalphabetical tidak terpengaruh. Contoh ini menggunakan strtoupper () untuk mengkonversi string ke semua huruf besar:

<?php

$msg = "I annoy people by capitalizing e-mail text.";

echo strtoupper($msg);

?>

Ini mengembalikan sebagai berikut:

Kapital huruf Pertama sebuah String

ucfirst () berfungsi mengkapitalisasi huruf pertama dari string str, jika abjad. Prototipe nya berikut:

string ucfirst(string str)

Nonalphabetical karakter tidak akan terpengaruh. Selain itu, setiap karakter dikapitalisasi yang ditemukan dalam string akan tidak tersentuh. Pertimbangkan contoh ini:

<?php

$sentence = "the newest version of PHP was released today!";

echo ucfirst($sentence);

?>

Ini mengembalikan sebagai berikut:

Catatan bahwa huruf pertama memang dikapitalisasi, huruf kata PHP ini dibiarkan.

Kapitalisasi Setiap Kata pada String

ucwords () berfungsi mengkapitalisasi huruf pertama dari setiap kata pada sebuah string. Prototipe nya berikut:

string ucwords(string str)

Karakter Nonalphabetical tidak terpengaruh. Contoh ini menggunakan ucwords () untuk mengkapitalisasi setiap kata pada sebuah string:

<?php

$title = "O'Malley wins the heavyweight championship!";

echo ucwords($title);

?>

Ini mengembalikan sebagai berikut:

Catatan bahwa jika O'Malley ini sengaja ditulis sebagai O'Malley, ucwords () tidak akan menangkap kesalahan, karena menganggap kata yang akan didefinisikan sebagai string karakter yang dipisahkan dari entitas lain pada string dengan spasi kosong di setiap sisi .

Mengkonversi String ke dan dari HTML

Mengubah string atau file tersebut ke dalam bentuk yang sesuai untuk melihat di Web (dan sebaliknya) adalah lebih mudah daripada anda akan berpikir. Beberapa fungsi yang sesuai untuk tugas-tugas tersebut, semua yang diperkenalkan di bagian ini.

Mengkonversi karakter baris ke HTML Tag Break

nl2br () fungsi mengkonversi semua baris baru (\ n) karakter dalam sebuah string menjadi setara dengan -memenuhi XHTML, <br/>. Prototipe nya berikut:

string nl2br(string str)

Karakter baris baru dapat dibuat melalui spasi baru, atau secara tegas ditulis ke string. Contoh berikut menerjemahkan string teks ke format HTML:

<?php

$recipe = "3 tablespoons Dijon mustard

1/3 cup Caesar salad dressing

8 ounces grilled chicken breast

3 cups romaine lettuce";

// convert the newlines to <br />'s.

echo nl2br($recipe);

?>

Mengeksekusi contoh ini mengembalikan sebagai berikut :

Mengkonvert karakter special untuk setara dengan HTML

Selama umumnya berkomunikasi, Anda bisa menemukan banyak karakter yang tidak disertakan dalam pengkodean teks dokumen, atau tidak tersedia pada keyboard. Contoh dari karakter tersebut meliputi simbol copyright ©, tanda sen (¢), dan aksen kuburan (è). Untuk memfasilitasi kekurangan tersebut, pengaturan kode kunci universal ditemukan, dikenal sebagai referensi kesatuan karakter. Saat entitas diuraikan oleh browser, mereka akan di konvert kedalam rekan yang dapat di kenal. Untuk contoh, tiga karakter tersebut di sediakan sebagai &copy;, &cent;, and &Egrave;, masing-masing.

Untuk melakukan konversi ini, anda dapat mengunakan fungsi htmlentities(). Prototipe nya berikut :

string htmlentities(string str [, int quote_style [, int charset]])

Karena sifat khusus dari tanda kutip dalam penggelembungan, opsional parameter quote_style menawarkan kesempatan untuk memilih bagaimana mereka akan ditangani. Tiga nilai yang diterima:

ENT_COMPAT: Mengkonvert double quotes and mengabaikan single quotes. Ini adalah default.

ENT_NOQUOTES: Mengabaikan baik double and single quotes.

ENT_QUOTES: Mengkonvert baik double and single quotes.

Sebuah opsional parameter kedua, charset, menentukan set karakter yang digunakan untuk konversi. Tabel 9-2 menawarkan daftar karakter set yang didukung. Jika charset dihilangkan, maka akan default ke ISO-8859-1.

Tabel 9-2. htmlentities () yang Didukung Menetapkan Character

Character Set Deskripsi BIG5 BIG5-HKSCS cp866 cp1251 cp1252 EUC-JP GB2312 ISO-8859-1 ISO-8859-15 KOI8-R Shift-JIS UTF-8

Traditional Chinese BIG5 with additional Hong Kong extensions, traditional Chinese DOS-specific Cyrillic character set Windows-specific Cyrillic character set Windows-specific character set for Western Europe Japanese Simplified Chinese Western European, Latin-1 Western European, Latin-9 Russian Japanese ASCII-compatible multibyte 8 encode

Contoh berikut mengubah karakter yang diperlukan untuk ditampilkan Web:

<?php

$advertisement = "Coffee at 'Cafè Française' costs $2.25.";

echo htmlentities($advertisement);

?>

Ini mengembalikan sebagai berikut:

Dua karakter dikonversi, grave accent (è) dan cedilla (ç). Tanda petik tunggal diabaikan karena quote_style pengaturan default ENT_COMPAT.

Menggunakan Karakter Khusus HTML untuk Tujuan Lain

Beberapa karakter memainkan fungsi ganda dalam kedua bahasa markup dan bahasa manusia. Ketika digunakan dalam mode terakhir, karakter ini harus dikonversi menjadi setara ditampilkan mereka. Sebagai contoh, sebuah ampersand harus dikonversi ke &amp;, sedangkan lebih besar-dari karakter harus dikonversi ke &gt;. htmlspecialchars () berfungsi dapat melakukan ini untuk Anda, mengubah karakter berikut setara yang kompatibel. Prototipe nya berikut:

string htmlspecialchars(string str [, int quote_style [, string charset]])

Daftar karakter yang ada htmlspecialchars () dapat mengubah dan format mereka yang mengakibatkan berikut:

• & menjadi &amp;

• " (double quote) menjadi &quot;

• ' (single quote) menjadi &#039;

• < menjadi &lt;

• > menjadi &gt;

Fungsi ini sangat berguna dalam mencegah pengguna dari memasukkan markup HTML ke dalam aplikasi Web interaktif, seperti papan pesan. Contoh berikut mengubah karakter yang berpotensi membahayakan menggunakan htmlspecialchars ():

<?php

$input = "I just can't get <<enough>> of PHP!";

echo htmlspecialchars($input);

?>

Melihat sumber, Anda akan melihat sebagai berikut:

Jika terjemahan tidak perlu, mungkin cara yang lebih efisien untuk melakukan hal ini bisa menggunakan strip_tags (), yang menghapus tag dari string sekaligus.

■ Tip Jika Anda menggunakan gethtmlspecialchars () dalam hubungannya dengan Fungsi seperti nl2br (), Anda harus menjalankan nl2br () setelah gethtmlspecialchars (), jika tidak, tag <br/> yang dihasilkan dengan nl2br () akan dikonversi ke karakter yang terlihat.

Konversi Teks ke dalam HTML Yang Setara

Menggunakan get_html_translation_table () adalah cara mudah untuk menerjemahkan teks ke setara dengan HTML, mengembalikan salah satu dari dua tabel terjemahan (HTML_SPECIALCHARS atau HTML_ENTITIES). Prototipe nya berikut:

array get_html_translation_table(int table [, int quote_style])

Nilai ini dikembalikan kemudian dapat digunakan bersama dengan Fungsi lain yang sudah ditetapkan, strtr () (secara resmi diperkenalkan di akhir bagian ini), pada dasarnya menerjemahkan teks ke dalam kode HTML yang sesuai.

Contoh berikut ini menggunakan get_html_translation_table () untuk mengubah teks ke HTML:

<?php

$string = "La pasta é il piatto piú amato in Italia";

$translate = get_html_translation_table(HTML_ENTITIES);

echo strtr($string, $translate);

?>

Ini mengembalikan string yang diformat sebagai diperlukan untuk rendering browser:

Menariknya, array_flip () mampu membalikkan teks-untuk terjemahan-HTML dan sebaliknya. Asumsikan bahwa daripada mencetak hasil strtr () dalam contoh kode sebelumnya, Anda menetapkan ke variabel $translated_string.

Contoh berikutnya menggunakan array_flip () untuk mengembalikan string ke nilai aslinya:

<?php

$entities = get_html_translation_table(HTML_ENTITIES);

$translate = array_flip($entities);

$string = "La pasta &eacute; il piatto pi&uacute; amato in Italia";

echo strtr($string, $translate);

?>

Ini mengembalikan sebagai berikut:

Membuat Daftar Konversi yang disesuaikan

strtr () berfungsi mengubah semua karakter pada sebuah string yang terkait cocok dengan yang ditemukan dalam array yang telah ditetapkan. Prototipe nya berikut:

string strtr(string str, array replacements)

Contoh ini mengubah tebal ditinggalkan (<b>) karakter untuk setara dengan XHTML:

<?php

$table = array("<b>" => "<strong>", "</b>" => "</strong>");

$html = "<b>Today In PHP-Powered News</b>";

echo strtr($html, $table);

?>

Ini mengembalikan sebagai berikut:

Mengubah HTML ke Teks Biasa

Anda terkadang mungkin perlu mengkonversi file HTML ke teks biasa. Anda Dapat melakukannya menggunakan fungsi strip_tags (), yang menghilangkan semua tag HTML dan PHP dari string, hanya menyisakan entitas teks. Prototipe nya berikut:

string strip_tags(string str [, string allowable_tags])

Opsional Parameter allowable_tags memungkinkan Anda untuk menentukan tag yang Anda ingin dilewati selama proses ini. Contoh ini menggunakan strip_tags () untuk menghapus semua tag HTML dari sebuah string:

<?php

$input = "Email <ahref='[email protected]'>[email protected]</a>";

echo strip_tags($input);

?>

Ini mengembalikan sebagai berikut:

Contoh berikut strip semua tag kecuali tag <a>:

<?php

$input = "This <a href='http://www.example.com/'>example</a>

is <b>awesome</b>!";

echo strip_tags($input, "<a>");

?>

Ini mengembalikan sebagai berikut:

■ Catatan Fungsi lain yang berperilaku seperti strip_tags () adalah fgetss (). Fungsi ini dijelaskan pada Bab 10.

Alternatif untuk Fungsi Ekspresi Reguler

Ketika Anda memproses sejumlah besar informasi, fungsi ekspresi reguler dapat memperlambat hal-hal yang dramatis. Anda harus menggunakan fungsi ini hanya saat Anda tertarik untuk menguraikan string yang cukup rumit yang memerlukan penggunaan ekspresi reguler. Jika Anda tidak tertarik menguraikan untuk ekspresi sederhana, ada berbagai fungsi standar yang mempercepat proses signifikan. Masing-masing fungsi ini dijelaskan dalam bagian ini.

Tokenizing sebuah String Berdasarkan Karakter ditetapkan sebelumnya

strtok () berfungsi mengurai string berdasarkan daftar yang tersedia dari karakter. Prototipe nya berikut:

string strtok(string str, string tokens)

Satu keanehan tentang strtok () bahwa hal itu harus terus menerus dipanggil untuk sepenuhnya tokenize string; setiap panggilan hanya tokenizes potongan berikutnya dari string. Namun, parameter str perlu untuk ditentukan hanya sekali karena fungsi melacak posisi pada str sampai salah satu sepenuhnya tokenizes str atau parameter str baru ditetapkan. Perilaku adalah terbaik dijelaskan melalui sebuah contoh:

<?php

$info = "J. Gilmore:[email protected]|Columbus, Ohio";

// delimiters include colon (:), vertical bar (|), and comma (,)

$tokens = ":|,";

$tokenized = strtok($info, $tokens);

// print out each element in the $tokenized array

while ($tokenized) {

echo "Element = $tokenized<br>";

// Don't include the first argument in subsequent calls.

$tokenized = strtok($tokens);

}

?>

Ini mengembalikan sebagai berikut:

Exploding String Berdasarkan yang ditetapkan Pembatas

explode() berfungsi memisahkan str string ke dalam array substring. Prototipe nya berikut:

array explode(string separator, string str [, int limit])

string asli dibagi ke dalam Elemen yang berbeda dengan memisahkannya berdasarkan karakter pemisah yang ditentukan oleh pemisah. Jumlah elemen dapat dibatasi dengan penyertaan batas opsional. Mari kita gunakan explode() dalam hubungannya dengan sizeof () dan strip_tags () untuk menentukan jumlah total kata pada suatu blok tertentu dari teks:

<?php

$summary = <<< summary

In the latest installment of the ongoing Developer.com PHP series,

I discuss the many improvements and additions to

<a href="http://www.php.net">PHP 5's</a> object-oriented architecture.

summary;

$words = sizeof(explode(' ',strip_tags($summary)));

echo "Total words in summary: $words";

?>

explode () berfungsi akan selalu sangat lebih cepat daripada preg_split (), split (), dan spliti (). Oleh karena itu, selalu menggunakannya bukan yang lain saat ekspresi reguler tidak diperlukan.

■ Catatan Anda mungkin bertanya-tanya mengapa kode sebelumnya lebih menjorok secara konsisten. String multi-line dipisahkan menggunakan sintaks heredoc, yang mengharuskan menutup identifikasi untuk tidak menjadi indentasi meskipun satu ruang. Mengapa pembatasan ini pada tempatnya adalah suatu misteri, meskipun orang akan menganggap itu membuat pekerjaan mesin PHP Agak lebih mudah saat menguraikan string banyak baris. Lihat Bab 3 untuk informasi lebih lanjut tentang heredoc.

Mengubah Array ke String

Sama seperti Anda dapat menggunakan fungsi exlode() untuk membagi dipisahkan string menjadi berbagai elemen array, Anda menggabungkan Elemen array untuk membentuk tunggal string dipisahkan menggunakan fungsi implode (). Prototipe nya berikut:

string implode(string delimiter, array pieces)

Contoh ini membentuk string keluar dari elemen array:

<?php

$cities = array("Columbus", "Akron", "Cleveland", "Cincinnati");

echo implode("|", $cities);

?>

Ini mengembalikan sebagai berikut:

Melakukan Penguraian String yang kompleks

fungsi strpos () menemukan posisi terjadinya case-sensitif pertama dari substr dalam sebuah string. Prototipe nya berikut:

int strpos(string str, string substr [, int offset])

Parameter masukan opsional diimbangi menentukan di posisi mana untuk memulai pencarian. Jika substr tidak ada di str, strpos () akan mengembalikan FALSE. Parameter opsional diimbangi menentukan posisi dari mana strpos () akan mulai mencari. Contoh berikut menentukan timestamp dari index.html pertama kali diakses:

<?php

$substr = "index.html";

$log = <<< logfile

192.168.1.11:/www/htdocs/index.html:[2006/02/10:20:36:50]

192.168.1.13:/www/htdocs/about.html:[2006/02/11:04:15:23]

192.168.1.15:/www/htdocs/index.html:[2006/02/15:17:25]

logfile;

// What is first occurrence of the time $substr in log?

$pos = strpos($log, $substr);

// Find the numerical position of the end of the line

$pos2 = strpos($log,"\n",$pos);

// Calculate the beginning of the timestamp

$pos = $pos + strlen($substr) + 1;

// Retrieve the timestamp

$timestamp = substr($log,$pos,$pos2-$pos);

echo "The file $substr was first accessed on: $timestamp";

?>

Ini mengembalikan posisi di mana file index.html pertama kali diakses:

Fungsi stripos () beroperasi identik dengan strpos (), kecuali bahwa itu mengeksekusi pencarian case-tidak sensitif.

Menemukan Kejadian Terakhir sebuah String

fungsi strrpos () menemukan kemunculan akhir string, mengembalikan posisi numeriknya. Prototipe nya berikut:

int strrpos(string str, char substr [, offset])

Parameter opsional diimbangi menentukan posisi dari mana strrpos () akan mulai mencari.

Misalnya anda ingin mengupas ke bawah panjang ringkasan berita, memotong ringkasan dan mengganti komponen yang dipotong dengan elipsis. Namun, bukan hanya memotong ringkasan secara eksplisit pada panjang yang diinginkan, Anda ingin untuk mengoperasikan dalam mode user-friendly, memotong pada akhir kata yang paling dekat dengan panjang potongan. Fungsi ini sangat ideal untuk tugas semacam itu. Pertimbangkan contoh ini:

<?php

// Limit $summary to how many characters?

$limit = 100;

$summary = <<< summary

In the latest installment of the ongoing Developer.com PHP series,

I discuss the many improvements and additions to

<a href="http://www.php.net">PHP 5's</a> object-oriented

architecture.

summary;

if (strlen($summary) > $limit)

$summary = substr($summary, 0, strrpos(substr($summary, 0, $limit),

' ')) . '...';

echo $summary;

?>

Ini mengembalikan sebagai berikut:

Mengganti Semua Contoh sebuah String dengan String lain

fungsi str_replace () case sensitif menggantikan semua contoh dari sebuah string dengan yang lain. Prototipe nya berikut:

mixed str_replace(string occurrence, mixed replacement, mixed str [, int count])

Jika kejadian tidak ditemukan di str, string asli dikembalikan tidak dimodifikasi. Jika jumlah parameter opsional didefinisikan, hanya menghitung kejadian yang ditemukan pada str yang akan diganti.

Fungsi ini sangat ideal untuk menyembunyikan alamat e-mail dari otomatis alamat e-mail program pencarian:

<?php

$author = "[email protected]";

$author = str_replace("@","(at)",$author);

echo "Contact the author of this article at $author.";

?>

Ini mengembalikkan sebagai berikut :

Fungsi str_ireplace () beroperasi identik dengan str_replace (), kecuali bahwa hal itu mampu menjalankan pencarian case-insensitive.

Mengambil Bagian dari sebuah String

fungsi strstr () mengembalikan sisa dari string awal dengan kejadian pertama dari string yang telah ditetapkan. Prototipe nya berikut:

string strstr(string str, string occurrence)

Contoh ini menggunakan fungsi dalam hubungannya dengan fungsi ltrim () untuk mengambil nama domain dari alamat e-mail:

<?php

$url = "[email protected]";

echo ltrim(strstr($url, "@"),"@");

?>

Ini mengembalikan sebagai berikut:

Mengembalikan Bagian dari String Berdasarkan diimbagi ditetapkan sebelumnya

Fungsi substr () mengembalikan bagian dari string yang terletak antara yang sudah ditetapkan diawal diimbangi dan panjang posisi. Prototipe nya berikut:

string substr(string str, int start [, int length])

Jika parameter opsional panjang tidak ditentukan, substring dianggap string mulai dari awal dan berakhir pada akhir str. Ada empat poin yang harus diingat saat menggunakan fungsi ini:

• Jika dimulai positif, string dikembalikan akan dimulai pada posisi awal string.

• Jika dimulai adalah negatif, string dikembalikan akan dimulai pada posisi panjang-awal string.

• Jika panjang disediakan dan positif, string dikembalikan akan terdiri dari karakter antara start dan start + panjang. Jika jarak ini melebihi panjang string total, hanya string antara awal dan akhir string akan dikembalikan.

• Jika panjang disediakan dan negatif, string dikembalikan yang akan berakhir panjang karakter dari akhir str.

Perlu diingat bahwa memulai adalah diimbangi dari karakter pertama dari str, sehingga thereturned string akan benar-benar dimulai pada karakter mulai posisi + 1. Pertimbangkan contoh dasar:

<?php

$car = "1944 Ford";

echo substr($car, 5);

?>

Ini mengembalikkan sebagi berikut :

Contoh berikut ini menggunakan parameter panjang:

<?php

$car = "1944 Ford";

echo substr($car, 0, 4);

?>

Ini mengembalikan sebagai berikut:

Contoh terakhir menggunakan parameter panjang negatif:

<?php

$car = "1944 Ford";

$yr = echo substr($car, 2, -5);

?>

Ini mengembalikan sebagai berikut:

Menentukan Frekuensi Penampilan String

fungsi substr_count () mengembalikan berapa kali satu string terjadi dalam lainnya. Prototipe nya berikut:

int substr_count(string str, string substring)

Contoh berikut ini menentukan berapa kali seorang konsultan IT menggunakan berbagai istilah-istilah dalam presentasinya:

<?php

$buzzwords = array("mindshare", "synergy", "space");

$talk = <<< talk

I'm certain that we could dominate mindshare in this space with

our new product, establishing a true synergy between the marketing

and product development teams. We'll own this space in three months.

talk;

foreach($buzzwords as $bw) {

echo "The word $bw appears ".substr_count($talk,$bw)." time(s).<br />";

}

?>

Ini mengembalikan sebagi berikut :

Mengganti Bagian dari sebuah String dengan String lainnya

fungsi substr_replace () menggantikan sebagian dari string dengan string pengganti, dimulai penggantian pada posisi awal yang ditentukan dan berakhir di panjang pengganti yang telah ditetapkan. Prototipe nya berikut:

string substr_replace(string str, string replacement, int start [, int length])

Sebagai alternatif, penggantian akan berhenti pada penempatan yang lengkap dari pengganti pada str. Ada beberapa perilaku yang harus diingat mengenai Nilai awal dan panjang:

• Jika mulai positif, penggantian akan dimulai pada awal karakter.

• Jika memulai adalah negatif, penggantian akan dimulai pada panjang str - dimulai.

• Jika panjang disediakan dan positif, pengganti akan karakter panjang jangka.

• Jika panjang disediakan dan negatif, penggantian akan berakhir pada panjang str - karakter panjangnya.

Misalnya anda membangun situs e-commerce dan dalam profil user antarmuka Anda ingin menampilkan hanya empat digit terakhir yang disediakan nomor kartu kredit. Fungsi ini sangat ideal untuk tugas seperti itu:

<?php

$ccnumber = "1234567899991111";

echo substr_replace($ccnumber,"************",0,12);

?>

Ini mengembalikan sebagai berikut:

Lapisan dan pengupasan sebuah String

Untuk alasan format, Anda terkadang perlu memodifikasi panjang string melalui baik lapisan atau pengupasan karakter. PHP menyediakan sejumlah fungsi untuk melakukannya. Bagian ini membahas banyak fungsi yang umum digunakan.

Pemangkasan Karakter dari Awal String

fungsi ltrim () menghapus berbagai karakter dari awal string, meliputi ruang putih, horizontal tab (\ t), newline (\ n), carriage return (\ r), NULL (\ 0), dan tab vertikal (\ x0b). Prototipe nya berikut:

string ltrim(string str [, string charlist])

Anda dapat menetapkan karakter lain untuk dihapus dengan mendefinisikan mereka dalam parameter opsional charlist.

Pemangkasan Karakter dari Akhir String

fungsi rtrim () beroperasi identik dengan ltrim (), kecuali bahwa itu menghilangkan karakter yang ditentukan dari sisi kanan sebuah string. Prototipe nya berikut:

string rtrim(string str [, string charlist])

Pemangkasan Karakter dari Kedua Sisi String

Anda dapat berpikir dari Fungsi trim () sebagai kombinasi ltrim () dan rtrim (), kecuali bahwa itu menghilangkan karakter yang ditentukan dari kedua sisi dari string:

string trim(string str [, string charlist])

Lapisan sebuah String

Fungsi str_pad () pembalut string dengan yang ditentukan sejumlah karakter. Prototipe nya berikut:

string str_pad(string str, int length [, string pad_string [, int pad_type]])

Jika parameter opsional pad_string tidak didefinisikan, str akan diisi dengan spasi kosong, jika tidak, maka akan diisi dengan pola karakter yang ditentukan oleh pad_string. Secara default, string akan melangkah ke kanan, namun parameter opsional pad_type dapat diberikan nilai STR_PAD_RIGHT, STR_PAD_LEFT, atau STR_PAD_BOTH, lapisan string yang sesuai. Contoh ini menunjukkan bagaimana pelapis string menggunakan str_pad ():

<?php

echo str_pad("Salad", 10)." is good.";

?>

Ini mengembalikan sebagai berikut:

Contoh ini memanfaatkan str_pad () parameter opsional:

<?php

$header = "Log Report";

echo str_pad ($header, 20, "=+", STR_PAD_BOTH);

?>

Ini mengembalikan sebagai berikut:

Catatan bahwa str_pad () memotong pola yang didefinisikan oleh pad_string jika panjang tercapai sebelum menyelesaikan seluruh pengulangan pola.

Menghitung Karakter dan Kata

Ini sering bermanfaat untuk menentukan jumlah total karakter atau kata-kata dalam suatu string yang diberikan. Meskipun kapabilitas PHP cukup dalam menguraikan string telah lama membuat tugas ini sepele, dua fungsi baru-baru ini ditambahkan meresmikan proses ini. Kedua fungsi diperkenalkan di bagian ini.

Menghitung Banyaknya Karakter dalam sebuah String

fungsi count_chars () menawarkan informasi mengenai karakter yang ditemukan dalam sebuah string. Prototipe nya berikut:

mixed count_chars(string str [, mode])

perilakunya tergantung pada bagaimana mode parameter opsional yang didefinisikan:

0: Mengembalikan sebuah array yang terdiri dari setiap nilai byte yang ditemukan sebagai kunci dan frekuensi yang sesuai sebagai nilai, bahkan jika frekuensi adalah nol. Ini adalah default.

1: Sama seperti 0, tetapi mengembalikan hanya nilai byte dengan frekuensi yang lebih besar dari nol.

2: Sama seperti 0, tetapi mengembalikan hanya nilai byte dengan frekuensi nol.

3: Mengembalikan string yang berisi semua nilai byte berada.

4: Menghasilkan string yang berisi semua nilai byte tidak digunakan.

Contoh berikut menghitung frekuensi tiap karakter pada $sentence:

<?php

$sentence = "The rain in Spain falls mainly on the plain";

// Retrieve located characters and their corresponding frequency.

$chart = count_chars($sentence, 1);

foreach($chart as $letter=>$frequency)

echo "Character ".chr($letter)." appears $frequency times<br />";

?>

Ini mengembalikan sebagai berikut:

Menghitung Jumlah Total dari Kata pada sebuah String

fungsi str_word_count () menawarkan informasi mengenai jumlah total kata yang ditemukan pada sebuah string. Prototipe nya berikut:

mixed str_word_count(string str [, int format])

Jika format parameter opsional tidak didefinisikan, ini hanya akan mengembalikan jumlah total kata. Jika format didefinisikan, ia memodifikasi perilaku fungsi didasarkan pada nilai:

1: Mengembalikan sebuah array yang terdiri dari semua kata berada pada str.

2: Mengembalikan array asosiatif, di mana tombol tersebut adalah posisi numerik dari kata pada str, dan nilai adalah kata itu sendiri.

Pertimbangkan contoh:

<?php

$summary = <<< summary

In the latest installment of the ongoing Developer.com PHP series

I discuss the many improvements and additions to PHP 5's

object-oriented architecture.

summary;

$words = str_word_count($summary);

printf("Total words in summary: %s", $words);

?>

Ini mengembalikan sebagai berikut:

Anda dapat menggunakan fungsi ini dalam hubungannya dengan array_count_values () untuk menentukan frekuensi di mana setiap kata tampak dalam string:

<?php

$summary = <<< summary

In the latest installment of the ongoing Developer.com PHP series,

I discuss the many improvements and additions to PHP 5's

object-oriented architecture.

summary;

$words = str_word_count($summary,2);

$frequency = array_count_values($words);

print_r($frequency);

?>

ini mengembalikan sebagai berikut:

Mengambil Keuntungan dari PEAR: Validate_US

Terlepas dari apakah aplikasi Web Anda ini dimaksudkan untuk digunakan di perbankan, kesehatan, IT, ritel, atau industri lain, kemungkinan bahwa elemen data tertentu akan menjadi biasa. Sebagai contoh, bayangkan Anda akan ditugaskan dengan memasukkan dan memvalidasi nomor telepon atau singkatan negara, terlepas dari apakah Anda sedang berhadapan dengan klien, pasien, seorang anggota staf, atau pelanggan. Pengulangan tersebut tentu memberikan kesempatan untuk membuat perpustakaan yang mampu menangani hal-hal tersebut, terlepas dari aplikasi. Memang, karena kita dihadapkan dengan Tugas berulang seperti itu, berikut bahwa programmer lain juga. Oleh karena itu, selalu bijaksana untuk mengetahui apakah seseorang telah melakukan kerja keras untuk Anda dan membuat paket tersedia melalui PEAR.

■ Catatan Jika Anda tidak terbiasa dengan PEAR, luangkan waktu untuk meninjau Bab 11 sebelum melanjutkan.

Benar saja, dengan cepat PEAR mencari muncul Validate_US, sebuah paket yang mampu memvalidasi berbagai item informasi spesifik untuk Amerika Serikat. Meski masih dalam versi beta pada saat menekan, Validate_US sudah mampu secara sintaksis memvalidasi nomor telepon, SSN, singkatan negara, dan kode ZIP. Bagian ini menunjukkan kepada Anda bagaimana menginstal dan menerapkan paket ini yang sangat berguna.

Menginstal Validate_US

Untuk mengambil keuntungan dari Validate_US, anda perlu menginstalnya. Proses untuk melakukannya berikut:

Catatan karena Validate_US adalah rilis beta (pada saat penulisan ini), anda harus memberikan opsi-f untuk perintah menginstal agar memaksa instalasi.

Menggunakan Validate_US

Paket Validate_US sangat mudah digunakan, hanya menginisiasi kelas Validate_US ()dan memanggil metode validasi yang sesuai. Total ada tujuh metode, empat di antaranya relevan dengan diskusi ini:

phoneNumber (): Validasi nomor telepon, kembali TRUE pada keberhasilan, dan FALSE sebaliknya. Hal ini menerima nomor telepon dalam berbagai format, termasuk xxx-xxxx xxx, xxxx (xxx)-xxx, dan kombinasi serupa tanpa tanda garis, tanda kurung, atau spasi. Sebagai contoh, (614) 999-9999, 6149999999, dan (614) 9999999 adalah semua valid, sedangkan (6149999999, 614-999-9999, dan 614.999 tidak.

postalCode(): Memvalidasi kode ZIP, kembali TRUE pada keberhasilan, dan FALSE sebaliknya. Hal ini menyetujui kode ZIP dalam berbagai format, meliputi xxxxx, xxxxxxxxx, xxxxx-xxxx, dan kombinasi serupa tanpa garis (-). Misalnya, 43210 dan 43210-0362 keduanya valid, sedangkan 4321 dan 4321009999 tidak.

region (): Validasi singkatan negara, kembali TRUE pada keberhasilan, dan FALSE sebaliknya. Hal ini menyetujui dua huruf singkatan negara seperti yang didukung oleh Pelayanan POS US (http://www.usps.com/ncsc/lookups/usps_abbreviations.html). Untuk contoh, OH, CA, dan NY semua valid, sedangkan CC, DUI, dan BASF tidak.

SSN (): Validasi SSN yang tidak hanya memeriksa sintaks SSN tetapi juga memeriksa informasi validasi yang tersedia melalui situs Web Administrasi Jaminan Sosial (http://www.ssa.gov/), mengembalikan TRUE pada keberhasilan, dan FALSE sebaliknya. Hal ini menyetujui SSN dalam berbagai format, meliputi xxx-xxxx-xx, xxx xxx xx, xxx / xx / xxxx, xxx \ Txx \ txxxx (\ t = tab), xxx \ nxx \ nxxxx (\ n = newline), atau kombinasi sembilan angka bagiannya yang melibatkan tanda hubung, spasi, backshlas, tab, atau karakter baris baru. Sebagai contoh, 479-35-6432 dan 591467543 adalah valid, sedangkan 999999999, 777665555, dan 45678 tidak.

Setelah Anda memiliki pemahaman tentang definisi method, implementasi adalah sepele. Misalnya, Anda ingin untuk memvalidasi nomor telepon. Hanya meliputi kelas Validate_US dan memanggil phoneNumber () seperti:

<?php

include "Validate/US.php";

$validate = new Validate_US();

echo $validate->phoneNumber("614-999-9999") ? "Valid!" : "Not valid!";

?>

Karena phoneNumber () mengembalikan sebuah Boolean, dalam contoh ini Valid! pesan akan dikembalikan. Kontras ini dengan menyediakan 614-876530932 untuk phoneNumber (), yang akan menginformasikan pengguna nomor telepon tidak valid.

Ringkasan

Banyak fungsi diperkenalkan dalam bab ini berada di antara yang paling umum digunakan dalam aplikasi PHP anda, karena mereka membentuk inti dari bahasa kemampuan itu manipulasi string.

Bab selanjutnya mengkaji kumpulan fungsi yang sudah usang: mereka dikhususkan untuk bekerja dengan file dan sistem operasi.

■ ■ ■

BAB 10

Bekerja dengan File dan

Sistem Operasi

Ini cukup jarang untuk menulis aplikasi yang sepenuhnya dapat berdiri sendiri, sebuah program yang tidak bergantung pada setidaknya beberapa tingkat interaksi dengan sumber daya eksternal, seperti yang mendasari file dan sistem operasi, dan bahkan bahasa pemrograman lainnya. Alasan untuk ini adalah sederhana: sebagai bahasa, sistem file, dan sistem operasi dewasa, kesempatan untuk membuat jauh lebih efisien, terukur, dan aplikasi tepat waktu meningkat besar sebagai hasil dari kemampuan pengembang untuk mengintegrasikan fitur mencoba-dan-benar tiap komponen menjadi produk tunggal. Tentu saja, triknya adalah untuk memilih bahasa yang menawarkan cara mudah dan efisien untuk melakukannya. Untungnya, PHP memenuhi kedua kondisi cukup baik, menawarkan programmer array yang indah alat tidak hanya untuk menangani file sistem input dan output, tetapi juga untuk melaksanakan program pada tingkat kulit. Bab ini menyajikan sebagai pengenalan fitur ini, menjelaskan bagaimana bekerja dengan:

• File dan direktori: Anda akan belajar bagaimana melakukan forensik sistem file, mengungkapkan rincian seperti file dan ukuran direktori dan lokasi, modifikasi dan akses waktu, dan banyak lagi.

• File I / O: Anda akan belajar bagaimana berinteraksi dengan file data, yang akan membiarkan Anda melakukan berbagai tugas praktis, meliputi membuat, menghapus, membaca, dan menulis file.

• Isi Direktori: Anda akan belajar cara mudah mengambil isi direktori.

• perintah Shell: Anda dapat mengambil keuntungan dari sistem operasi dan Fungsi tingkat bahasa lainnya dari dalam aplikasi PHP melalui sejumlah yang dibangun pada fungsi dan mekanisme.

• Mensterilkan Input: Walaupun Bab 21 masuk ke dalam topik ini secara rinci, bab ini menunjukkan beberapa kemampuan mensterilkan input PHP, menunjukkan Anda bagaimana untuk mencegah pengguna dari melewati data yang dapat berpotensi menyebabkan kerusakan pada data Anda dan sistem operasi.

■ Catatan PHP terutama mahir dalam bekerja dengan sistem file yang mendasari, begitu banyak sehingga mendapatkan popularitas sebagai interpreter command-line, kemampuan diperkenalkan pada versi 4.2.0. Topik ini di luar ruang lingkup buku ini, tapi Anda dapat menemukan informasi tambahan pada manual PHP.

Mempelajari Tentang File dan Direktori

Mengatur data yang terkait ke dalam entitas biasanya dirujuk sebagai file dan direktori telah lama menjadi konsep inti pada lingkungan komputer. Untuk alasan ini, pemrogram perlu memiliki cara untuk memperoleh Rincian penting tentang file dan direktori, seperti lokasi, ukuran, waktu modifikasi terakhir, waktu akses terakhir, dan lainnya mendefinisikan informasi. Bagian ini memperkenalkan banyak fungsi built-in PHP untuk memperoleh rincian penting ini.

Menguraikan Path Direktori

Ini biasanya berguna untuk mengurai path direktori untuk berbagai atribut seperti bagian nama ekstensi, komponen direktori, dan nama dasar. Beberapa fungsi yang tersedia untuk melaksanakan Tugas tersebut, semua diperkenalkan di bagian ini.

Mengambil Path sebuah Nama file

fungsi basename () mengembalikan nama file komponen dari path. Prototipe nya berikut:

string basename(string path [, string suffix])

Jika parameter opsional akhiran disertakan, akhiran akan dihilangkan sebaliknya jika tidak nama file berisi ekstensi itu. Sebuah contoh berikut:

<?php

$path = "/home/www/data/users.txt";

printf("Filename: %s <br />", basename($path));

printf("Filename sans extension: %s <br />", basename($path, ".txt"));

?>

Mengeksekusi contoh ini menghasilkan sebagai berikut:

Mengambil Direktori Path

fungsi dirname () pada dasarnya pendamping untuk basename (), menyediakan komponen direktori path. Prototipe nya berikut:

string dirname(string path)

Kode berikut ini akan mengambil path mengarah ke nama file users.txt:

<?php

$path = "/home/www/data/users.txt";

printf("Directory path: %s", dirname($path));

?>

Ini mengembalikan sebagai berikut:

Belajar Lebih Banyak Tentang Path

fungsi pathinfo () membuat sebuah array asosiatif berisi tiga komponen path, yaitu nama direktori, nama dasar, dan ekstensi. Prototipe nya berikut:

array pathinfo(string path)

Pertimbangkan Path sebagai berikut :

/home/www/htdocs/book/chapter10/index.html

Seperti yang terkait dengan pathinfo (), path ini terdiri dari tiga komponen:

• nama directori: / home/www/htdocs/book/chapter10

• nama dasar : index.html

• File ekstensi: html

Karena itu, Anda dapat menggunakan pathinfo () seperti ini untuk mengambil informasi ini:

<?php

$pathinfo = pathinfo("/home/www/htdocs/book/chapter10/index.html");

printf("Dir name: %s <br />", $pathinfo[dirname]);

printf("Base name: %s <br />", $pathinfo[basename]);

printf("Extension: %s <br />", $pathinfo[extension]); ?>

Ini mengembalikan sebagai berikut:

Mengidentifikasi Path Mutlak

fungsi realpath () mengubah semua link simbol dan relatif path merujuk yang terletak pada path untuk rekan mutlak mereka. Prototipe nya berikut:

string realpath(string path)

Misalnya, struktur direktori Anda mengasumsikan path berikut:

/home/www/htdocs/book/images/

Anda dapat menggunakan realpath () untuk menyelesaikan setiap referensi path lokal:

<?php

$imgPath = "../../images/cover.gif";

$absolutePath = realpath($imgPath);

// Returns /www/htdocs/book/images/cover.gif

?>

Menghitung file, Direktori, dan Ukuran Disk

Menghitung file, direktori, dan ukuran disk adalah tugas umum pada segala macam aplikasi. Bagian ini memperkenalkan beberapa fungsi standar PHP cocok untuk tugas ini.

Menentukan Ukuran file

fungsi filesize () mengembalikan ukuran, pada byte, dari file yang ditentukan. Prototipe nya berikut:

int filesize(string filename)

Sebuah contoh berikut:

<?php

$file = "/www/htdocs/book/chapter1.pdf";

$bytes = filesize($file);

$kilobytes = round($bytes/1024, 2);

printf("File %s is $bytes bytes, or %.2f kilobytes",

basename($file), $kilobytes);

?>

Ini mengembalikan sebagai berikut

Menghitung Ruang Disk bebas

fungsi disk_free_space () mengembalikan ruang yang tersedia, dalam satuan byte, yang dialokasikan untuk wadah partisi disk direktori yang ditentukan. Prototipe nya berikut:

float disk_free_space(string directory)

Sebuah contoh berikut:

<?php

$drive = "/usr";

printf("Remaining MB on %s: %.2f", $drive,

round((disk_free_space($drive) / 1048576), 2));

?>

Ini mengembalikan sebagai berikut:

Perhatikan bahwa jumlah yang dikembalikan dalam Megabyte (MB) karena nilai dikembalikan dari disk_free_space () dibagi oleh 1.048.576, yang setara dengan 1MB.

Menghitung Ukuran Total Disk

fungsi disk_total_space () mengembalikan ukuran total, dalam byte, yang dikonsumsi oleh perumahan partisi disk direktori yang ditentukan. Prototipe nya berikut:

float disk_total_space(string directory)

Jika Anda menggunakan fungsi ini dalam hubungannya dengan disk_free_space (), mudah yang berguna untuk memberikan statistik alokasi ruang:

<?php

$partition = "/usr";

// Determine total partition space

$totalSpace = disk_total_space($partition) / 1048576;

// Determine used partition space

$usedSpace = $totalSpace - disk_free_space($partition) / 1048576;

printf("Partition: %s (Allocated: %.2f MB. Used: %.2f MB.)",

$partition, $totalSpace, $usedSpace);

?>

Ini mengembalikkan sebagai berikut :

Mengambil Ukuran Direktori

PHP saat ini tidak menawarkan fungsi standar untuk mengambil ukuran total sebuah direktori, tugas yang sering dibutuhkan dari mengambil total ruang disk (lihat disk_total_space () pada bagian sebelumnya). Dan meskipun Anda dapat membuat system-level memanggil untuk du menggunakan exec () atau sistem () (baik yang diperkenalkan pada bagian kemudian "Fungsi Eksekusi Program PHP "), fungsi tersebut sering dinonaktifkan untuk alasan keamanan. Solusi alternatif dengan menulis fungsi PHP khusus yang mampu melaksanakan tugas ini. Fungsi rekursif tampaknya sangat cocok untuk tugas ini. Satu variasi yang mungkin ditawarkan pada properti 10-1.

■ Catatan Perintah du akan meringkas penggunaan disk dari file atau direktori. Lihat halaman manual yang tepat untuk informasi penggunaan.

Properti 10-1. Menentukan Ukuran Isi Direktori's

<?php

function directory_size($directory) {

$directorySize=0;

// Open the directory and read its contents.

if ($dh = @opendir($directory)) {

// Iterate through each directory entry.

while (($filename = readdir ($dh))) {

// Filter out some of the unwanted directory entries.

if ($filename != "." && $filename != "..")

{

// File, so determine size and add to total.

if (is_file($directory."/".$filename))

$directorySize += filesize($directory."/".$filename);

// New directory, so initiate recursion. */

if (is_dir($directory."/".$filename))

$directorySize += directory_size($directory."/".$filename);

}

}

}

@closedir($dh);

return $directorySize;

} #end directory_size()

$directory = "/usr/book/chapter10/";

$totalSize = round((directory_size($directory) / 1048576), 2);

printf("Directory %s: %f MB", $directory: ".$totalSize);

?>

Mengeksekusi script ini akan menghasilkan output yang sama sebagai berikut:

Menentukan Waktu Akses dan Modifikasi

Kemampuan untuk menentukan akses terakhir file dan waktu modifikasi memainkan peran penting dalam banyak tugas-tugas administratif, terutama pada aplikasi web yang melibatkan jaringan atau operasi memperbarui CPU-intensif. PHP menawarkan tiga fungsi untuk menentukan akses file, penciptaan, dan waktu modifikasi terakhir, semua diperkenalkan di bagian ini.

Menentukan Waktu Akses Terakhir File

fungsi fileatime () mengembalikan waktu terakhir mengakses file dalam format timestamp Unix, atau FALSE pada error. Prototipe nya berikut:

int fileatime(string filename)

Sebuah contoh berikut:

<?php

$file = "/usr/local/apache2/htdocs/book/chapter10/stat.php";

printf("File last accessed: %s", date("m-d-y g:i:sa", fileatime($file))); ?>

Ini mengembalikan sebagai berikut:

Menentukan File Waktu Terakhir Diubah

fungsi filectime () mengembalikan waktu terakhir file itu diubah dalam format timestamp Unix, atau FALSE pada error. Prototipe nya berikut:

int filectime(string filename)

Sebuah contoh berikut:

<?php

$file = "/usr/local/apache2/htdocs/book/chapter10/stat.php";

printf("File inode last changed: %s", date("m-d-y g:i:sa",

filectime($file)));

?>

Ini mengembalikan sebagai berikut:

■ Catatan Waktu terakhir diubah berbeda dari waktu modifikasi terakhir bahwa waktu diubah terakhir mengacu pada setiap perubahan data inode file, meliputi perubahan untuk hak akses, grup, pemilik, atau informasi spesifik lainnya inode, sedangkan waktu terakhir diubah mengacu perubahan terhadap konten file (khususnya, ukuran byte).

Menentukan Waktu Terakhir Files diModifikasi

fungsi filemtime () mengembalikan waktu modifikasi terakhir file dalam format timestamp Unix, atau FALSE sebaliknya. Prototipe nya berikut:

int filemtime(string filename)

Kode berikut menunjukkan bagaimana untuk menempatkan "terakhir diubah" timestamp pada halaman Web:

<?php

$file = "/usr/local/apache2/htdocs/book/chapter10/stat.php";

echo "File last updated: ".date("m-d-y g:i:sa", filemtime($file));

?>

Ini mengembalikan sebagai berikut:

Bekerja dengan File

Aplikasi Web jarang 100 persen berdiri sendiri, yaitu sebagian besar bergantung pada beberapa jenis sumber data eksternal untuk melakukan sesuatu yang menarik. Dua contoh utama dari sumber data tersebut adalah file dan database. Dalam bagian ini anda akan belajar bagaimana berinteraksi dengan file dengan cara pengenalan berbagai standar fungsi PHP yang terkait file. Tetapi pertama ada baiknya memperkenalkan beberapa konsep dasar yang berkaitan dengan topik ini.

Konsep Sumber Daya

Istilah Sumber daya umumnya digunakan untuk mengacu pada setiap entitas dari mana aliran input atau output dapat dimulai. Standar input atau output, file, dan soket jaringan merupakan contoh sumber daya. Oleh karena itu Anda akan melihat banyak fungsi diperkenalkan di bagian ini dibahas pada konteks penanganan sumber daya, bukan penanganan file, per se, karena semua mampu bekerja dengan sumber daya seperti di atas. Namun, karena penggunaannya dalam hubungannya dengan file adalah aplikasi yang paling umum, pembahasan utama akan dibatasi untuk tujuan itu, meskipun syarat sumber daya dan file dapat digunakan secara bergantian di seluruh.

Mengenali karakter baris baru

Karakter baris baru, yang direpresentasikan dengan urutan karakter \n (\ r \ n pada Windows), mewakili akhir baris dalam file. Ingatlah hal ini ketika Anda perlu input atau Output satu baris informasi pada suatu waktu. Beberapa fungsi memperkenalkan seluruh sisa dari bab ini menawarkan fungsi yang disesuaikan untuk bekerja dengan karakter baris baru. Beberapa fungsi ini meliputi file (), fgetcsv (), dan fgets ().

Mengenali Karakter End-of-File

Program memerlukan cara standar untuk membedakan ketika akhir file telah dicapai. Standar ini sering disebut sebagai end-of-file, atau EOF, karakter. Ini adalah sebuah konsep penting bahwa setiap arus utama bahasa pemrograman hampir menawarkan fungsi built-in untuk memverifikasi apakah pengurai telah tiba pada EOF. Dalam kasus PHP, fungsi Ini adalah feof (). fungsi feof () menentukan apakah sumber daya EOF telah tercapai. Hal ini digunakan cukup umum pada file operasi I / O. Prototipe nya berikut:

int feof(string resource)

Sebuah contoh berikut:

<?php

// Open a text file for reading purposes

$fh = fopen("/home/www/data/users.txt", "rt");

// While the end-of-file hasn't been reached, retrieve the next line

while (!feof($fh)) echo fgets($fh);

// Close the file

fclose($fh);

?>

Membuka dan Menutup File

Biasanya Anda perlu membuat apa yang dikenal sebagai pegangan sebelum Anda dapat melakukan apa pun dengan isi sebuah file. Demikian juga, setelah Anda selesai bekerja dengan sumber daya itu, Anda harus menghancurkan pegangan. Dua fungsi standar yang tersedia untuk tugas-tugas tersebut, baik yang diperkenalkan pada bagian ini.

Membuka File

fungsi fopen () mengikat sebuah file untuk pegangan. Setelah terikat, script dapat berinteraksi dengan file ini melalui pegangan. Prototipe nya berikut:

resource fopen(string resource, string mode [, int use_include_path

[, resource zcontext]])

Sementara fopen () ini paling sering digunakan untuk membuka file untuk membaca dan manipulasi, itu juga mampu membuka sumber daya melalui beberapa protokol, termasuk HTTP, HTTPS, dan FTP, konsep dibahas pada Bab 16.

Mode, ditugaskan pada saat sumber daya dibuka, menentukan tingkat akses yang tersedia untuk sumber daya itu. Berbagai mode didefinisikan pada Tabel 10-1.

Tabel 10-1. Mode file

Mode Deskripsi r Hanya membaca. Pointer file ditempatkan pada awal file. r+ Membaca dan menulis. Pointer file ditempatkan pada awal file. w hanya Menulis. Sebelum menulis, menghapus isi file dan

mengembalikan pointer file ke awal file. Jika file tidak ada, berusaha untuk menciptakannya.

w+ Membaca dan menulis. Sebelum membaca atau menulis, menghapus isi file dan mengembalikan pointer file ke awal file. Jika file tidak ada, berusaha untuk menciptakannya.

a Hanya Menulis. Pointer file ditempatkan pada akhir file. Jika file tidak ada, berusaha untuk menciptakannya. Mode ini lebih dikenal sebagai Tambahkan.

a+ Membaca dan menulis. Pointer file ditempatkan pada akhir file. Jika file tidak ada, berusaha untuk menciptakannya. Proses ini dikenal sebagai menambahkan ke file.

b Membuka file dalam mode biner. t Membuka file dalam mode teks.

Jika sumberdaya ditemukan pada sistem file lokal, PHP mengharapkannya akan tersedia pada path prakata itu. Sebagai alternatif, Anda dapat menugaskan fopen () parameter use_include_path nilai dari 1, yang akan menyebabkan PHP untuk mencari sumber daya dalam path yang ditentukan oleh direktif konfigurasi include_path.

Parameter terakhir, zcontext, digunakan untuk pengaturan konfigurasi parameter yang spesifik untuk file atau aliran dan untuk pembagian file-atau informasi aliran-spesifik di beberapa permintaan fopen ().Topik ini dibahas lebih lanjut dalam Bab 16.

Mari kita pertimbangkan beberapa contoh. Yang pertama membuka read-only menangani untuk file teks yang berada pada server lokal:

$fh = fopen("/usr/local/apache/data/users.txt","rt");

Contoh berikut menunjukkan membuka menulis mengatasi untuk sebuah dokumen HTML:

$fh = fopen("/usr/local/apache/data/docs/summary.html","w");

Contoh berikut ini mengacu pada dokumen HTML yang sama, kecuali saat ini PHP akan mencari file pada path yang ditentukan oleh direktif include_path (menganggap dokumen summary.html berada di lokasi yang ditentukan pada contoh sebelumnya, include_path akan membutuhkan untuk menyertakan path / usr / local / apache / data / docs /):

$fh = fopen("summary.html","w", 1);

Contoh terakhir membuka aliran read-only ke remote file index.html:

$fh = fopen("http://www.example.com/", "r");

Tentu saja, perlu diingat fopen () hanya menyiapkan sumber daya untuk operasi yang akan datang. Selain menetapkan pegangan, itu tidak apa-apa, Anda harus menggunakan fungsi lain untuk benar-benar melakukan Operasi read dan write. Fungsi ini ini diperkenalkan dalam bagian berikut.

Menutup File

Praktek pemrograman yang baik mengharuskan bahwa Anda harus menghancurkan pointer ke setiap sumber daya setelah anda selesai dengan mereka. Fungsi fclose () menangani ini untuk Anda, menutup yang sebelumnya pointer file dibuka ditentukan dengan menangani file, mengembalikan TRUE pada kesuksesan dan FALSE sebaliknya. Prototipe nya berikut:

boolean fclose(resource filehandle)

Filehandle harus sebuah pointer file yang sudah ada dibuka menggunakan fopen () atau fsockopen ().

Membaca dari sebuah File

PHP menawarkan berbagai metode untuk membaca data dari file, mulai dari membaca hanya dalam satu karakter pada satu waktu untuk membaca pada seluruh file dengan operasi tunggal. Banyak fungsi yang paling berguna adalah diperkenalkan di bagian ini.

Membaca File ke dalam Array

fungsi file () mampu membaca file ke dalam array, memisahkan setiap elemen dengan karakter baris baru, dengan baris baru masih menempel pada akhir setiap elemen. Prototipe nya berikut:

array file(string filename [int use_include_path [, resource context]])

Walaupun sederhana, pentingnya fungsi ini tidak dapat diabaikan, dan oleh karena itu menjamin sebuah demonstrasi sederhana. Pertimbangkan contoh berikut file teks bernama users.txt:

Ale [email protected]

Nicole [email protected]

Laura [email protected]

script berikut membaca pada users.txt dan mengurai dan mengubah data ke dalam format berbasis Web mudah dicapai. Perhatikan file () menyediakan perilaku khusus karena tidak seperti fungsi lain read /write, Anda tidak harus menetapkan file menangani untuk membacanya:

<?php

// Read the file into an array

$users = file("users.txt");

// Cycle through the array

foreach ($users as $user) {

// Parse the line, retrieving the name and e-mail address

list($name, $email) = explode(" ", $user);

// Remove newline from $email

$email = trim($email);

// Output the formatted name and e-mail address

echo "<a href=\"mailto:$email\">$name</a> <br /> ";

}

?>

Script ini menghasilkan output HTML sebagai berikut:

Seperti fopen (), Anda dapat memberitahu file () untuk mencari melalui path yang ditentukan dalam parameter konfigurasi include_path dengan menetapkan use_include_path ke 1. Parameter konteks mengacu pada konteks aliran. Anda akan belajar lebih banyak tentang topik ini pada Bab 16.

Membaca Isi File ke dalam Variabel String

fungsi file_get_contents () membaca isi file ke dalam string. Prototipe nya berikut:

string file_get_contents(string filename [, int use_include_path

[resource context]])

Dengan merevisi script dari bagian sebelumnya untuk menggunakan fungsi ini bukan file (), Anda mendapatkan kode berikut:

<?php

// Read the file into a string variable

$userfile= file_get_contents("users.txt");

// Place each line of $userfile into array

$users = explode("\n",$userfile);

// Cycle through the array

foreach ($users as $user) {

// Parse the line, retrieving the name and e-mail address

list($name, $email) = explode(" ", $user);

// Output the formatted name and e-mail address

echo "<a href=\"mailto:$email\">$name/a> <br />";

}

?>

use_include_path dan konteks Parameter beroperasi secara identik dengan yang ditetapkan pada bagian sebelumnya.

Membaca File CSV ke dalam Array

fungsi fgetcsv () mudah digunakan mengurai setiap baris file mark up dalam format CSV. Prototipe nya berikut:

array fgetcsv(resource handle [, int length [, string delimiter

[, string enclosure]]])

Membaca tidak berhenti pada baris baru, melainkan akan berhenti bila panjang karakter telah dibaca. Pada PHP 5, menghilangkan panjang atau setting ke 0 akan mengakibatkan panjang baris tak terbatas, namun, karena ini menurunkan kinerja itu selalu merupakan ide yang baik untuk memilih nomor yang pasti akan melampaui garis terpanjang di file. opsional Parameter pemisah (secara default diatur dengan koma) mengidentifikasi karakter yang digunakan untuk tidak membatasi setiap field. Parameter opsional penutup (secara default diatur dengan kutipan ganda) mengidentifikasi karakter yang digunakan untuk menyertakan nilai field, yang berguna ketika nilai pembatas diberikan juga dapat muncul dalam nilai field, meskipun dalam konteks yang berbeda.

■ Catatan Comma-separated value (CSV) file yang umum digunakan ketika mengimpor file di antara aplikasi. Microsoft Excel dan Access, MySQL, Oracle, dan PostgreSQL hanya beberapa aplikasi dan database mampu baik mengimpor dan mengekspor data CSV. Selain itu, bahasa seperti Perl, Python, dan PHP sangat efisien pada penguraian yang dibatasi data.

Pertimbangkan skenario di mana data pelanggan berita mingguan ini diambil dari file sementara untuk Pembaca oleh staf pemasaran. File ini mungkin terlihat seperti ini:

Jason Gilmore,[email protected],614-555-1234

Bob Newhart,[email protected],510-555-9999

Carlene Ribhurt,[email protected],216-555-0987

Selalu ingin rentetan departemen IT dengan permintaan meragukan, staf pemasaran meminta bahwa informasi juga harus dibuat tersedia untuk dilihat pada Web. Syukurlah, ini mudah dilakukan dengan fgetcsv (). Contoh berikut mengurai file:

<?php

// Open the subscribers data file

$fh = fopen("/home/www/data/subscribers.csv", "r");

// Break each line of the file into three parts

while (list($name, $email, $phone) = fgetcsv($fh, 1024, ",")) {

// Output the data in HTML format

printf("<p>%s (%s) Tel. %s</p>", $name, $email, $phone);

}

?>

Catatan bahwa Anda tidak harus menggunakan fgetcsv () untuk mengurai file tersebut; fungsi file () dan list () menyelesaikan tugas cukup baik. Pertimbangkan contoh sebelumnya:

<?php

// Read the file into an array

$users = file("/home/www/data/subscribers.csv");

foreach ($users as $user) {

// Break each line of the file into three parts

list($name, $email, $phone) = explode(",", $user);

// Output the data in HTML format

printf("<p>%s (%s) Tel. %s</p>", $name, $email, $phone);

}

?>

Membaca Nomor Spesifik Karakter

fungsi fgets () mengembalikan sejumlah karakter dibaca melalui menangani sumber daya terbuka, atau segala sesuatu yang telah dibaca sampai ke titik ketika sebuah baris baru atau karakter EOF ditemui. Prototipe nya berikut:

string fgets(resource handle [, int length])

Jika opsional panjang parameter dihilangkan, 1.024 karakter diasumsikan. Pada banyak situasi, ini berarti bahwa fgets () akan menemukan karakter baris baru sebelum membaca 1.024 karakter, dengan demikian mengembalikan baris berikutnya dengan setiap panggilan berturut-turut. Sebuah contoh berikut:

<?php

// Open a handle to users.txt

$fh = fopen("/home/www/data/users.txt", "rt");

// While the EOF isn't reached, read in another line and output it

while (!feof($fh)) echo fgets($fh);

// Close the handle

fclose($fh);

?>

Pengupasan Tag dari Input

fungsi fgetss () beroperasi sama seperti fgets (), kecuali bahwa hal itu juga irisan setiap tag HTML dan PHP dari input. Prototipe nya berikut:

string fgetss(resource handle, int length [, string allowable_tags])

Jika Anda ingin tag tertentu untuk diabaikan, termasuk mereka pada parameter allowable_tags. Sebagai contoh, pertimbangkan skenario di mana kontributor diharapkan untuk menyerahkan pekerjaan mereka dalam format HTML menggunakan sekumpulan tertentu dari tag HTML. Tentu saja, penulis tidak selalu mengikuti perintah, maka file tersebut harus disaring untuk penyalahgunaan tag sebelum dapat diterbitkan. Dengan fgetss (), ini adalah sepele:

<?php

// Build list of acceptable tags

$tags = "<h2><h3><p><b><a><img>";

// Open the article, and read its contents.

$fh = fopen("article.html", "rt");

while (!feof($fh)) {

$article .= fgetss($fh, 1024, $tags);

}

// Close the handle

fclose($fh);

// Open the file up in write mode and output its contents.

$fh = fopen("article.html", "wt");

fwrite($fh, $article);

// Close the handle

fclose($fh);

?>

■ Tip Jika Anda ingin untuk menghilangkan tag HTML dari input pengguna disampaikan melalui formulir, periksa fungsi strip_tags (), yang diperkenalkan pada Bab 9.

Membaca File Satu Karakter Sekaligus

fungsi fgetc () membaca sebuah karakter tunggal dari aliran sumber terbuka yang ditetapkan oleh menangani. Jika EOF ditemui, nilai FALSE dikembalikan. Prototipe nya berikut:

string fgetc(resource handle)

Mengabaikan karakter baris baru

fungsi fread() membaca panjang karakter dari sumber daya ditentukan oleh pegangan. Membaca berhenti ketika EOF tercapai atau saat panjang karakter telah dibaca. Prototipe nya berikut:

string fread(resource handle, int length)

Catatan bahwa tidak seperti fungsi membaca lainnya, karakter baris baru tidak relevan saat menggunakan fread (); Oleh karena itu, sering kali mudah untuk membaca seluruh file dalam sekaligus menggunakan filesize () untuk menentukan jumlah karakter yang harus dibaca pada:

<?php

$file = "/home/www/data/users.txt";

// Open the file for reading

$fh = fopen($file, "rt");

// Read in the entire file

$userdata = fread($fh, filesize($file));

// Close the file handle

fclose($fh);

?>

variabel $userdata sekarang berisi isi dari file users.txt.

Membaca Seluruh File

fungsi readfile () membaca seluruh file yang ditentukan menurut nama file dan langsung output ke output buffer, mengembalikan jumlah byte yang dibaca. Prototipe nya berikut:

int readfile(string filename [, int use_include_path])

Mengaktifkan parameter opsional use_include_path memberitahu PHP untuk mencari path yang ditentukan oleh parameter konfigurasi include_path. Fungsi ini berguna jika Anda tertarik hanya membuang seluruh file ke browser:

<?php

$file = "/home/www/articles/gilmore.html";

// Output the article to the browser.

$bytes = readfile($file);

?>

Seperti banyak dari file lainnya PHP fungsi I / O, file remote dapat dibuka melalui URL mereka jika konfigurasi parameter fopen_wrappers diaktifkan.

Membaca File Berdasarkan Format ditetapkan sebelumnya

fungsi fscanf() menawarkan cara yang mudah untuk menguraikan sumber daya sesuai dengan format yang telah ditetapkan. Prototipe nya berikut:

mixed fscanf(resource handle, string format [, string var1])

Misalnya, Anda ingin mengurai file berikut yang terdiri dari nomor Jaminan Sosial (SSN) (socsecurity.txt):

123-45-6789

234-56-7890

345-67-8901

Contoh berikut mengurai file socsecurity.txt:

<?php

$fh = fopen("socsecurity.txt", "r");

// Parse each SSN in accordance with integer-integer-integer format

while ($user = fscanf($fh, "%d-%d-%d")) {

// Assign each SSN part to an appropriate variable

list ($part1,$part2,$part3) = $user;

printf(Part 1: %d Part 2: %d Part 3: %d <br />", $part1, $part2, $part3);

}

fclose($fh);

?>

Dengan setiap iterasi, variabel $ part1, $ part2, dan $ part3 ditugaskan tiga komponen dari setiap SSN, masing-masing, dan output ke browser.

Menulis String ke File

fungsi fwrite() output isi dari variabel string ke sumber daya yang ditentukan. Prototipe nya berikut:

int fwrite(resource handle, string string [, int length])

Jika opsional panjang parameter disediakan, fwrite () akan berhenti menulis ketika panjang karakter telah ditulis. Jika tidak, menulis akan berhenti ketika akhir dari string ditemukan. Pertimbangkan contoh ini:

<?php

// Data we'd like to write to the subscribers.txt file

$subscriberInfo = "Jason Gilmore|[email protected]";

// Open subscribers.txt for writing

$fh = fopen("/home/www/data/subscribers.txt", "at");

// Write the data

fwrite($fh, $subscriberInfo);

// Close the handle

fclose($fh);

?>

■ Tip Jika opsional panjang parameter tidak disediakan untuk fwrite (), parameter konfigurasi magic_quotes_runtime akan diabaikan. Lihat Bab 2 dan 9 untuk informasi lebih lanjut tentang parameter ini. Ini hanya berlaku untuk PHP 5 dan sebelumnya.

Memindahkan Pointer File

Ini sering berguna untuk meloncat dalam sebuah file, membaca dan menulis ke berbagai lokasi. Beberapa fungsi PHP tersedia untuk melakukan hal ini.

Memindahkan Pointer File ke Tertentu Jarak

fungsi fseek () memindahkan pointer ke lokasi yang ditentukan dengan mengimbangi nilai yang diberikan. Prototipe nya berikut:

int fseek(resource handle, int offset [, int whence])

SEEK_CUR: Mengatur posisi pointer ke posisi saat ini ditambah diimbangi byte.

SEEK_END: Mengatur posisi pointer ke EOF ditambah byte diimbangi. Dalam hal ini, diimbangi harus di-set ke nilai negatif.

SEEK_SET: Mengatur posisi pointer ke byte diimbangi. Hal ini memiliki efek yang sama dengan menghilangkan darimana.

Mengambil Jarak Pointer saat ini

fungsi ftell () mengambil posisi saat ini pointer file diimbangi dalam sumber daya. Prototipe nya berikut:

int ftell(resource handle)

Memindahkan Pointer File Kembali ke Awal File

fungsi rewind () memindahkan pointer file kembali ke awal sumber daya. Prototipe nya berikut:

int rewind(resource handle)

Membaca Isi Direktori

Proses yang dibutuhkan untuk membaca isi direktori ini cukup mirip dengan melibatkan dalam membaca file. Bagian ini memperkenalkan fungsi yang tersedia untuk tugas ini dan juga memperkenalkan fungsi baru untuk PHP 5 yang membaca isi direktori ke dalam array.

Membuka Menangani sebuah Direktori

Sama seperti fopen () membuka sebuah pointer file ke file yang diberikan, opendir () membuka aliran direktori yang ditentukan oleh path. Prototipe nya berikut:

resource opendir(string path)

Menutup Menangani sebuah Direktori

fungsi closedir () menutup aliran direktori. Prototipe nya berikut:

void closedir(resource directory_handle)

Menguraikan Isi Direktori

fungsi readdir () mengembalikan setiap elemen dalam direktori. Prototipe nya berikut:

string readdir(int directory_handle)

Antara lain, Anda dapat menggunakan fungsi ini untuk daftar semua file dan anak direktori dalam sebuah direktori tertentu:

<?php

$dh = opendir('/usr/local/apache2/htdocs/');

while ($file = readdir($dh))

echo "$file <br />";

closedir($dh);

?>

Contoh output berikut:

Catatan bahwa readdir () juga mengembalikan. dan .. entri umum untuk sebuah daftar direktori Unix yang khas. Anda dapat dengan mudah menyaring tersebut keluar dengan sebuah pernyataan if:

if($file != "." AND $file != "..")...

Membaca Direktori ke dalam Array

fungsi scandir (), diperkenalkan pada PHP 5, mengembalikan array yang terdiri dari file dan direktori yang ditemukan dalam direktori, atau FALSE kembali pada error. Prototipe nya berikut:

array scandir(string directory [,int sorting_order [, resource context]])

Mengatur opsional parameter sorting_order ke 1 jenis isi dalam urutan menurun, mengesampingkan default urutan menaik. Mengeksekusi contoh ini (dari bagian sebelumnya)

<?php

print_r(scandir("/usr/local/apache2/htdocs"));

?>

mengembalikan sebagai berikut:

Parameter konteks mengacu pada konteks aliran. Anda akan belajar lebih banyak tentang topik ini pada Bab 16.

Menjalankan Perintah Shell

kemampuan untuk berinteraksi dengan sistem operasi yang mendasari adalah fitur penting dari setiap bahasa pemrograman. Meskipun Anda bisa bayangkan menjalankan setiap sistem level perintah dengan menggunakan fungsi seperti exec () atau system (), beberapa fungsi ini sangat biasa bahwa para pengembang PHP berpikir itu ide yang baik untuk menggabungkan mereka langsung ke dalam bahasa. Beberapa fungsi tersebut diperkenalkan di bagian ini.

Menghapus sebuah Direktori

Fungsi rmdir() mencoba untuk menghapus direktori yang ditentukan, mengembalikan TRUE pada kesuksesan dan FALSE sebaliknya. Prototipe nya berikut:

int rmdir(string dirname)

Seperti banyak fungsi sistem file PHP, hak akses harus ditetapkan dengan benar dalam rangka agar rmdir () dapat berhasil menghapus direktori. Karena skrip PHP biasanya mengeksekusi dengan kedok pemilik proses daemon server, rmdir () akan gagal kecuali pengguna tersebut memiliki ijin untuk menulis pada direktori. Juga, direktori harus kosong.

Untuk menghapus direktori yang tidak kosong, Anda dapat menggunakan fungsi yang mampu melaksanakan perintah sistem level, seperti system () atau exec (),atau menulis fungsi rekursif yang akan menghapus semua isi file sebelum

mencoba untuk menghapus direktori. Catatan dalam kedua kasus, pengguna mengeksekusi (daemon server pemilik proses) memerlukan akses menulis ke induk dari target direktori. Berikut adalah contoh dari pendekatan terakhir:

<?php

function delete_directory($dir)

{

if ($dh = opendir($dir))

{

// Iterate through directory contents

while (($file = readdir ($dh)) != false)

{

if (($file == ".") || ($file == "..")) continue;

if (is_dir($dir . '/' . $file))

delete_directory($dir . '/' . $file);

else

unlink($dir . '/' . $file);

}

closedir($dh);

rmdir($dir);

}

}

$dir = "/usr/local/apache2/htdocs/book/chapter10/test/";

delete_directory($dir);

?>

Mengubah nama File

fungsi rename () mengganti nama file, mengembalikan TRUE pada kesuksesan dan FALSE sebaliknya. Prototipe nya berikut:

boolean rename(string oldname, string newname)

Karena skrip PHP biasanya mengeksekusi dengan menyamar sebagai pemilik server daemon proses, rename () akan gagal kecuali pengguna tersebut memiliki hak akses menulis untuk file tersebut.

Menyentuh File

fungsi touch () mengatur file nama file terakhir dimodifikasi dan terakhir diakses , mengembalikan TRUE pada keberhasilan atau FALSE pada kesalahan. Prototipe nya berikut:

int touch(string filename [, int time [, int atime]])

Jika waktu tidak disediakan, saat ini (seperti ditentukan oleh server) digunakan. Jika parameter opsional atime disediakan, waktu akses akan ditetapkan untuk nilai ini; sebaliknya, seperti waktu modifikasi, maka akan ditetapkan baik waktu atau waktu server sekarang.

Catatan bahwa jika nama file tidak ada, maka akan dibuat, dengan asumsi bahwa pemilik script itu memiliki izin yang memadai.

Eksekusi Program Sistem Level

Sesungguhnya programmer malas tahu bagaimana memanfaatkan seluruh lingkungan server mereka ketika mengembangkan aplikasi, yang mencakup memanfaatkan fungsi dari sistem operasi, sistem file, dasar program diinstal, dan bahasa pemrograman jika diperlukan. Pada bagian ini, anda akan belajar bagaimana PHP dapat berinteraksi dengan sistem operasi untuk memanggil kedua program OS-level dan aplikasi yang terinstal pihak ketiga. Dilakukan dengan benar, hal itu menambah tingkat baru fungsionalitas untuk perbendaharaan pemrograman php Anda. Selesai kurang baik, dapat menjadi bencana tidak hanya untuk aplikasi Anda, tetapi juga integritas data server Anda. Konon, sebelum mempelajari ke fitur yang kuat, luangkan waktu untuk mempertimbangkan topik mensterilkan input pengguna sebelum melewati ke tingkat shell.

Mensterilkan Input

Mengabaikan untuk membersihkan input pengguna yang kemudian dapat dikirimkan ke fungsi sistem level dapat memungkinkan penyerang untuk melakukan kerusakan internal yang besar pada penyimpanan informasi Anda dan sistem operasi, merusak atau menghapus file Web, dan sebaliknya akan mendapatkan akses tak terbatas ke server Anda. Dan itu hanya awal.

■ Catatan Lihat Bab 21 untuk pembahasan pemrograman PHP keamanan.

Sebagai contoh mengapa mensterilkan input sangat penting, pertimbangkan skenario dunia nyata. Misalkan Anda menawarkan layanan online yang menghasilkan file PDF dari input URL. Sebuah alat untuk mencapai hanya ini adalah program open source HTMLDOC (http://www.htmldoc.org/), yang mengkonversi dokumen HTML ke HTML terindeks, Adobe PostScript, dan file PDF. HTMLDOC dapat dipanggil dari baris perintah, seperti:

%>htmldoc --webpage –f webpage.pdf http://www.wjgilmore.com/

Ini akan menghasilkan terciptanya PDF bernama webpage.pdf, yang akan berisi snapshot halaman indeks situs Web. Tentu saja, kebanyakan pengguna tidak akan memiliki akses baris perintah ke server Anda; Oleh karena itu, Anda harus membuat antarmuka yang jauh lebih terkontrol, seperti halaman Web. Menggunakan fungsi PHP passthru () (diperkenalkan dalam bagian berikutnya " Fungsi Eksekusi Program PHP "), Anda dapat memanggil HTMLDOC dan mengembalikan PDF yang diinginkan, seperti:

$document = $_POST['userurl'];

passthru("htmldoc --webpage -f webpage.pdf $document);

Bagaimana jika seorang penyerang giat mengambil kebebasan melewati input tambahan, tidak berhubungan dengan halaman HTML yang diinginkan, memasukkan sesuatu seperti ini:

http://www.wjgilmore.com/ ; cd /usr/local/apache/htdocs/; rm –rf *

Kebanyakan Unix shell akan mengartikan permintaan passthru () seperti tiga perintah terpisah. Yang pertama adalah ini:

htmldoc --webpage -f webpage.pdf http://www.wjgilmore.com/

Perintah kedua adalah ini:

cd /usr/local/apache/htdocs/

Dan Perintah terakhir adalah ini:

rm -rf *

Dua perintah terakhir tentu tak terduga dan dapat mengakibatkan penghapusan pohon seluruh dokumen Web Anda. Salah satu cara untuk menjaga terhadap upaya tersebut dengan membersihkan input pengguna sebelum ini dilewatkan ke setiap fungsi eksekusi program PHP. Dua fungsi standar yang tersedia mudah

untuk melakukannya : escapeshellarg() dan escapeshellcmd(). Diperkenalkan di bagian ini.

Membatasi Input

fungsi escapeshellarg () membatasi argumen yang disediakan dengan tanda kutip tunggal dan awalan (lolos) mengutip ditemukan di dalam input. Prototipe nya berikut:

string escapeshellarg(string arguments)

efeknya adalah ketika argumen dilewatkan ke perintah shell, maka akan dianggap sebagai argumen tunggal. Hal ini penting karena mengurangi kemungkinan bahwa Penyerang bisa menyamar perintah tambahan sebagai argumen perintah shell. Oleh karena itu, dalam skenario sebelumnya mimpi buruk, seluruh input pengguna akan diapit tanda kutip tunggal, seperti:

'http://www.wjgilmore.com/ ; cd /usr/local/apache/htdoc/; rm –rf *'

Hasilnya bahwa HTMLDOC hanya akan menghasilkan kesalahan bukannya menghapus seluruh direktori pohon karena tidak dapat menyelesaikan URL yang memiliki sintaks ini.

Meloloskan Input Berpotensi Berbahaya

fungsi escapeshellcmd () beroperasi di bawah pemikiran yang sama seperti escapeshellarg (), mensterilkan input yang berpotensi berbahaya dengan lolos metakarakter shell. Prototipe nya berikut:

string escapeshellcmd(string command)

Karakter ini mencakup sebagai berikut: # & ; , | * ? , ~ < > ^ ( ) [ ] { } $ \\.

Eksekusi Program PHP Fungsi

Bagian ini memperkenalkan beberapa fungsi (selain operator eksekusi tanda kutip terbalik) digunakan untuk menjalankan program sistem-tingkat melalui skrip PHP. Meski sekilas mereka semua tampak operasional yang sama, masing-masing menawarkan nuansa sintaksis tersendiri.

Mengeksekusi Perintah System-Level

fungsi exec ()paling cocok untuk mengeksekusi aplikasi-level sistem operasi dimaksudkan untuk terus di latar belakang server. Prototipe nya berikut:

string exec(string command [, array output [, int return_var]])

Meskipun output baris terakhir akan dikembalikan, kemungkinan bahwa Anda ingin memiliki semua output dikembalikan untuk diperiksa; Anda dapat melakukan ini dengan memasukkan output parameter opsional, yang akan diisi dengan setiap baris output pada penyelesaian perintah yang ditentukan oleh exec (). Selain itu, Anda dapat menemukan perintah dieksekusi mengembalikan status dengan meliputi return_var parameter opsional.

Meskipun saya bisa mengambil jalan keluar yang mudah dan menunjukkan bagaimana exec () dapat digunakan untuk menjalankan perintah ls (dir untuk orang-orang Windows), mengembalikan daftar direktori, lebih informatif untuk menawarkan contoh yang agak lebih praktis: bagaimana memanggil sebuah skrip Perl dari PHP. Pertimbangkan script Perl berikut (languages.pl):

#! /usr/bin/perl

my @languages = qw[perl php python java c];

foreach $language (@languages) {

print $language."<br />";

}

Script Perl cukup sederhana, tidak ada modul pihak ketiga diperlukan, sehingga Anda dapat menguji contoh ini dengan investasi sedikit waktu. Jika Anda menjalankan di Linux, peluang sangat baik bahwa Anda dapat menjalankan contoh ini segera karena Perl terinstal pada setiap distribusi terhormat. Jika Anda menggunakan Windows, periksa ActiveState (http://www.activestate.com/) distribusi ActivePerl.

Seperti languages.pl, script PHP ditampilkan di sini adalah bukan pengetahuan roket, tetapi hanya memanggil script Perl, menetapkan bahwa hasilnya akan ditempatkan ke dalam array bernama $result. Isi dari $result tersebut kemudian output ke browser:

<?php

$outcome = exec("languages.pl", $results);

foreach ($results as $result) echo $result;

?>

Hasilnya adalah sebagai berikut:

Mengambil Hasil suatu Perintah Sistem

fungsi system () berguna ketika Anda ingin menampilkan hasil perintah dieksekusi. Prototipe nya berikut:

string system(string command [, int return_var])

Daripada mengembalikan output melalui parameter opsional, seperti halnya dengan exec (), output dikembalikan langsung ke pemanggil. Namun, jika Anda ingin meninjau status eksekusi program yang dipanggil, Anda perlu menetapkan variabel dengan menggunakan opsional Parameter return_var. Misalnya, Anda ingin daftar semua file yang terletak dalam direktori tertentu:

$mymp3s = system("ls -1 /home/jason/mp3s/");

Contoh berikut memanggil script languages.pl tersebut di atas, kali ini menggunakan system():

<?php

$outcome = system("languages.pl", $results);

echo $outcome

?>

Mengembalikan Output Biner

passthru () fungsinya hampir sama dengan fungsi exec (), kecuali bahwa ini harus digunakan jika Anda ingin mengembalikan output biner ke pemanggil. Prototipe nya berikut:

void passthru(string command [, int return_var])

Misalnya, Anda ingin mengkonversi gambar GIF ke PNG sebelum menampilkan mereka ke browser. Anda bisa menggunakan paket grafis Netpbm, tersedia di http://netpbm.sourceforge.net/ di bawah lisensi GPL:

<?php

header("ContentType:image/png");

passthru("giftopnm cover.gif | pnmtopng > cover.png");

?>

Mengeksekusi Perintah Shell dengan tanda kutip terbalik

Pembatasan string dengan tanda tanda kutip terbalik untuk PHP bahwa string harus dieksekusi sebagai perintah shell, mengembalikan output apapun. Catatan bahwa tanda kutip terbalik bukan tanda kutip tunggal melainkan adalah saudara miring, biasanya berbagi satu tombol dengan tilde (~) di sebagian besar keyboard AS. Sebuah contoh berikut:

<?php

$result = `date`;

printf("<p>The server timestamp is: %s", $result);

?>

Ini mengembalikan sesuatu yang mirip sebagai berikut:

Operator backtick secara operasional identik dengan fungsi shell_exec (), diperkenalkan berikutnya.

Sebuah Alternatif untuk tanda kutip terbalik

fungsi shell_exec () menawarkan sintaksis alternatif untuk tanda kutip terbalik, mengeksekusi perintah shell dan mengembalikan output. Prototipe nya berikut:

string shell_exec(string command)

Mempertimbangkan kembali contoh sebelumnya, kali ini kita akan menggunakan fungsi shell_exec () bukan tanda kutip terbalik:

<?php

$result = shell_exec("date");

printf("<p>The server timestamp is: %s</p>", $result);

?>

Ringkasan

Meskipun Anda tentu dapat pergi dengan sangat jauh dengan menggunakan hanya PHP untuk membangun aplikasi Web yang menarik dan kuat, kemampuan tersebut sangat diperluas ketika fungsi terintegrasi dengan platform yang mendasarinya dan teknologi lain. Sebagaimana diterapkan pada bab ini, teknologi ini meliputi operasi yang mendasarinya dan sistem file. Anda akan melihat tema ini berulang kali seluruh sisa dari buku ini, seperti kemampuan PHP untuk antarmuka dengan berbagai teknologi seperti LDAP, SOAP, dan Layanan Web yang diperkenalkan.

Dalam bab berikutnya, Anda akan diperkenalkan dengan PHP dan Aplikasi Extension Repository (PEAR) dan komunitas online penyimpanan untuk mendistribusikan dan berbagi kode.

■ ■ ■

CHAPTER 11

PEAR

Programmer yang Baik menulis kode yang solid, sedangkan programmer hebat menggunakan kembali kode programmer yang baik. Untuk programmer PHP, PEAR, singkatan untuk PHP Extension dan Aplikasi Repository, adalah salah satu cara yang paling efektif untuk mencari dan menggunakan kembali kode PHP yang solid. Terinspirasi oleh Perl CPAN yang sangat populer (Comprehensive Perl Archive Network), PEAR proyek dimulai pada tahun 1999 oleh pengembang PHP Stig Bakken, dengan rilis kestabilan pertama dibundel bersama versi PHP 4.3.0.

Secara formal didefinisikan, PEAR adalah framework dan sistem distribusi untuk komponen PHP dapat digunakan kembali dan saat ini menawarkan lebih dari 400 paket dikelompokkan dalam 37 topik yang berbeda. Karena kontribusi PEAR secara teliti ditinjau oleh komunitas sebelum mereka diterima, kode kualitas dan kepatuhan pada pedoman pengembangan standar PEAR's terjamin. Selanjutnya, karena banyak paket PEAR secara logika menerapkan tugas umum dijamin untuk berulang kali terjadi tidak peduli jenis aplikasi, mengambil keuntungan dari layanan ini berbasis komunitas akan menghemat berjam-jam waktu pemrograman.

Bab ini dikhususkan untuk sebuah diskusi yang cermat tentang PEAR, menawarkan topik-topik berikut:

• Survei beberapa paket PEAR populer, dimaksudkan untuk memberikan gambaran betapa berguna repositori ini.

• Pengenalan terhadap PEAR Package Manager, yang merupakan program command-line yang menawarkan antarmuka yang sederhana dan efisien untuk

melakukan tugas-tugas seperti inspeksi, menambahkan, memperbarui, dan menghapus paket, dan paket browsing berada dalam repositori.

Populer Paket PEAR

keindahan PEAR adalah menyajikan peluang untuk mudah mendistribusikan kode yang dikembangkan dengan baik mampu memecahkan permasalahan yang dihadapi oleh hampir semua pengembang PHP. Beberapa paket sangat umum digunakan bahwa mereka diinstal secara default. Yang lainnya disarankan untuk instalasi dengan installer PEAR.

Sebelum Paket terinstal

Beberapa paket sangat populer sehingga para pengembang dimulai secara otomatis termasuk mereka secara default pada versi PHP 4.0. Sebuah daftar paket yang saat ini disertakan berikut:

• Archive_Tar: The Archive_Tar paket memfasilitasi pengelolaan file tar, memberikan metode untuk membuat, pencatatan, mengekstrak, dan menambahkan ke file tar. Selain itu, ini mendukung Gzip dan algoritma kompresi Bzip2, memberikan masing-masing ekstensi PHP diinstal. Paket ini diperlukan untuk PEAR dapat berjalan dengan baik.

• Console_Getopt: Hal ini mungkin untuk membuat program PHP bahwa mengeksekusi dari baris perintah, banyak seperti yang mungkin Anda lakukan bersama Perl atau skrip shell. Seringkali perilaku dari program ini adalah tweak. Paket Console_Getopt menyediakan cara standar untuk membaca pilihan ini dan menyediakan pengguna dengan error pesan jika sintaks yang diberikan tidak sesuai dengan spesifikasi yang telah ditentukan (misalnya apakah argumen tertentu memerlukan parameter). Paket ini diperlukan untuk PEAR dapat berjalan dengan baik.

• PEAR: Paket ini diperlukan untuk PEAR dapat berjalan dengan baik.

Paket Installer yang Disarankan

Jika Anda menjalankan installer PEAR (bahkan jika PEAR sudah terinstal), Anda akan diminta apakah Anda ingin juga menginstal tujuh paket tambahan. Penjelasan dari tiap paket berikut. Saya sarankan memilih untuk menginstal semua dari mereka, karena semua sangat berguna:

• Mail: Menulis aplikasi PHP portabel yang mampu mengirim e-mail mungkin lebih rumit dari yang anda pikirkan karena tidak semua sistem operasi menawarkan fasilitas yang sama untuk mendukung fitur ini. Sebagai contoh, secara default, PHP fungsi mail () tergantung pada program sendmail (atau wrapper sendmail), tetapi sendmail tidak tersedia pada Windows. Untuk menjelaskan ketidaksesuaian ini, mungkin untuk alternatif menentukan alamat server SMTP dan mengirim mail melalui ini. Namun, bagaimana aplikasi Anda dapat menentukan metode mana yang tersedia? Paket Mail menyelesaikan dilema ini dengan menawarkan antarmuka yang seragam untuk mengirim mail yang tidak melibatkan memodifikasi konfigurasi PHP. Hal ini mendukung tiga belakang yang berbeda berakhir untuk mengirim e-mail dari aplikasi PHP (fungsi mail () PHP, sendmail, dan server SMTP) dan meliputi sebuah metode untuk memvalidasi sintaks alamat e-mail. Menggunakan file konfigurasi aplikasi sederhana atau berbasis web Bentuk preferensi, pengguna dapat menentukan metodologi yang paling sesuai dengan kebutuhan mereka.

• MDB2: paket MDB2 menyediakan query berorientasi objek API untuk abstrak komunikasi dengan lapisan database. Ini memberi Anda kemudahan transparan migrasi aplikasi dari satu database ke yang lain, berpotensi semudah memodifikasi satu baris kode. Saat ini ada delapan database yang didukung, meliputi FrontBase, Interbase, Microsoft SQL Server, MySQL, MySQLi, Oracle 7/8/9/XE, PostgreSQL, dan SQLite. Karena proyek MDB2 adalah gabungan dari dua proyek yang sudah ada sebelumnya, yaitu DB dan metabase, dan DB memiliki dukungan untuk dBase, Informix, MiniSQL, ODBC, dan Sybase, yang akan membayangkan dukungan untuk database ini akan segera ditambahkan ke MDB2, biasanya kelas atau fungsi library. Paket PHPUnit memfasilitasi penciptaan,

pemeliharaan, meskipun pada saat penulisan tidak ada yang diumumkan. MDB2 juga mendukung simulasi query menggunakan pendekatan QuerySim.

• Net_Socket: paket Net_Socket digunakan untuk mempermudah pengelolaan TCP socket dengan menawarkan API umum untuk melaksanakan koneksi dan membaca dan penulisan informasi diantara soket.

• Net_SMTP: Paket Net_SMTP menawarkan pelaksanaan SMTP, sehingga mudah bagi Anda untuk melaksanakan tugas seperti menghubungkan dan memutuskan hubungan dari server SMTP, melakukan autentikasi SMTP, mengidentifikasi pengirim, dan mengirim mail.

• PHPUnit : Tes unit adalah khususnya menguji metodologi untuk menjamin operasi yang tepat dari blok (atau unit) kode, biasanya kelas atau fungsi library. Paket PHPUnit memfasilitasi penciptaan, pemeliharaan, dan eksekusi tes unit dengan menetapkan seperangkat umum pedoman struktural dan cara untuk mengotomatisasi menguji.

• XML_Parser: Paket XML_Parser menawarkan solusi berorientasi objek yang mudah untuk menguraikan file XML.

Jika Anda belum dimulai mengambil keuntungan dari PEAR, kemungkinan Anda telah menghabiskan upaya yang signifikan dan waktu berulang kali menerapkan beberapa fitur ini. Namun, ini hanya segelintir dari apa yang tersedia; mengambil beberapa waktu untuk membaca dengan teliti http://pear.php.net/ untuk solusi yang lebih.

Kekuatan dari PEAR: Konversi Format angka

kekuatan PEAR yang terbaik ditunjukkan dengan sebuah contoh tertentu. Secara khusus, Saya meminta perhatian ke paket yang mencontohkan mengapa Anda secara berkala harus melihat ke repositori sebelum mencoba untuk menyelesaikan setiap tugas pemrograman yang signifikan.

Misalkan Anda baru-baru ini disewa untuk membuat sebuah situs web baru untuk produser film. Seperti kita semua tahu, ada produser yang serius menggunakan angka Romawi untuk mewakili tahun, dan manajer produk memberitahu Anda bahwa setiap tanggal pada situs web harus muncul dalam format ini. Luangkan waktu untuk berpikir tentang kebutuhan ini karena memenuhi tidak semudah kedengarannya. Tentu saja, Anda bisa melihat sebuah tabel konversi online dan hard-kode nilai, tapi bagaimana Anda memastikan bahwa tahun hak cipta situs di halaman footer selalu up to date? Kau hanya akan menyelesaikan untuk malam panjang coding ketika Anda berhenti sejenak untuk mempertimbangkan apakah orang lain telah mengalami masalah yang sama. "Tidak mungkin," kau menggerutu, tetapi mengambil momen cepat untuk mencari PEAR tentunya akan bernilai masalah. Anda menelusuri atas dan, cukup yakin, menemukan Numbers_Roman. Untuk tujuan latihan ini, anggap bahwa paket Numbers_Roman telah terinstal pada server. Jangan khawatir terlalu banyak tentang ini sekarang karena Anda akan belajar cara menginstal paket pada bagian berikutnya. Jadi bagaimana Anda akan pergi tentang memastikan tahun saat ini ditampilkan pada footer? Dengan menggunakan script berikut:

<?php

// Make the Numbers_Roman package available

require_once("Numbers/Roman.php");

// Retrieve current year

$year = date("Y");

// Convert year to Roman numerals

$romanyear = Numbers_Roman::toNumeral($year);

// Output the copyright statement

echo "Copyright &copy; $romanyear";

?>

Untuk tahun 2007, script ini akan menghasilkan berikut ini:

Moral dari cerita ini? Meskipun Anda mungkin berpikir bahwa masalah tertentu tidak jelas, programmer lain mungkin menghadapi masalah yang sama, dan jika Anda cukup beruntung, solusi sudah tersedia dan Anda untuk mengambil.

Instalasi dan Updating PEAR

PEAR menjadi suatu aspek penting dalam pemrograman PHP yang efisien yang rilis stabil telah disertakan dengan distribusi sejak versi 4.3.0. Oleh karena itu, jika Anda menjalankan versi ini atau lebih baru, merasa bebas untuk melompat ke depan dan meninjau bagian "Updating Pear." Jika Anda menjalankan versi 4.2.X PHP atau sebelumnya, pada bagian ini anda akan belajar cara menginstal PEAR Package Manager pada kedua platform Unix dan Windows. Karena banyak pembaca menjalankan situs Web pada penyedia hosting bersama, bagian ini juga menjelaskan bagaimana memanfaatkan PEAR tanpa menjalankan Package Manager.

Menginstal PEAR

Instalasi PEAR baik pada Unix dan Windows adalah masalah sepele, dilakukan dengan menjalankan script tunggal. Instruksi untuk kedua sistem operasi disediakan dalam dua subbagian berikut.

Instalasi PEAR pada Windows

PEAR tidak terinstal secara default dengan distribusi Windows. Untuk menginstalnya, anda perlu menjalankan file go-pear.bat, yang terletak pada direktori root distribusi PHP. File ini perintah menginstal PEAR, file dukungan yang diperlukan, dan enam paket PEAR di atas. Memulai proses instalasi dengan mengubah ke direktori root PHP dan mengeksekusi go-pear.bat, seperti:

%>go-pear.bat

Anda akan diminta untuk mengkonfirmasi beberapa pengaturan konfigurasi seperti lokasi direktori root PHP dan dieksekusi; Anda mungkin akan dapat menyetujui jawaban default tanpa masalah. Selama putaran pertanyaan, Anda juga akan diminta untuk apakah enam opsional paket standar harus diinstal. Ini saat ini semua-atau-tidak proposisi, sehingga, jika Anda ingin segera mulai menggunakan salah satu paket, langsung saja menyetujui permintaan tersebut.

■ Catatan Sementara upgrade PEAR pada versi 5.1. membutuhkan sedikit perubahan untuk proses instalasi di Unix / sistem Linux, tidak ada perubahan diperlukan untuk Windows, walaupun PHP 5.1 port Windows juga mencakup upgrade.

Demi kemudahan, Anda juga harus menambahkan path direktori instalasi PHP pada lingkungan variabel PATH sehingga perintah PEAR dapat dengan mudah dijalankan. Pada akhir proses instalasi, file registri bernama PEAR_ENV.reg dibuat. Pelaksana file ini akan menciptakan variabel lingkungan untuk sejumlah PEAR-spesifik variabel. Meskipun tidak kritis, menambahkan variabel ini ke path sistem memberi Anda kenyamanan dalam melaksanakan PEAR Package Manager dari lokasi sementara pada prompt perintah Windows.

■ Perhatian Mengeksekusi file PEAR_ENV.reg akan memodifikasi sistem registry. Meskipun modifikasi tertentu adalah tidak berbahaya, Anda tetap harus mempertimbangkan back up registry sebelum mengeksekusi script. Untuk melakukannya, masuk ke Start ➤ Run, jalankan regedit, dan kemudian mengekspor registry melalui File ➤Ekspor.

■ ■ ■

CHAPTER 12

Date and Time

Informasi berbasis Waktu-dan tanggal memainkan peran penting dalam hidup kita dan karenanya, programmer umumnya harus bertengkar dengan data sementara secara teratur. Kapan tutorial diterbitkan? Apakah informasi harga untuk produk tertentu baru-baru ini? Pukul berapa log kantor asisten ke dalam sistem akuntansi? Apa jam sehari halnya situs Web perusahaan melihat lalu lintas pengunjung sebagian besar? ini dan banyak Pertanyaan waktu berorientasi muncul secara teratur, membuat akuntansi yang tepat dari hal tersebut sangat penting bagi keberhasilan upaya program Anda. Bab ini memperkenalkan date PHP yang kuat dan kemampuan manipulasi waktu. Setelah menawarkan beberapa informasi awal tentang bagaimana menangani Unix dengan nilai date dan waktu, pada bagian yang disebut "Date Fu" Anda akan belajar bagaimana bekerja dengan waktu dan tanggal dalam beberapa cara berguna. Anda juga akan membuat kalender kotak menggunakan dengan tepat bernama paket PEAR Calendar. Akhirnya, tanggal jauh lebih baik dan fungsi manipulasi waktu yang tersedia pada PHP 5.1 diperkenalkan.

Unix Timestamp

Pemasangan aspek sering-aneh di dunia kita ke dalam kendala ketat lingkungan pemrograman bisa menjadi urusan membosankan. seperti Masalah secara khusus menonjol ketika berhadapan dengan tanggal dan waktu. Misalnya, Anda ditugaskan dengan menghitung selisih hari antara dua titik dalam waktu, namun tanggal yang disediakan dalam format July 4, 2007 3:45pm and 7th of December, 2007 18:17. Seperti yang mungkin Anda bayangkan, mencari tahu bagaimana

melakukan ini pemrograman akan menjadi urusan menakutkan. Yang Anda butuhkan adalah sebuah format standar, semacam kesepakatan tentang bagaimana semua tanggal dan waktu akan disajikan. Sebaiknya, informasi yang akan diberikan dalam beberapa jenis standar format angka-20070704154500 dan 20071207181700, misalnya. Dalam pemrograman dunia, nilai date dan waktu diformat sedemikian rupa biasanya disebut sebagai timestamp. Namun, bahkan situasi ini ditingkatkan memiliki masalah. Sebagai contoh, solusi yang diajukan masih belum menyelesaikan tantangan yang disajikan oleh zona waktu, siang hari menyimpan waktu, atau variasi budaya dalam format date. Anda perlu untuk membakukan menurut zona waktu tunggal dan menyusun format agnostik yang dapat dengan mudah diubah ke format yang diinginkan. Bagaimana mewakili nilai sementara dalam detik dan berdasar semuanya pada Coordinated Universal Time (UTC)? Bahkan, strategi ini dianut oleh awal tim pengembangan Unix, menggunakan 00:00:00 UTC January 1, 1970, sebagai dasar dari mana semua tanggal dihitung. date ini sering disebut sebagai zaman Unix. Oleh karena itu, anehnya diformat tanggal pada contoh sebelumnya akan benar-benar diwakili sebagai 1183578300, dan 1197069420 masing.

■ Perhatian Anda mungkin ingin tahu apakah mungkin untuk bekerja dengan tanggal sebelum zaman Unix (00:00:00 UTC January 1, 1970). Memang hal ini, setidaknya jika Anda menggunakan sistem berbasis Unix. Pada Windows, karena masalah overflow integer, kesalahan akan terjadi jika Anda mencoba untuk menggunakan fungsi berorientasi timestamp dalam bab ini dalam hubungannya dengan tanggal sebelum definisi zaman.

PHP Library Date dan Waktu

Bahkan aplikasi PHP sederhana sering melibatkan setidaknya beberapa fungsi PHP-date dan waktu-yang terkait. Apakah memvalidasi tanggal, format timestamp di beberapa

pengaturan tertentu, atau mengkonversi nilai tanggal terbaca-manusia untuk timestamp yang sesuai, fungsi-fungsi ini dapat membuktikan sangat berguna dalam menanggulangi dinyatakan tugas cukup kompleks.

■ Catatan Sementara perusahaan Anda mungkin berbasis di Ohio, situs Web perusahaan bisa dibayangkan host di mana saja, baik itu Texas, California, atau bahkan Tokyo. Hal ini dapat menimbulkan masalah jika Anda ingin representasi date dan waktu dan perhitungan harus didasarkan pada Zona Waktu Timur karena secara default PHP akan bergantung pada pengaturan zona waktu sistem operasi. Anda bisa, bagaimanapun, mengubah zona waktu situs Web Anda melalui direktif konfigurasi date.timezone, yang dapat dimanipulasi tiap biasanya melalui rute standar (lihat Bab 2) atau dengan menggunakan fungsi date_default_timezone_set (). Lihat manual PHP untuk informasi lebih lanjut.

Memvalidasi Tanggal

Meskipun sebagian besar pembaca jelas bisa mengingat pembelajaran "Tigapuluh Hari sesudah September" poem1 kembali pada sekolah dasar, itu tidak banyak dari kita yang bisa membacanya, perusahaan saat ini mencakup. Untungnya, fungsi checkdate() menyelesaikan tugas memvalidasi tanggal cukup baik, mengembalikan TRUE jika date yang diberikan adalah benar, dan FALSE sebaliknya. Prototipe nya berikut:

Boolean checkdate(int month, int day, int year)

Mari kita pertimbangkan contoh:

echo "April 31, 2007: ".(checkdate(4, 31, 2007) ? 'Valid' : 'Invalid');

// Returns false, because April only has 30 days

echo "<br />";

echo "February 29, 2004: ".(checkdate(02, 29, 2004) ? 'Valid' : 'Invalid');

// Returns true, because 2004 is a leap year

echo "<br />";

echo "February 29, 2007: ".(checkdate(02, 29, 2007) ? 'Valid' : 'Invalid');

// Returns false, because 2007 is not a leap year

Mengeksekusi contoh ini menghasilkan output sebagai berikut:

Format Tanggal dan Waktu

fungsi date () mengembalikan representasi string tanggal dan / atau waktu diformat sesuai dengan petunjuk yang ditetapkan oleh format yang telah ditetapkan. Prototipe nya berikut:

1. Tiga puluh hari setelah September, April, Juni, dan November, Semua sisanya memiliki tiga puluh satu, kecuali untuk Februari saja, dua puluh delapan hari yang jelas, Dan 29 pada setiap tahun kabisat.

string date(string format [, int timestamp])

Tabel 12-1 menyoroti parameter yang paling berguna. (Maafkan keputusan untuk melupakan dimasukkannya parameter untuk Time.2 Swatch Internet)

Jika Anda melewati pilihan timestamp, diwakili pada format timestamp Unix, date () akan mengembalikan representasi string yang sesuai dari tanggal dan

waktu. Jika timestamp tidak disediakan, timestamp Unix saat ini akan digunakan pada tempatnya.

2. Anda sebenarnya dapat menggunakan date () untuk memformat Swatch Internet Time. Dibuat di tengah-tengah ketidakwarasan dot-com, pembuat jam Swatch (http://www.swatch.com/) datang dengan konsep "waktu Internet," yang dimaksudkan untuk melakukan jauh dengan konsep lama berat zona waktu , bukan pengaturan waktu menurut "Swatch Beats.", Tidak mengherankan acuan universal untuk menjaga Swatch Internet Time didirikan melalui meridian yang berada di kantor Swatch perusahaan.

Meskipun memiliki secara teratur digunakan PHP selama bertahun-tahun, banyak programmer PHP masih perlu mengunjungi dokumentasi untuk menyegarkan ingatan mereka tentang daftar parameter yang diberikan dalam Tabel 12-1. Oleh karena itu, meskipun Anda belum tentu mampu mengingat bagaimana menggunakan fungsi ini hanya dengan meninjau beberapa contoh, mari kita lihat contoh hanya untuk memberi Anda pemahaman yang lebih jelas tentang date () yang mampu menyelesaikan.

Contoh pertama menunjukkan salah satu penggunaan yang paling biasa untuk date (), yang hanya untuk output tanggal standar ke browser:

echo "Today is ".date("F d, Y");

// Today is August 22, 2007

Contoh berikut menunjukkan bagaimana output hari dalam minggu:

echo "Today is ".date("l");

// Today is Wednesday

Mari kita coba presentasi yang lebih verbose dari date sekarang:

$weekday = date("l");

$daynumber = date("dS");

$monthyear = date("F Y");

printf("Today is %s the %s day of %s", $weekday, $daynumber, $monthyear);

Ini mengembalikan sebagai berikut:

Anda mungkin tergoda untuk memasukkan string nonparameter yang terkait langsung ke fungsi date(), seperti ini:

echo date("Today is l the ds day of F Y");

Memang, ini melakukan pekerjaan dalam beberapa kasus, namun hasilnya bisa sangat tak terduga. Misalnya, mengeksekusi kode sebelumnya menghasilkan berikut:

Namun, karena tanda baca tidak bertentangan dengan salah satu parameter, merasa bebas untuk menyisipkan sebagai yang diperlukan. Misalnya, untuk memformat date sebagai mm-dd-yyyy, gunakan perintah berikut:

echo date("m-d-Y");

// 04-26-2007

Bekerja dengan Waktu

fungsi date () juga dapat menghasilkan nilai waktu yang terkait. Mari kita jalankan melalui beberapa contoh, dimulai dengan hanya keluaran waktu sekarang:

echo "The time is ".date("h:i:s");

// The time is 07:44:53

Tetapi apakah itu pagi atau sore? Cukup tambahkan parameter:

echo "The time is ".date("h:i:sa");

// The time is 07:44:53pm

Belajar Lebih Banyak Tentang Waktu Sekarang

fungsi gettimeofday () mengembalikan sebuah array asosiatif yang terdiri dari unsur mengenai waktu sekarang. Prototipe nya berikut:

mixed gettimeofday([boolean return_float])

Bagi mereka yang menjalankan PHP 5.1.0 dan yang lebih baru, parameter opsional return_float menyebabkan gettimeofday () untuk mengembalikan waktu sekarang sebagai nilai float. Secara total, empat unsur yang dikembalikan:

• dsttime: siang hari Menyelamatkan waktu algoritma yang digunakan, yang bervariasi menurut lokasi geografis. Ada 11 nilai yang mungkin: 0 (tidak ada perbedaan waktu siang hari time dipaksakan), 1 (Amerika Serikat), 2 (Australia), 3 (Eropa Barat), 4 (Eropa Tengah), 5 (Eropa Timur), 6 (Kanada), 7 (Inggris dan Irlandia), 8 (Rumania), 9 (Turki), dan 10 (1986 variasi Australia).

• minuteswest: Jumlah menit barat dari Greenwich Mean Time (GMT).

• sec: Jumlah detik sejak zaman Unix.

• usec: Jumlah mikrodetik harus waktu fraksional supercede suatu nilai yang kedua keseluruhan.

Mengeksekusi Gettimeofday () dari server tes pada February 24, 2007 16:18:04 menghasilkan output sebagai berikut:

Tentu saja, ini mungkin untuk menugaskan output ke array dan kemudian referensi setiap elemen yang diperlukan:

$time = gettimeofday();

$GMToffset = $time['minuteswest'] / 60;

printf("Server location is %d hours west of GMT.", $GMToffset);

Ini mengembalikan sebagai berikut:

Mengubah Timestamp untuk Nilai User-Friendly

fungsi getdate () menyetujui Timestamp dan mengembalikan sebuah array asosiatif yang terdiri dari komponen-komponennya. Komponen dikembalikan berdasarkan pada tanggal dan waktu sekarang kecuali timestamp format Unix disediakan. Prototipe nya berikut:

array getdate([int timestamp])

Secara total, 11 elemen array dikembalikan, meliputi antara lain:

hours: Numerik mewakili dari jam. Rentang ini 0 sampai 23.

mday: mewakili Angka hari bulan. Rentang ini 1 sampai 31.

minutes: mewakili Angka dari menit. Rentang ini 0 sampai 59.

mon: mewakili Angka bulan. Rentang ini adalah 1 sampai 12.

month: mewakili teks lengkap dari bulan, misalnya, Juli.

seconds: mewakili Angka dari detik. Rentang ini 0 sampai 59.

wday: mewakili Angka hari dalam seminggu, misalnya, 0 untuk hari Minggu.

weekday: mewakili teks lengkap dari hari Seminggu itu, misalnya, Jumat.

yday: Mengimbangi Angka pada hari tahun. Rentang ini 0 sampai 364.

year: mewakili angka Empat digit tahun, misalnya, 2007.

0: Jumlah detik sejak Unix epoch (timestamp). Sementara rentang adalah sistem yang bergantung, pada sistem berbasis Unix ini umumnya -2147483648 sampai 2147483647, dan pada Windows rentang adalah 0 sampai 2147483648.

■ Perhatian sistem operasi Windows tidak mendukung nilai timestamp negatif, sehingga tanggal awal Anda bisa mengurai dengan fungsi ini pada Windows adalah tengah malam, January 1, 1970.

Pertimbangkan timestamp 1172350253 (February 24, 2007 15:50:53 EST). Mari kita meneruskannya kepada getdate () dan meninjau elemen array:

Bekerja dengan Timestamp

PHP menawarkan dua fungsi untuk bekerja dengan timestamps: time () dan mktime (). Yang pertama berguna untuk mengambil timestamp saat ini, sedangkan yang terakhir ini berguna untuk mengambil timestamp yang berhubungan dengan tanggal dan waktu tertentu. Kedua fungsi diperkenalkan di bagian ini.

Menentukan Timestamp saat ini

Fungsi time () ini berguna untuk mengambil timestamp Unix saat ini. Prototipe nya berikut:

int time()

Contoh berikut ini dieksekusi jam 15:25:00 EDT pada August 27, 2007:

echo time();

Hal ini menghasilkan timestamp yang sesuai:

Menggunakan fungsi date() yang sebelumnya diperkenalkan, timestamp ini nantinya bisa dikonversi kembali ke tanggal terbaca-manusia:

echo date("F d, Y h:i:s", 1187897100);

Ini mengembalikan sebagai berikut:

Membuat Timestamp Berdasarkan Tanggal Tertentu dan Waktu

Fungsi mktime () berguna untuk menghasilkan timestamp berdasarkan tanggal dan waktu tertentu. Jika tidak ada tanggal dan waktu yang disediakan, timestamp untuk tanggal dan waktu saat ini dikembalikan. Prototipe nya berikut:

int mktime([int hour [, int minute [, int second [, int month

[, int day [, int year [, int is_dst]]]]]]])

Tujuan dari setiap parameter opsional harus jelas, menyimpan untuk mungkin is_dst, yang harus di set ke 1 jika siang hari menghemat waktu berlaku, 0 jika tidak, atau -1 (default) jika Anda tidak yakin. Nilai default meminta PHP untuk mencoba menentukan apakah siang hari waktu penyimpanan ini berlaku. Sebagai contoh, jika Anda ingin tahu timestamp untuk February 24, 2007, 4:24 p.m., yang harus Anda lakukan adalah pasang pada Nilai yang sesuai:

echo mktime(16,24,00,2,24,2007);

Ini mengembalikan sebagai berikut:

Hal ini sangat berguna untuk menghitung perbedaan antara dua titik dalam waktu. Sebagai contoh, berapa jam yang ada antara sekarang (4 Juni 2007) dan tengah malam April 15, 2008?

$now = mktime();

$taxday = mktime(0,0,0,4,15,2008);

// Difference in seconds

$difference = $taxday - $now;

// Calculate total hours

$hours = round($difference / 60 / 60);

echo "Only $hours hours until tax day!";

Ini mengembalikan sebagai berikut:

Date Fu

Bagian ini menunjukkan beberapa tugas yang berhubungan dengan tanggal yang paling sering diminta, beberapa di antaranya hanya melibatkan satu fungsi dan lain-lain yang melibatkan beberapa kombinasi dari beberapa fungsi.

Menampilkan Tanggal dan Waktu Lokal

Sepanjang bab ini, dan memang buku ini, orang Amerika sementara dan format moneter telah umum digunakan, seperti 04-12-07 dan $ 2,600.93. Namun, bagian lain dari dunia menggunakan tanggal berbeda dan format waktu, mata uang, dan bahkan set karakter. Mengingat jangkauan global Internet, Anda mungkin harus membuat aplikasi yang mampu mengikuti luar negeri, atau lokal, format. Kenyataannya, mengabaikan untuk melakukannya bisa menyebabkan kebingungan yang cukup besar. Misalnya, Anda akan membuat situs Web yang buku pemesanan untuk sebuah hotel di Orlando, Florida. Hotel khusus ini populer di kalangan penduduk berbagai negara, sehingga Anda memutuskan untuk membuat beberapa versi lokal dari situs. Bagaimana seharusnya Anda menghadapi kenyataan bahwa kebanyakan negara menggunakan mata uang mereka sendiri dan format tanggal, belum lagi bahasa yang berbeda? Meskipun Anda bisa dengan kesulitan untuk menciptakan metode membosankan mengelola hal-hal tersebut, Ini mungkin akan rentan terhadap kesalahan dan mengambil beberapa waktu untuk menempatkan. Syukurlah, PHP menawarkan seperangkat built-in fitur untuk lokalisasi jenis data.

PHP tidak hanya dapat memfasilitasi format yang tepat dari tanggal, waktu, mata uang, dan semacamnya, tetapi juga dapat menerjemahkan nama bulan yang sesuai. Pada bagian ini, Anda akan belajar bagaimana untuk memanfaatkan fitur ini untuk memformat tanggal sesuai dengan setiap wilayah Anda Harap. Melakukan hal tersebut dasarnya membutuhkan dua fungsi: setlocale () dan strftime (). Keduanya diperkenalkan berikutnya, diikuti oleh beberapa contoh.

Mengatur Lokal Default

fungsi setlocale () mengubah lokalisasi default PHP dengan menetapkan nilai baru. Prototipe nya berikut:

string setlocale(mixed category, string locale [, string locale...])

string setlocale(mixed category, array locale)

String Lokalisasi secara resmi mengikuti struktur ini:

language_COUNTRY.characterset

Misalnya, jika Anda ingin menggunakan lokalisasi Italia, string locale harus di set ke it_IT. Lokalisasi Israel akan diatur ke he_IL, lokalisasi Inggris ke en_GB, dan lokalisasi Amerika Serikat ke en_US. Komponen characterset akan muncul ke dalam memainkan ketika berpotensi beberapa rangkaian karakter tersedia untuk lokal tertentu. Sebagai contoh, string lokal zh_CN.gb18030 digunakan untuk menangani Mongolia, Tibetan, Uigur, dan karakter Yi, sedangkan zh_CN.gb3212 untuk Cina Sederhana. Anda akan melihat bahwa parameter lokal dapat dilewatkan sebagai string yang berbeda atau array nilai lokal. Tapi kenapa melewati lebih dari satu lokasi? Fitur ini di menempatkan (sebagai versi PHP 4.2.0) untuk mengimbangi perbedaan antara kode lokal di sistem operasi yang berbeda. Mengingat bahwa sebagian besar aplikasi PHP-disebabkan menargetkan platform tertentu, ini seharusnya jarang menjadi masalah, namun, fitur tersebut harus ada Anda membutuhkannya.

Akhirnya, jika Anda menjalankan PHP pada Windows, perlu diingat bahwa, jelas dalam kepentingan menjaga kami di jari kaki kita, Microsoft telah merencanakan mengatur sendiri string lokalisasi. Anda dapat mengambil daftar kode bahasa dan negara di http://msdn.microsoft.com

■ Tip Pada beberapa sistem berbasis Unix, Anda dapat menentukan Lokal yang didukung dengan menjalankan perintah locale -a.

Hal ini mungkin untuk menentukan lokal untuk sebuah klasifikasi data tertentu. Enam kategori yang berbeda yang didukung:

LC_ALL: Ini menetapkan aturan lokalisasi untuk semua dari lima kategori berikut.

LC_COLLATE: String pembanding. Hal ini berguna untuk bahasa yang menggunakan karakter seperti â dan é.

LC_CTYPE: klasifikasi Karakter dan konversi. Misalnya, pengaturan kategori ini memungkinkan PHP untuk benar mengubah â untuk representasi huruf besar yang sesuai dari  menggunakan fungsi strtolower ().

LC_MONETARY: representasi Keuangan. Sebagai contoh, Amerika merupakan dolar dalam format ini: $50,00; Eropa mewakili euro dalam format ini: 50,00.

LC_NUMERIC: Numeric representasi. Sebagai contoh, Amerika mewakili jumlah besar dalam format ini: 1,412.00; Eropa mewakili jumlah besar dalam format ini: 1.412,00.

LC_TIME: Representasi tanggal dan waktu. Sebagai contoh, Amerika mewakili tanggal bersama bulan diikuti dengan hari, dan akhirnya tahun. February 12, 2005, akan direpresentasikan sebagai 02-12-2005. Bagaimanapun, Eropa (dan banyak dari seluruh dunia) mewakili tanggal ini sebagai 12-02-2005.

Misalkan Anda bekerja bersama nilai Keuangan dan ingin memastikan bahwa nilai diformat berdasarkan lokal Italia:

setlocale(LC_MONETARY, "it_IT");

echo money_format("%i", 478.54);

Ini mengembalikan sebagai berikut:

Untuk melokalisir tanggal dan waktu, Anda harus menggunakan setlocale () dalam hubungannya dengan strftime (), diperkenalkan berikutnya.

lokalisasi Tanggal dan Waktu

fungsi strftime ()format tanggal dan waktu sesuai dengan lokalisasi pengaturan sebagaimana ditentukan oleh setlocale (). Prototipe nya berikut:

string strftime(string format [, int timestamp])

perilaku strftime() sangat mirip dengan fungsi date(), menerima parameter konversi yang menentukan tata letak tanggal dan waktu yang diminta. Bagaimanapun, parameter berbeda dari yang digunakan oleh date (),reproduksi yang mengharuskan semua parameter tersedia, yang ditunjukkan pada Tabel 12-2 untuk referensi Anda. Perlu diingat bahwa semua parameter akan menghasilkan output berdasarkan lokal yang ditetapkan. Juga mencatat bahwa beberapa parameter tidak didukung pada Windows.

Dengan yang menggunakan strftime () dalam hubungannya dengan setlocale (), mungkin untuk memformat tanggal sesuai dengan bahasa lokal pengguna Anda, standar, dan kebiasaan. Sebagai contoh, akan lebih sederhana untuk memberikan pengguna situs Web travel dengan jadwal lokal bersama tanggal dan biaya tiket:

Benvenuto abordo, Sr. Sanzi<br />

<?php

setlocale(LC_ALL, "it_IT");

$tickets = 2;

$departure_time = 1118837700;

$return_time = 1119457800;

$cost = 1350.99;

?>

Numero di biglietti: <?php echo $tickets; ?><br />

Orario di partenza: <?php echo strftime("%d %B, %Y", $departure_time); ?><br />

Orario di ritorno: <?php echo strftime("%d %B, %Y", $return_time); ?><br />

Prezzo IVA incluso: <?php echo money_format('%i', $cost); ?><br />

Menampilkan Tanggal Modifikasi Terbaru Halaman Web

Hampir satu dekade lamanya, Web sudah mulai terlihat seperti kantor packrat. Dokumen yang bertebaran di mana-mana, banyak yang sudah tua, usang, dan sering benar-benar tidak relevan. Salah satu strategi yang biasa untuk membantu pengunjung menentukan validitas dokumen melibatkan penambahan timestamp ke halaman. Tentu saja, melakukannya secara manual hanya akan mengundang error, sebagai administrator halaman akhirnya akan lupa untuk memperbarui timestamp. Namun, mungkin untuk secara otomatis proses yang menggunakan

date() dan getlastmod (). fungsi getlastmod () mengembalikan nilai dari halaman header Modifikasi terakhir, atau FALSE dalam kasus error. Prototipe nya berikut:

int getlastmod()

Jika Anda menggunakannya bersama bersama date (), memberikan informasi mengenai waktu modifikasi halaman terakhir dan tanggal yang sepele:

$lastmod = date("F d, Y h:i:sa", getlastmod());

echo "Page last modified on $lastmod";

mengembalikan Output ini mirip dengan sebagai berikut:

Menentukan Jumlah Hari dalam Bulan saat ini

Untuk menentukan jumlah hari dalam bulan saat ini, menggunakan fungsi date () parameter t. Perhatikan kode berikut:

printf("There are %d days in %s.", date("t"), date("F"));

Jika ini dieksekusi pada bulan April, hasil berikut akan menampilkan:

Menentukan Jumlah Hari di Setiap Bulan yang di berikan

Terkadang Anda mungkin ingin menentukan jumlah hari dalam beberapa bulan selain bulan ini. fungsi date () aja tidak akan bekerja karena membutuhkan timestamp, dan Anda mungkin hanya memiliki bulan dan tahun yang tersedia.

Namun, fungsi mktime() dapat digunakan bersama dengan date() untuk menghasilkan hasil yang diinginkan. Misalnya anda ingin menentukan jumlah hari yang ditemukan pada bulan Februari 2007:

$lastday = mktime(0, 0, 0, 3, 0, 2007);

printf("There are %d days in February 2007.", date("t",$lastday));

Mengeksekusi potongan ini menghasilkan output sebagai berikut:

There are 28 days in February 2007.

Menghitung Tanggal X Hari dari Tanggal Sekarang

Ini sering berguna untuk menentukan tanggal yang tepat dari beberapa jumlah tertentu hari ke masa depan atau masa lalu. Menggunakan fungsi strtotime() dan sintaks date GNU, permintaan seperti ini sepele. Misalnya anda ingin tahu tanggal berapa akan menjadi 45 hari ke depan, berdasarkan tanggal hari ini tanggal 25 Februari 2007:

$futuredate = strtotime("45 days");

echo date("F d, Y", $futuredate);

Ini mengembalikan sebagai berikut:

Dengan mengawali tanda negatif, Anda dapat menentukan tanggal 45 hari ke dalam masa lalu (hari ini menjadi 25 Februari 2007):

$pastdate = strtotime("-45 days");

echo date("F d, Y", $pastdate);

Ini mengembalikan sebagai berikut:

Bagaimana dengan sepuluh minggu dan dua hari dari hari ini (25 Februari 2007)?

$futuredate = strtotime("10 weeks 2 days");

echo date("F d, Y", $futuredate);

Ini mengembalikan sebagai berikut:

Mengambil Keuntungan dari PEAR: Membuat Kalender

Kalender paket PEAR terdiri dari sejumlah kelas yang mampu mengotomatisasi berbagai tugas-tugas kronologis seperti berikut:

• Pengolahan kalender dari lingkup apapun dalam format pilihan Anda (per jam, harian, mingguan, bulanan, dan tahunan yang paling umum).

• kalender Navigasi dalam cara yang mirip dengan yang digunakan oleh Kalender Gnome dan Windows Tanggal & Waktu Properties antarmuka.

• Memvalidasi tanggal apapun. Sebagai contoh, Anda dapat menggunakan Calendar untuk menentukan apakah April 1, 2019, jatuh pada hari Senin (hal itu).

• Memperluas kemampuan Kalender untuk mengatasi berbagai analisis tugas-tanggal lain misalnya.

Sebelum Anda dapat mulai mengambil keuntungan dari paket yang kuat, anda perlu menginstalnya. Anda belajar tentang proses instalasi paket PEAR dalam Bab 11 tapi bagi anda yang belum sepenuhnya akrab dengan ini, langkah-langkah yang diperlukan direproduksi berikutnya.

Instalasi Kalender

Untuk memanfaatkan atas semua fitur Kalender, Anda juga perlu menginstal paket Tanggal. Mari kita memelihara baik selama proses instalasi Kalender, yang berikut:

%>pear install -a -f Date

tanda -f disertakan ketika menginstal Kalender sini karena, pada saat tulisan ini, Kalender masih rilis beta. Pada saat publikasi, Kalender bisa secara resmi stabil, berarti Anda tidak akan perlu untuk memasukkan tanda ini. Lihat Bab 11 untuk pengenalan lengkap untuk PEAR dan perintah instal.

Bekerja dengan Calendar

Sebagai tambahan dari kelas dasar Kalender, paket Kalender terdiri dari beberapa kelas public dipecah menjadi empat kelompok yang berbeda:

Date classes: Digunakan untuk mengelola enam komponen tanggal: tahun, bulan, hari, jam, menit, dan detik. Sebuah kelas terpisah ada untuk setiap komponen: Calendar_Year, Calendar_Month, Calendar_Day, Calendar_Hour, Calendar_Minute, dan Calendar_Second.

Tabular date classes: Digunakan untuk membangun bulanan dan kotak berbasis kalender mingguan. Tiga kelas ini yang tersedia: Calendar_Month_Weekdays, Calendar_Month_Weeks, dan Calendar_Week. Kelas-kelas ini berguna untuk membangun kalender bentuk tabel bulanan di harian dan format mingguan, dan kalender bentuk tabel mingguan dalam format tujuh-hari, masing-masing.

Validation classes: Digunakan untuk validasi tanggal. Kedua kelas Calendar_Validator, yang digunakan untuk memvalidasi setiap komponen tanggal dan dapat dipanggil oleh subclass apapun, dan Calendar_Validation_Error, yang menawarkan tingkat tambahan pelaporan jika ada sesuatu yang salah dengan tanggal dan menyediakan beberapa metode untuk membedah nilai tanggal.

Decorator classes: Digunakan untuk memperpanjang kemampuan subclass lain tanpa harus benar-benar memperluas mereka. Misalnya, Anda ingin memperluas fungsi Calendar dengan beberapa fitur untuk menganalisis jumlah hari Sabtu jatuh pada tanggal 17 setiap bulan. Sebuah dekorator akan menjadi cara yang ideal untuk membuat fitur itu yang tersedia. Beberapa dekorator ditawarkan untuk referensi dan digunakan, meliputi Calendar_Decorator, Calendar_Decorator_Uri, Calendar_Decorator_Textual, and Calendar_Decorator_Wrapper. Dalam kepentingan hanya mencakup fitur yang paling umum digunakan, dekorator

Kalender internal tidak dibahas di sini; pertimbangkan meneliti dekorator diinstal dengan Kalender untuk ide-ide tentang bagaimana cara membuat sendiri.

Semua empat kelas adalah subclass dari Kalender, yang berarti semua metode kelas Kalender tersedia untuk masing-masing subclass. Untuk ringkasan lengkap metode untuk superclass ini dan empat subkelas, lihat http://pear.php.net/package/Calendar.

Membuat Kalender Bulanan

Hari ini, kalender bulanan berbasis kotak tampaknya menjadi salah satu fitur yang paling sering diinginkan situs Web, terutama mengingat popularitas konten berbasis waktu seperti sebagai blog. Namun membuat satu dari awal bisa akal akalan sulit. Syukurlah, Kalender menangani semua kebosanan untuk Anda, menawarkan kemampuan untuk membuat kalender kotak hanya dengan beberapa baris kode. Misalnya, Anda ingin membuat kalender seperti ditunjukkan pada Gambar 12-1.

Kode untuk membuat kalender ini ternyata sederhana dan disajikan pada properti 12-1. Penjelasan baris kode kunci berikut, mengacu pada nomor baris mereka untuk kemudahan.

Listing 12-1. Creating a Monthly Calendar

01 <?php

02 require_once 'Calendar/Month/Weekdays.php';

03

04 $month = new Calendar_Month_Weekdays(2006, 4, 0);

05

06 $month->build();

07

08 echo "<table class='calendar'>\n";

09 echo "<tr><th>April, 2006</th></tr>";

10 echo "<tr><td>Su</td><td>Mo</td><td>Tu</td><td>We</td>

11 <td>Th</td><td>Fr</td><td>Sa</td></tr>";

12 while ($day = $month->fetch()) {

13 if ($day->isFirst()) {

14 echo "<tr>";

15 }

16

17 if ($day->isEmpty()) {

18 echo "<td>&nbsp;</td>";

19 } else {

20 echo '<td>'.$day->thisDay()."</td>";

21 }

22

23 if ($day->isLast()) {

24 echo "</tr>";

25 }

26 }

27

28 echo "</table>";

29 ?>

Line 02: Karena Anda ingin membangun sebuah kalender kotak yang mewakili bulan, kelas Calendar_Month_Weekdays diperlukan. Baris 02 membuat kelas ini tersedia untuk script.

Line 04: Kelas Calendar_Month_Weekdays adalah instantiated, dan tanggal diatur untuk April, 2006. Kalender harus ditata dari Minggu sampai Sabtu, sehingga parameter ketiga diatur ke 0, yang merupakan perwakilan dari Minggu numerik dikurangkan (1 untuk Senin, 2 untuk Selasa, dll).

Line 06: metode build () menghasilkan array yang terdiri dari semua tanggal yang ditemukan pada bulan.

Line 12: loop while dimulai, bertanggung jawab untuk siklus melalui setiap hari bulan tersebut.

Lines 13–15: Jika $Day adalah hari pertama dalam minggu itu, output tag <tr>.

Lines 17–21: Jika $Day kosong, output sel kosong. Jika tidak, output jumlah hari.

Lines 23–25: Jika $Day adalah hari terakhir dalam seminggu, output tag </ tr>.

Cukup sederhana bukan? Membuat kalender mingguan dan harian beroperasi pada pemikiran yang sangat mirip. Hanya memilih kelas yang tepat dan menyesuaikan format sesuai keinginan Anda.

Memvalidasi Tanggal dan Waktu

Sementara fungsi PHP checkdate() berguna untuk validasi tanggal, itu mengharuskan semua tiga komponen tanggal (bulan, hari, dan tahun) disediakan. Tetapi bagaimana jika Anda ingin memvalidasi hanya satu komponen tanggal, bulan, misalnya ? Atau mungkin anda ingin memastikan nilai waktu (hours:minutes:seconds), atau beberapa bagian tertentu dari itu, adalah yang sah sebelum dimasukkan ke dalam database. Paket Kalender menawarkan beberapa metode untuk memastikan baik tanggal dan waktu, atau bagian daripadanya. Daftar ini memperkenalkan metode ini:

isValid():Mengeksekusi semua waktu yang lain dan metode tanggal validator, pengesahan suatu tanggal dan waktu

isValidDay(): Memastikan bahwa suatu hari jatuh antara 1 dan 31

isValidHour(): Memastikan bahwa nilai jatuh antara 0 dan 23

isValidMinute(): Memastikan bahwa nilai jatuh antara 0 dan 59

isValidMonth(): Memastikan bahwa nilai jatuh antara 1 dan 12

isValidSecond(): Memastikan bahwa nilai jatuh antara 0 dan 59

isValidYear(): Memastikan bahwa nilai jatuh antara 1902 dan 2037 pada Unix, atau 1970 dan 2037 pada Window

Tanggal dan Waktu Tambahan untuk Pengguna PHP 5.1 +

Peningkatan dukungan untuk tanggal PHP dan dukungan waktu telah ditambahkan di PHP 5.1. Tidak hanya antarmuka berorientasi obyek yang ditambahkan, tapi juga mampu untuk mengelola tanggal Anda dan waktu yang berkaitan dengan berbagai zona waktu. bagian ini menyentuh hanya pada antarmuka berorientasi objek.

Memperkenalkan Konstruktor DateTime

Sebelum Anda dapat menggunakan fitur Tanggal, Anda perlu instantiate objek tanggal tersebut melalui konstruktor kelasnya. Prototipe konstruktor berikut:

object DateTime([string $time [, DateTimeZone $timezone]])

method Date () adalah konstruktor kelas. Anda dapat menetapkan tanggal baik pada saat Instansiasi atau kemudian dengan menggunakan berbagai mutator (setter). Untuk membuat objek date kosong (yang akan mengatur objek ke tanggal sekarang), hanya memanggil DateTime () seperti ini

$date = new DateTime();

Untuk membuat objek dan menetapkan tanggal Februari 27, 2007, jalankan perintah berikut:

$date = new Date("27 February 2007");

Anda dapat mengatur waktu juga, misalnya untuk 9:55 p.m, seperti:

$date = new Date("27 February 2007 21:55");

Atau Anda hanya dapat mengatur waktu seperti:

$date = new Date("21:55");

Bahkan, Anda dapat menggunakan salah satu format yang didukung oleh PHP strtotime () fungsi, diperkenalkan sebelumnya dalam bab ini. Lihat manual PHP untuk contoh tambahan format yang didukung. opsional parameter $timezone merujuk ke salah satu PHP yang didukung pengaturan zona waktu. Ingat bahwa secara default PHP akan menggunakan waktu yang ditentukan oleh server Anda, yang dapat dibayangkan ditemukan di mana saja di planet ini. Jika Anda ingin tanggal dan waktu untuk sesuai dengan zona waktu yang ditetapkan, Anda dapat menggunakan parameter ini. Konsultasikan manual PHP untuk informasi lebih lanjut tentang dukungan zona waktu tersebut.

Memformat Tanggal

format tanggal dan waktu untuk output, atau mudah mengambil komponen tunggal, Anda dapat menggunakan method format (). Metode ini menerima parameter yang sama dengan fungsi date (). Misalnya, untuk keluaran tanggal dan waktu menggunakan format 2007-02-27 09:55:00pm Anda akan memanggil format () seperti:

echo $date->format("Y-m-d h:i:sa");

Pengaturan Tanggal Setelah Instansiasi

Setelah objek DateTime adalah instantiated, Anda dapat mengatur tanggal dengan method setDate (). Method setDate () menetapkan hari objek tanggal, bulan, dan tahun, mengembalikan TRUE pada keberhasilan, dan FALSE sebaliknya. Prototipe nya berikut:

Boolean setDate(integer year, integer month, integer day)

Mari kita menetapkan tanggal untuk February 27, 2007:

$date = new DateTime();

$date->setDate(2007,2,27);

echo $date->format("F j, Y");

Ini mengembalikan sebagai berikut:

Pengaturan Waktu Setelah Instansiasi

Sama seperti Anda dapat mengatur tanggal setelah Instansiasi DateTime, Anda dapat mengatur waktu dengan menggunakan method setTime (). method setTime ()menetapkan objek jam, menit, dan secara opsional kedua, mengembalikan TRUE pada kesuksesan dan FALSE sebaliknya. Prototipe nya berikut:

Boolean setTime(integer hour, integer minute [, integer second])

Mari kita atur waktu untuk 08:55pm:

$date = new DateTime();

$date->setTime(20,55);

echo $date->format("h:i:s");

Ini mengembalikan sebagai berikut:

Mengubah Tanggal dan Waktu

Anda dapat memodifikasi objek DateTime menggunakan method modify().Metode ini menerima sintaks yang user-friendly sama dengan yang digunakan di dalam konstruktor. Misalnya, Anda membuat DateTime objek yang memiliki nilai February 28, 2007 00:33:00. Sekarang Anda ingin mengatur tanggal ke depan dengan tujuh jam, berubah ke February 28, 2007 7:33:00:

$date = new DateTime("February 28, 2007 00:33");

$date->modify("+7 hours");

echo $date->format("Y-m-d h:i:s");

Ini mengembalikan sebagai berikut:

Ringkasan

Bab ini mencakup cukup sedikit bahan, dimulai dengan tinjauan dari beberapa tanggal dan fungsi waktu yang muncul hampir setiap hari dalam tugas-tugas pemrograman PHP yang khas. Selanjutnya adalah perjalanan ke dalam seni kuno Tanggal Fu, di mana Anda belajar bagaimana untuk menggabungkan kemampuan fungsi ini untuk melaksanakan tugas kronologis yang berguna. Anda juga membaca tentang paket PEAR Kalender yang berguna, di mana Anda belajar bagaimana untuk membuat kalender berbasis bentuk kotak dan mekanisme validasi dan navigasi. Akhirnya, pengantar PHP 5.1 fitur-manipulasi tanggal berorientasi objek telah disediakan.

Bab selanjutnya berfokus pada topik yang mungkin bertanggung jawab atas lembing ketertarikan Anda dalam mempelajari lebih banyak tentang PHP: interaktif pengguna. Kita akan melompat ke dalam pengolahan data melalui formulir, menunjukkan baik fitur dasar dan Topik lanjutan seperti bagaimana bekerja dengan komponen form multivalue dan generasi form otomatis. Anda juga akan belajar bagaimana untuk memudahkan navigasi user dengan menciptakan jalur navigasi tepung roti dan kustom 404 pesan.

■ ■ ■

CHAPTER 13

Forms

Anda dapat membuang tentang istilah teknis seperti hubungan database, Web Services, penanganan session, dan LDAP, tetapi ketika datang ke sana, Anda mulai belajar PHP karena Anda ingin membangun keren, situs Web interaktif. Setelah semua, salah satu aspek yang paling memikat Web adalah bahwa hal itu dua cara media; Web tidak hanya memungkinkan Anda untuk mempublikasikan informasi tetapi juga menawarkan cara yang efektif untuk berinteraksi dengan rekan-rekan, klien, dan teman-teman. Bab ini memperkenalkan salah satu cara yang paling umum dimana Anda dapat menggunakan PHP untuk berinteraksi dengan user: form Web.

Sebagian besar materi dalam bab ini harus cukup sederhana untuk memahami, namun pemahaman sangat penting bagi siapa saja yang tertarik dalam membangun bahkan dasar situs web. Secara total, bab ini membahas Topik sebagai berikut:

• Memahami konsep dasar PHP dan form Web

• Melewati data form ke fungsi PHP

• Bekerja dengan komponen form multivalued

• Mengambil keuntungan dari PEAR: paket HTML_QuickForm

• Menciptakan mekanisme secara otomatis pelengkapan

PHP and Form Web

Apa yang membuat Web sangat menarik dan berguna adalah kemampuannya untuk menyebarkan informasi serta mengumpulkan itu, terutama melalui form berbasis HTML. Form ini digunakan untuk mendorong masukan situs, memfasilitasi percakapan forum, mengumpulkan alamat milis untuk pemesanan online, dan banyak lagi. tapi coding form HTML hanya bagian dari apa yang diminta untuk secara efektif menerima input pengguna, sebuah komponen sisi server harus siap untuk memproses input. Menggunakan PHP untuk tujuan ini adalah subjek dari bagian ini. Karena Anda telah menggunakan form ratusan jika tidak ribuan kali, bab ini tidak akan memperkenalkan form sintaks. Jika Anda memerlukan primer atau kursus penyegaran tentang cara membuat formu dasar, memikirkan untuk melihat kembali salah satu dari banyak tutorial yang tersedia di Web. Dua situs sangat berguna yang menawarkan form khusus tutorial berikut:

• W3 Schools: http://www.w3schools.com/

• TopXML: http://www.topxml.com/

Sebaliknya, bab ini Tinjauan bagaimana Anda dapat menggunakan form Web bersamaan dengan PHP untuk mengumpulkan dan memproses data pengguna yang berharga.

Ada dua metode umum untuk melewati data dari satu script ke lainnya: GET dan POST. Meskipun GET default, Anda umumnya akan ingin menggunakan POST karena ini mampu menangani data yang sangat lebih banyak, perilaku penting bila Anda menggunakan form untuk memasukkan dan memodifikasi blok besar dari teks. Jika Anda menggunakan POST, setiap diposting data dikirim ke sebuah skrip PHP harus dirujuk dengan menggunakan sintaks $_POST, diperkenalkan pada Bab 3. Misalnya, form berisi nilai teks-field bernama email yang terlihat seperti ini:

<input type="text" id="email" name="email" size="20" maxlength="40" />

Setelah formulir ini dikirimkan, Anda dapat referensi bahwa nilai field teks seperti:

$_POST['email']

Tentu saja, demi kenyamanan, tidak ada yang mencegah Anda dari pertama menugaskan nilai ini ke variabel lainnya, seperti:

$email = $_POST['email'];

Tapi mengikuti praktek terbaik tidak pernah menganggap input pengguna akan menjadi aman, Anda harus menyaring melalui salah satu dari beberapa fungsi yang mampu mensterilkan data, seperti htmlentities(), seperti ini :

$email = htmlentities($_POST['email']);

fungsi htmlentities () mengubah string yang terdiri dari karakter jahat yang mampu memodifikasi suatu halaman HTML yang harus dikirimkan pengguna-data yang yang kemudian akan dipublikasikan ke sebuah situs web, seperti forum Web. Anda Dapat mempelajari lebih banyak tentang penyaringan masukan pengguna untuk publikasi yang aman dan penyimpanan di Bab 21.

Perlu diingat bahwa selain dari format aneh, variabel $_POST sama seperti variabel lainnya. Mereka hanya dirujuk dalam cara ini dalam upaya untuk secara pasti milah asal usul variabel eksternal. Seperti yang Anda pelajari dalam Bab 3, seperti konvensi tersedia untuk variabel yang berasal dari metode GET, cookies, sessions, server, and upload file. Bagi Anda dengan latar belakang berorientasi obyek, menganggapnya sebagai namespace untuk variabel. Bagian ini memperkenalkan sejumlah skenario di mana PHP dapat memainkan peran yang sangat efektif tidak hanya dalam mengelola data form tetapi juga benar-benar menciptakan form itu sendiri. Sebagai permulaan, meskipun, mari kita lihat sebuah contoh sederhana.

contoh sederhana

script berikut membuat form yang meminta pengguna untuk namanya dan alamat e-mail. Setelah selesai dan dikirimkan, script (bernama subscribe.php) menampilkan informasi ini kembali ke jendela browser.

<?php

// If the name field is filled in

if (isset($_POST['name']))

{

$name = htmlentities($_POST['name']);

$email = htmlentities($_POST['email']);

printf("Hi %s! <br />", $name);

printf("The address %s will soon be a spam-magnet! <br />", $email);

}

?>

<form action="subscribe.php" method="post">

<p>

Name:<br />

<input type="text" id="name" name="name" size="20" maxlength="40" />

</p>

<p>

Email Address:<br />

<input type="text" id="email" name="email" size="20" maxlength="40" />

</p>

<input type="submit" id="submit" name = "submit" value="Go!" />

</form>

Dengan asumsi bahwa pengguna menyelesaikan kedua bidang dan klik Go! button, output yang sama untuk berikut ini akan ditampilkan:

Dalam contoh ini form mengacu ke skrip yang ditemukan, bukan script lainnya. Meskipun kedua praktek secara teratur digunakan, ini cukup biasa untuk merujuk pada dokumen yang berasal dan menggunakan logika kondisional untuk menentukan tindakan yang harus dilakukan. Dalam hal ini, logika kondisional menyatakan bahwa pernyataan echo hanya akan terjadi jika pengguna telah dikirimkan (diposting) form.

Dalam kasus di mana Anda posting data kembali ke script yang sama dari mana ia berasal, seperti pada contoh sebelumnya, Anda dapat menggunakan variabel PHP superglobal $_SERVER['PHP_SELF']. Nama dari script yang sedang dijalankan secara otomatis ditetapkan untuk variabel ini; Oleh karena itu, menggunakannya sebagai pengganti nama file yang sebenarnya akan menyimpan beberapa modifikasi kode tambahan yang harus nama file kemudian berubah. Sebagai contoh, tag <form> pada contoh sebelumnya dapat dimodifikasi sebagai berikut dan masih menghasilkan hasil yang sama:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">

Melewati Data Form ke Fungsi

Proses untuk melewati data form untuk fungsi identik ke proses untuk melewati setiap variabel lain; Anda hanya melewati data form diposting sebagai parameter fungsi. Misalnya anda ingin menggabungkan beberapa validasi server-side ke dalam contoh sebelumnya menggunakan fungsi kustom untuk memverifikasi validitas sintaksis alamat e-mail. Properti 13-1 menyajikan script direvisi.

Listing 13-1. Validating Form Data in a Function (subscribe.php)

<?php

// Function used to check e-mail syntax

function validateEmail($email)

{

// Create the e-mail validation regular expression

$regexp = "^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)

(\.[a-z0-9-]+)*(\.[a-z]{2,6})$";

// Validate the syntax

if (eregi($regexp, $email)) return 1;

else return 0;

}

// Has the form been submitted?

if (isset($_POST['submit']))

{

$name = htmlentities($_POST['name']);

$email = htmlentities($_POST['email']);

printf("Hi %s<br />", $name);

if (validateEmail($email))

printf("The address %s is valid!", $email);

else

printf("The address <strong>%s</strong> is invalid!", $email);

}

?>

<form action="subscribe.php" method="post">

<p>

Name:<br />

<input type="text" id="name" name="name" size="20" maxlength="40" />

</p>

<p>

E-mail Address:<br />

<input type="text" id="email" name="email" size="20" maxlength="40" />

</p>

<input type="submit" id="submit" name = "submit" value="Go!" />

</form>

Bekerja dengan Komponen Form multivalued

komponen form Multivalued seperti kotak checkbox dan multipilih sangat meningkatkan kemampuan data-koleksi berbasis Web karena mereka memungkinkan pengguna untuk secara bersamaan memilih beberapa nilai untuk item form yang diberikan. Sebagai contoh, pertimbangkan form yang digunakan untuk mengukur minat pengguna komputer yang terkait. Khususnya, Anda ingin untuk meminta pengguna untuk menunjukkan bahasa pemrograman yang menarik baginya. Menggunakan beberapa field teks bersama dengan beberapa kotak-pilih, form ini mungkin terlihat serupa dengan yang ditunjukkan pada Gambar 13-1.

HTML untuk beberapa kotak-pilih ditunjukkan pada Gambar 13-1 akan terlihat seperti ini:

<select name="languages[]" multiple="multiple">

<option value="csharp">C#</option>

<option value="jscript">JavaScript</option>

<option value="perl">Perl</option>

<option value="php">PHP</option>

</select>

Karena komponen ini multivalued, form prosesor harus dapat mengenali bahwa mungkin ada beberapa nilai yang ditempatkan ke variabel form single. Dalam contoh sebelumnya, perhatikan bahwa menggunakan kedua bahasa nama untuk masukan bahasa beberapa acuan. Bagaimana PHP menangani masalah ini? Mungkin tidak mengherankan, dengan mempertimbangkan itu array. Untuk membuat PHP mengakui bahwa beberapa nilai mungkin ditugaskan untuk sebuah variabel form single, Anda perlu membuat perubahan kecil untuk nama item form, menambahkan sepasang kurung kotak untuk itu. Oleh karena itu, bukan languages, nama akan membaca languages []. Setelah diganti, PHP akan memperlakukan variabel diposting sama seperti array lainnya. Pertimbangkan contoh lengkap pada script multiplevaluesexample.php:

<?php

if (isset($_POST['submit']))

{

echo "You like the following languages:<br />";

foreach($_POST['languages'] AS $language) {

$language = htmlentities($language);

echo "$language<br />";

}

}

?>

<form action="multiplevaluesexample.php" method="post">

What's your favorite programming language?<br /> (check all that apply):<br />

<input type="checkbox" name="languages[]" value="csharp" />C#<br />

<input type="checkbox" name="languages[]" value="jscript" />JavaScript<br />

<input type="checkbox" name="languages[]" value="perl" />Perl<br />

<input type="checkbox" name="languages[]" value="php" />PHP<br />

<input type="submit" name="submit" value="Submit!" />

</form>

Jika pengguna memilih languages C # dan PHP, dia disambut dengan output sebagai berikut:

Mengambil Keuntungan dari PEAR: HTML_QuickForm

Sedangkan contoh sebelumnya menunjukkan bahwa itu cukup mudah untuk kode secara manual dan proses form menggunakan HTML tua biasa dan PHP, hal-hal yang dapat dengan cepat menjadi rumit dan rawan kesalahan saat validasi dan pengolahan yang lebih rumit memasukkan gambar, sebagai kemungkinan untuk setiap aplikasi yang ambisius. Syukurlah, ini adalah tantangan yang dihadapi oleh semua pengembang Web, sehingga cukup sedikit kerja menempatkan ke dalam mengotomatisasi penciptaan form, validasi, dan proses penanganan. Solusi datang dengan cara mengesankan paket HTML_QuickForm, tersedia melalui PEAR repositori. HTML_QuickForm jauh lebih daripada formulir sederhana - kelas generasi, ia menawarkan lebih dari 20 elemen form XHTML-kompatibel, dan validasi client-server-side, kemampuan untuk mengintegrasikan dengan template engine seperti Smarty (lihat Bab 19 untuk lebih lanjut tentang Smarty), dapat diperluas model yang memungkinkan Anda untuk membuat elemen kustom Anda sendiri, dan banyak lagi. Bagian ini memperkenalkan paket bagus, menunjukkan beberapa fitur yang paling berguna.

Menginstal HTML_QuickForm

Untuk memanfaatkan fitur HTML_QuickForm, Anda perlu menginstalnya dari PEAR. Karena tergantung pada HTML_Common, paket PEAR lainnya mampu menampilkan dan memanipulasi kode HTML, anda perlu menginstal HTML_Common juga, yang dilakukan secara otomatis dengan melewatkan - tanda onlyreqdeps dengan perintah menginstal:

Membuat Form Sederhana

Membuat form adalah angin menggunakan HTML_QuickForm, cukup instantiate kelas HTML_QuickForm dan memanggil method addElement () yang diperlukan, melewati pada tipe elemen dan atribut untuk menciptakan setiap komponen form. Akhirnya, memanggil method display () untuk membuat form. Properti 13-2 menciptakan form yang ditampilkan pada Gambar 13-1.

Listing 13-2. Creating a Form with HTML_QuickForm

<?php

require_once "HTML/QuickForm.php";

// Create array of languages to be used in multiple-select box

$languages = array(

'C#' => 'C#',

'JavaScript' => 'JavaScript',

'Perl' => 'Perl',

'PHP' => 'PHP'

);

// Instantiate the HTML_QuickForm class

$form = new HTML_QuickForm("languages");

// Add text input element for entering username

$form->addElement('text', 'username', 'Your name: ',

array('size' => 20, 'maxlength' => 40));

// Add text input element for entering e-mail address

$form->addElement('text', 'email', 'E-mail address: ',

array('size' => 20, 'maxlength' => 50));

// Add select box element for choosing favorite programming languages

$select =& $form->addElement('select', 'languages',

'Your favorite<br />programming languages: ', $languages);

// Assign the multiple attribute to select box

$select->setMultiple(1);

// Add submit button

$form->addElement('submit', null, 'Submit!');

// Display the form

$form->display(); ?>

Tetapi menciptakan dan menampilkan formulir tersebut hanya setengah pertempuran; Anda selalu harus memvalidasi dan kemudian memproses data yang disampaikan. Tugas ini akan dibahas berikutnya.

Validasi Form Input

Seperti disebutkan sebelumnya dalam bab ini dan dijabarkan lebih lanjut pada saat di Bab 21, Anda harus tidak pernah secara membuta menerima input pengguna. Perhitungan mengabaikan saran ini bisa menjadi keutuhan data Anda, perusakan situs Web Anda, hilangnya rahasia informasi pengguna, atau sejumlah hasil yang tidak diinginkan lainnya. Namun validasi data adalah proses melelahkan dan rawan kesalahan, di mana kode validasi tidak benar dapat mengakibatkan keadaan yang mengerikan, dan salah satu di mana pengembang harus berlimpah menyadari karakteristik dari data dia mencoba untuk memvalidasi. Misalnya, Anda ingin memvalidasi sintaks alamat e-mail sesuai dengan spesifikasi sebagaimana tercantum dalam RFC 2822 (http://www.faqs.org/rfcs/rfc2822). Tetapi dalam menciptakan ekspresi reguler agak rumit yang dibutuhkan untuk tepat memvalidasi alamat e-mail, Anda membatasi ekstensi domain untuk empat karakter, mengingat diri Anda terutama internet yang cerdas untuk mengingat lebih baru tersedia .mobi dan. name domain tingkat atas. Namun, Anda mengabaikan faktor bahkan lebih baru yang tersedia .museum dan domain .travel, sehingga mencegah orang yang menggunakan alamat dari mendaftar di situs Web Anda.

Atau ambil contoh sederhana untuk memastikan pengguna memasukkan apa yang Anda rasakan menjadi nama pertama yang valid. Tentunya nama hanya harus terdiri dari karakter abjad dan tidak akan terdiri dari kurang dari tiga atau lebih daripada sepuluh huruf, kan? Tapi bagaimana dengan orang yang masuk dengan inisial, seperti R.J., atau berasal dari negara di mana khususnya nama yang panjang yang umum, seperti nama Swaminathan di India?

Syukurlah, karena bagian ini menunjukkan, HTML_QuickForm dapat menghapus banyak kesulitan yang terlibat dalam validasi data. Namun, bahkan

paket bagus ini tidak mampu untuk memperkirakan seperti apa kendala khusus data yang disediakan pengguna akan memiliki; jadi berhati-hati-khusus untuk berpikir tentang hal-hal seperti sebelum meletakkan fasilitas validasi HTML_QuickForm untuk bekerja.

Menggunakan Filter

HTML_QuickForm menyediakan cara untuk melewatkan data melalui sebuah filter, yang dapat melakukan apapun analisis anda Harap. Filter ini sebenarnya fungsi, dan Anda dapat menggunakan semua fungsi built-in PHP, atau Anda dapat membuat sendiri. Misalnya, Anda membuat jaringan intranet perusahaan yang membutuhkan karyawan untuk log in menggunakan nomor identifikasi karyawan mereka, yang terdiri dari bilangan bulat dan huruf kapital. Untuk tujuan keamanan Anda Masuk setiap karyawan login, dan untuk alasan konsistensi Anda ingin nomor identifikasi karyawan untuk bisa login menggunakan format huruf besar yang tepat. Untuk melakukannya, Anda bisa memasang filter seperti:

$form->applyFilter('employeeid', 'strtoupper');

■ Catatan Ketika Anda menggunakan filter, pengguna tidak diberitahu setiap modifikasi yang dilakukan pada data yang dikirimkan. Filter hanya mengeksekusi setelah form dikirimkan dan melakukan tindakan tertentu yang harus filter memenuhi kriteria seperti yang didefinisikan oleh fungsi. Oleh karena itu, Anda tidak harus menggunakan Filter untuk memodifikasi data bahwa pengguna nantinya akan tergantung pada kecuali Anda memberitahu pengguna dari modifikasi. Sebagai contoh, jika username dan password adalah case-sensitive, filter seharusnya tidak mengubah kasus item ini tanpa memberitahu pengguna.

Menggunakan Aturan

Sementara Filter menawarkan metode yang tersirat untuk merapikan data pengguna sebelum proses berlanjut , kadang-kadang Anda ingin tegas membatasi user dari memasukkan bentuk-bentuk tertentu dari data, mencegah form dari yang diproses sampai batasan tertentu terpenuhi. Misalnya, ketika meminta pengguna untuk namanya, Anda akan ingin mencegah digit numerik agar tidak melewati masuk. Oleh karena itu, sementara Jason Gilmore dan Bob Bryla adalah nama yang valid, JasonGilmore1 dan B0b Bryla tidak. Tapi Anda tidak bisa hanya menyaring digit, karena Anda tidak bisa yakin apa yang user dimaksudkan untuk tipe. Oleh karena itu, kesalahan harus ditandai dan pengguna diberitahu tentang masalah tersebut. Di sinilah aturan masuk

Aturan dapat dilembagakan untuk memberlakukan peraturan yang ketat terhadap isi dari sebuah string, dan HTML_QuickForm dikemas dengan beberapa peraturan-peraturan lebih umum siap untuk digunakan. Tabel 13-1 merangkum apa yang Anda inginkan. Jika tidak ada peraturan ini memenuhi kebutuhan Anda, Anda malah dapat menggunakan callback (juga tercantum dalam Tabel 13-1) untuk membuat fungsi anda sendiri.

Sebagai contoh, untuk menentukan aturan yang mewajibkan pengguna memasukkan kode ZIP, Anda akan menggunakan ini:

$form->addRule('zipcode', 'Please enter a zipcode', 'required', null, 'client');

Semua parameter input harus cukup jelas, kecuali null penutup dan penandaan klien. Karena dibutuhkan aturan tidak memerlukan rincian lebih lanjut, nilai null yang datang berikutnya. Namun, jika ini adalah aturan minlength, panjang minimum akan ditetapkan di sini. Nilai klien menetapkan bahwa validasi akan terjadi pada sisi klien. Jika browser tidak memiliki kemampuan cukup JavaScript, tidak perlu khawatir; validasi sisi server juga selalu dilakukan.

■ Catatan HTML_QuickForm juga mendukung upload file dan aturan untuk memvalidasi file ini. Namun, karena cakupan yang luas dikhususkan untuk file upload di Bab 15, dengan perhatian khusus diberikan kepada paket PEAR HTTP_Upload, fitur ini khusus HTML_QuickForm tidak tercakup dalam bab ini.

Memberlakukan Filter dan Aturan

Karena filter keterbatasan nonintrusive, berarti mereka menjalankan tanpa memerlukan pemberitahuan pengguna, mereka hanya terjadi ketika form diproses. Aturan, di sisi lain, tidak akan diberlakukan tanpa melaksanakan method validate (). Jika melaksanakan validate() oke, semua aturan telah dipenuhi; jika tidak, pesan kesalahan yang sesuai ditampilkan.

Contoh berikut menunjukkan penggunaan aturan yang diperlukan, menegakkan validasi sisi klien dengan menampilkan pesan kesalahan menggunakan window alert JavaScript (perilaku default HTML_QuickForm), atau menampilkan sebuah pesan selamat datang harus melewati mengumpulkan aturan:

<?php

require_once "HTML/QuickForm.php";

// Instantiate the HTML_QuickForm class

$form = new HTML_QuickForm("login");

// Add text input element for entering username

$form->addElement('text', 'username', 'Your name: ',

array('size' => 20, 'maxlength' => 40));

// Add text input element for entering e-mail address

$form->addElement('text', 'email', 'E-mail address: ',

array('size' => 20, 'maxlength' => 50));

// Add a rule requiring the username

$form->addRule('username', 'Please provide your username.',

'required', null, 'client');

// Add submit button

$form->addElement('submit', null, 'Submit!');

if ($form->validate()) {

echo "Welcome to the restricted site, ".

htmlspecialchars($form->exportValue('username')). ".";

}

// Display the form

$form->display();

?>

■Perhatian pelabuhan HTML_QuickForm efek samping yang ganjil: misalnya, validate () akan memproses dengan benar dalam kasus di mana aturan minlength atau maxlength ditambahkan tetapi mengabaikan user untuk memasukkan setiap data ke dalam field. Dalam rangka untuk memastikan bahwa aturan ini memproses dengan benar, Anda juga harus menambahkan aturan yang diperlukan.

memproses Nilai Form

Setelah form dikirimkan, Anda ingin cara yang mudah untuk mengambil nilai form. Tiga metode yang tersedia: method getSubmitValues () mengembalikan nilai-nilai yang dikirimkan dengan cara dari sebuah array, seperti dalam contoh ini:

if ($form->validate()) {

print_r($form->getSubmitValues());

}

Ini menghasilkan output yang sama sebagai berikut:

method process () melewati nilai ke fungsi. Misalnya, Anda membuat sebuah fungsi untuk berkomunikasi dengan layanan web Amazon bernama retrieveBook().Data pengguna bisa dilewati seperti:

if ($form->validate()) {

$form->process('retrieveBook');

}

Akhirnya, fungsi exportvalue() akan selektif mengambil setiap nilai dengan menentukan nama field-nya. Misalnya, Anda ingin mengambil nilai username didefinisikan oleh formulir isian username:

if ($form->validate()) {

$username = $form->exportvalue('username');

}

Menggunakan Autocomplete

HTML_QuickForm dilengkapi dengan fitur array luar biasa, dan permukaan yang hampir tidak pernah tergores dalam bab ini. Di luar penciptaan form, validasi, dan fitur pengolahan, HTML_QuickForm menawarkan sejumlah kemampuan canggih dimaksudkan untuk lebih meningkatkan fitur form situs Web Anda. Salah satu fitur tersebut adalah autocomplete.

Terkadang berguna untuk menyediakan pengguna dengan input teks dalam bentuk-bebas daripada kotak drop-down yang mengandung nilai-nilai yang telah ditetapkan, dalam kasus jawaban pengguna tidak salah satu dari pilihan yang tersedia. Namun, karena ada kemungkinan yang signifikan pengguna akan menentukan salah satu dari sejumlah set nilai, Anda ingin memfasilitasi input pengguna dengan menggunakan auto-completion. Auto-completion bekerja dengan memantau apa yang user mulai untuk diketik dalam kotak input dan menyarankan nilai berdasarkan apa yang sudah masuk sejauh ini. Misalnya, Anda sedang membangun sebuah situs Web fantasi sepak bola dan ingin mengumpulkan informasi tentang tim sepak bola favorit masing-masing pengguna. Sementara satu dapat menduga kebanyakan akan memilih NFL atau tim perguruan tinggi, beberapa pemain muda bisa memilih untuk masuk tim sekolah tinggi favorit. Sementara itu cukup sepele untuk menyusun sebuah daftar tim NFL dan setidaknya tim perguruan tinggi yang terkenal, membuat daftar

serupa dari ribuan tim sekolah tinggi di seluruh negara ini akan sulit yang terbaik. Oleh karena itu, Anda menggunakan kotak input teks dengan auto-completion diaktifkan. Jika pengguna mulai memasuki Steel, mekanisme auto-lengkap akan menawarkan hingga elemen array pertama yang sesuai, dimana adalah Steelers, seperti yang ditunjukkan pada Gambar 13-2.

Namun, jika pengguna terus mengetik, mengubah string ke Steel (dengan spasi penutup), auto-completion akan hadir Steel Gorden, seperti yang ditunjukkan pada Gambar 13-3.

Kode yang digunakan untuk mengimplementasikan fitur ini berikut:

<?php

require 'HTML/QuickForm.php';

// Create the array used for auto-completion

$teams = array('Steelers', 'Seahawks', 'Steel Curtains');

// Instantiate the HTML_QuickForm class

$form = new HTML_QuickForm();

// Create the autocomplete element

$element =& $form->addElement('autocomplete', 'teams',

'Favorite Football Team:');

// Map the array to the autocomplete field

$element->setOptions($teams);

// Display the form

$form->display();

?>

Ringkasan

Salah satu kelebihan yang besar Web adalah kemudahan yang memungkinkan kita ke tidak hanya menyebarkan, tetapi juga mengkompilasi dan keseluruhan informasi pengguna. Namun, sebagai pengembang, ini berarti bahwa kita harus menghabiskan sejumlah besar waktu membangun dan memelihara sejumlah besar interface pengguna, banyak yang kompleks form HTML. Konsep-konsep yang dijelaskan dalam bab ini harus memungkinkan Anda untuk mengurangi waktu yang sedikit.

Selain itu, bab ini menawarkan beberapa strategi umum untuk meningkatkan pengalaman pengguna umumnya aplikasi Anda. Meskipun bukan merupakan daftar yang lengkap, mungkin materi yang disajikan dalam bab ini akan bertindak sebagai batu loncatan bagi Anda untuk melakukan lebih lanjut eksperimentasi serta membantu Anda mengurangi waktu yang Anda investasikan dalam apa yang pasti salah satu aspek yang memakan waktu lebih banyak dari pengembangan Web: meningkatkan pengalaman pengguna. Bab berikut menunjukkan Anda bagaimana untuk melindungi area sensitif dari situs Web Anda dengan memaksa pengguna untuk menyediakan username dan password sebelum masuk.

■ ■ ■

CHAPTER 14

Authenticating Your Users

Mengauthentikasi identitas pengguna adalah praktek umum dalam aplikasi Web hari ini. Hal ini dilakukan bukan hanya untuk alasan keamanan terkait, tetapi juga untuk menawarkan fitur penyesuaian situs berdasarkan pilihan pengguna dan tipe. Biasanya, pengguna akan diminta untuk username dan password, kombinasi yang membentuk nilai identifikasi unik untuk pengguna tersebut. Dalam bab ini, anda akan belajar cara meminta untuk dan memvalidasi informasi ini, menggunakan kemampuan otentikasi built-in PHP. Khususnya, dalam bab ini Anda akan belajar tentang:

• Konsep dasar otentikasi berbasis HTTP

•variabel autentikasi PHP, yaitu $_SERVER['PHP_AUTH_USER'] and $_SERVER['PHP_AUTH_PW']

• Beberapa fungsi PHP yang biasa digunakan untuk menerapkan prosedur autentikasi

• Tiga metodologi autentikasi yang umum: hard-coding pasangan login (username dan password) langsung ke dalam script, autentikasi berbasis file, dan autentikasi berbasis database.

• Lebih lanjut membatasi kepercayaan autentikasi dengan alamat IP pengguna

• Mengambil keuntungan dari paket Auth_HTTP

• Pengujian password guessability menggunakan ekstensi CrackLib

• Memulihkan kehilangan password menggunakan satu kali URL

Konsep Autentikasi HTTP

Protokol HTTP menawarkan cara yang cukup efektif untuk otentikasi pengguna. Suatu hasil skenario yang khas autentikasi seperti ini:

1. Permintaan klien sumber daya dibatasi. 2. Server merespon permintaan ini dengan pesan respon 401 (tanpa izin akses). 3. Klien (browser) mengakui respon 401 dan menghasilkan autentikasi pop-up

meminta serupa dengan yang ditunjukkan dalam Gambar 14-1. Sebagian besar browser modern mampu memahami autentikasi HTTP dan menawarkan kemampuan yang sesuai, meliputi, Internet Explorer, Netscape Navigator, Mozilla, and Opera.

4. Kepercayaan yang disediakan pengguna (yaitu, username dan password) yang dikirim kembali ke server untuk validasi. Jika pengguna persediaan identitasnya benar, akses diberikan, sebaliknya ditolak.

5. Jika pengguna divalidasi, toko browser informasi autentikasi dalam cache autentikasi tersebut. Informasi cache tetap dalam browser sampai cache dibersihkan, atau sampai 401 respon server lainnya dikirim ke browser.

Meskipun autentikasi HTTP secara efektif mengontrol akses ke sumber daya terbatas, itu tidak menjamin saluran yang kredensial autentikasi perjalanan. Artinya, itu cukup sepele untuk penyerang posisi yang baik untuk mengendus, atau memantau, semua lalu lintas mengambil tempat antara server dan klien. aik username dan password yang diberikan termasuk dalam lalu lintas, keduanya tidak terenkripsi. Untuk menghilangkan kemungkinan membahayakan melalui

metode tersebut, Anda perlu untuk menerapkan saluran komunikasi yang aman, biasanya dicapai dengan menggunakan Secure Sockets Layer (SSL). SSL Mendukung tersedia untuk semua arus utama server Web, termasuk Apache dan Microsoft Internet Information Server (IIS).

PHP Authentication

Mengintegrasikan autentikasi pengguna langsung ke dalam logika aplikasi Web Anda mudah dan fleksibel; mudah digunakan karena konsolidasi apa yang tidak akan membutuhkan beberapa tingkat komunikasi interprocess, dan fleksibel karena autentikasi terintegrasi menyediakan cara yang lebih sederhana untuk mengintegrasikan dengan komponen lainnya dari aplikasi, seperti penyesuaian isi dan penetapan hak istimewa pengguna. Sisa dari bab ini membahas fitur autentikasi built-in PHP dan menunjukkan beberapa metodologi autentikasi yang Anda dapat segera mulai memasukkan ke dalam aplikasi Anda.

Autentikasi Variabel

PHP menggunakan dua variabel terdefinisi untuk autentikasi pengguna: $_SERVER['PHP_AUTH_USER'] dan $_SERVER['PHP_AUTH_PW']. Variabel menyimpan nilai username dan password, masing-masing. Sementara mengautentikasi adalah sederhana seperti membandingkan yang diharapkan username dan password untuk variabel-variabel ini, ada dua batasan penting untuk diingat ketika menggunakan ini variabel terdefinisi:

• Kedua variabel harus diverifikasi pada awal setiap halaman dibatasi. Anda dapat dengan mudah melakukannya dengan mengautentikasi pengguna sebelum melakukan setiap tindakan lain pada halaman yang terbatas, yang umumnya berarti menempatkan kode autentikasi dalam file terpisah dan kemudian termasuk file di halaman dibatasi menggunakan fungsi require();

•Variabel tersebut tidak berfungsi dengan baik dengan versi CGI dari PHP, dan tidak berfungsi pada Microsoft IIS. Lihat sidebar tentang autentikasi PHP dan IIS.

PHP AUTHENTICATION AND IIS Jika Anda menggunakan IIS 6 atau sebelumnya dalam hubungannya dengan modul ISAPI PHP, dan Anda ingin menggunakan PHP kemampuan authentikasi HTTP, Anda perlu membuat modifikasi kecil pada contoh yang ditawarkan sepanjang bab ini. Variabel username dan password yang masih tersedia untuk PHP saat menggunakan IIS, tapi tidak melalui $_SERVER['PHP_AUTH_USER'] and $_SERVER['PHP_AUTH_PW']. Sebaliknya, nilai ini harus diuraikan dari variabel server global lainnya, $_SERVER['HTTP_AUTHORIZATION']. Jadi, misalnya, Anda perlu untuk mengurai keluar variabel ini seperti: list($user, $pswd) = explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6))); Jika Anda menjalankan IIS 7 atau yang lebih baru, formulir autentikasi tidak lagi terbatas pada halaman ASP.NET, berarti Anda dapat dengan baik melindungi aplikasi PHP-driven. Konsultasikan IIS 7 dokumentasi untuk lebih lanjut tentang hal ini.

Fungsi Yang Berguna

Dua fungsi standar yang biasa digunakan ketika menangani autentikasi melalui PHP: header () dan isset ().Keduanya diperkenalkan di bagian ini.

header()

fungsi header () mengirim header HTTP mentah ke browser. Parameter string menentukan informasi header dikirimkan ke browser. Prototipe nya berikut:

void header(string string [, boolean replace [, int http_response_code]])

Parameter opsional replace menentukan apakah informasi ini harus mengganti atau mendampingi sebuah header yang sebelumnya dikirim. Akhirnya, parameter opsional http_response_code mendefinisikan kode tanggapan tertentu yang akan menyertai informasi header. Perhatikan bahwa Anda dapat menyertakan kode dalam string, segera akan ditunjukkan. Diterapkan untuk autentikasi pengguna, fungsi ini berguna untuk mengirimkan header autentikasi WWW ke browser, menyebabkan autentikasi pop-up konfirmasi untuk ditampilkan. Hal ini juga berguna untuk mengirimkan pesan header 401 bagi pengguna, jika kepercayaan autentikasi salah yang diajukan. Sebuah contoh berikut:

<?php

header('WWW-Authenticate: Basic Realm="Book Projects"');

header("HTTP/1.1 401 Unauthorized");

?>

Perhatikan bahwa kecuali buffering output diaktifkan, perintah ini harus dieksekusi sebelum setiap output dikembalikan. Mengabaikan peraturan ini akan mengakibatkan kesalahan server, karena melanggar spesifikasi HTTP.

isset()

fungsi isset () menentukan apakah variabel telah diberi nilai. Prototipe nya berikut:

boolean isset(mixed var [, mixed var [,...]])

Akan mengembalikan TRUE jika variabel berisi nilai, dan FALSE jika tidak. Seperti yang diterapkan untuk autentikasi pengguna, Fungsi isset() berguna untuk menentukan apakah $_SERVER['PHP_AUTH_USER'] dan

$_SERVER['PHP_AUTH_PW'] variabel ditetapkan dengan benar. Properti 14-1 menawarkan contoh penggunaannya.

Properti 14-1. Menggunakan isset () untuk Memverifikasi Apakah Variabel Berisi Nilai.

<?php

// If the username or password isn't set, display the authentication window

if (! isset($_SERVER['PHP_AUTH_USER']) || ! isset($_SERVER['PHP_AUTH_PW'])) {

header('WWW-Authenticate: Basic Realm="Authentication"');

header("HTTP/1.1 401 Unauthorized");

// If the username and password are set, output their credentials

} else {

echo "Your supplied username: ".$_SERVER['PHP_AUTH_USER']."<br />";

echo "Your password: ".$_SERVER['PHP_AUTH_PW']."<br />";

}

?>

Metodologi Autentikasi PHP

Ada beberapa cara Anda dapat menerapkan autentikasi melalui skrip PHP. Dalam melakukannya, Anda harus selalu mempertimbangkan ruang lingkup dan kompleksitas kebutuhan autentikasi Anda. Bagian ini membahas lima metodologi implementasi: hard-coding sepasang login langsung ke dalam script, menggunakan autentikasi berbasis file, menggunakan autentikasi berbasis

database, menggunakan autentikasi berbasis IP, dan menggunakan PEAR HTTP fungsi autentikasi. Memeriksa setiap pendekatan autentikasi dan kemudian memilih solusi yang paling sesuai dengan kebutuhan Anda.

Hard-Kode Autentikasi

Cara paling mudah untuk membatasi akses sumber daya adalah dengan hard-coding username dan password langsung ke dalam script. Properti 14-2 menawarkan contoh bagaimana untuk menyelesaikan hal ini.

Properti 14-2. Mengauthentikasi Melawan Hard-Kode Sepasang Login

if (($_SERVER['PHP_AUTH_USER'] != 'specialuser') ||

($_SERVER['PHP_AUTH_PW'] != 'secretpassword')) {

header('WWW-Authenticate: Basic Realm="Secret Stash"');

header('HTTP/1.0 401 Unauthorized');

print('You must provide the proper credentials!');

exit;

}

Dalam contoh ini, jika $_SERVER['PHP_AUTH_USER'] dan $_SERVER['PHP_AUTH_PW'] adalah sama untuk specialuser dan secretpassword, masing-masing blok kode tidak akan dieksekusi, dan apa pun berikutnya blok yang akan mengeksekusi. Sebaliknya, pengguna diminta untuk mengisi username dan password sampai baik informasi yang memadai atau pesan 401 Unauthorize ditampilkan karena kegagalan beberapa autentikasi. Meskipun autentikasi terhadap nilai hard-coded ini sangat cepat dan mudah untuk mengkonfigurasi, ia

memiliki beberapa kelemahan. Terutama, semua pengguna yang membutuhkan akses ke sumber daya harus menggunakan pasangan autentikasi yang sama. Dalam sebagian besar situasi dunia nyata, setiap pengguna harus diidentifikasi secara unik sehingga preferensi pengguna tertentu atau sumber daya dapat diberikan. Kedua, mengubah username atau password dapat dilakukan hanya dengan memasukkan kode dan membuat penyesuaian manual. selanjutnya Dua metodologi menghilangkan masalah ini.

Autentikasi berbasis File

Seringkali Anda perlu menyediakan setiap pengguna dengan sepasang login yang unik, sehingga memungkinkan untuk Masuk saat login pengguna tertentu, perubahan, dan tindakan. Hal ini mudah dilakukan dengan file teks, banyak seperti yang biasa digunakan untuk menyimpan informasi tentang pengguna Unix (/etc/passwd). Properti 14-3 menawarkan file seperti itu. Setiap baris berisi username dan pasangan password terenkripsi, with the two elements separated by a colon (:).

Properti 14-3. File authenticationFile.txt Mengandung Password terenkripsi

jason:60d99e58d66a5e0f4f89ec3ddd1d9a80

donald:d5fc4b0e45c8f9a333c0056492c191cf

mickey:bc180dbc583491c00f8a1cd134f7517b

Pertimbangan keamanan penting tentang authenticationFile.txt bahwa file ini harus disimpan di luar document root server. Jika tidak, penyerang dapat menemukan file melalui brute-force menebak, menyatakan separuh dari kombinasi login. Selain itu, walaupun Anda memiliki pilihan untuk melewati enkripsi password, praktek ini sangat tidak dianjurkan, karena pengguna dengan

akses ke server mungkin dapat melihat informasi login jika hak akses file tidak dikonfigurasi dengan benar. Script PHP diperlukan untuk mengurai file ini dan autentikasi pengguna terhadap pasangan login yang diberikan hanya agak lebih rumit daripada script yang digunakan untuk autentikasi terhadap pasangan autentikasi hard-coded. Perbedaannya terletak pada tugas script tambahan dari membaca file teks ke dalam array, dan kemudian siklus melalui array mencari kecocokan. Hal ini melibatkan penggunaan beberapa fungsi, meliputi sebagai berikut:

• file(string filename): fungsi file ()membaca file ke dalam array, dengan setiap elemen dari array yang terdiri dari sebuah baris pada file tersebut.

• explode(string separator, string string [, int limit]): fungsi explode() membelah string ke dalam serangkaian substring, dengan setiap batas string ditentukan oleh pemisah tertentu.

• md5(string str): md5 () fungsi akan menghitung hash MD5 dari sebuah string, menggunakan RSA Security Inc’s algoritma MD5 Message-Digest (http://www.rsa.com/).

■ Catatan Meskipun mereka serupa pada fungsi, Anda harus menggunakan explode() bukan split(), karena split () Agak lebih lambat karena permintaan atas mesin penguraian ekspresi regular PHP.

Properti 14-4 mengilustrasikan script PHP yang mampu menguraikan authenticationFile.txt, berpotensi pencocokan input pengguna ke sepasang login.

<?php

// Preset authentication status to false

$authorized = FALSE;

if (isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {

// Read the authentication file into an array

$authFile = file("/usr/local/lib/php/site/authenticate.txt");

// Search array for authentication match

// If using Windows, use \r\n

if (in_array($_SERVER['PHP_AUTH_USER'].

":"

.md5($_SERVER['PHP_AUTH_PW'])."\n", $authFile))

$authorized = TRUE;

}

// If not authorized, display authentication prompt or 401 error

if (! $authorized) {

header('WWW-Authenticate: Basic Realm="Secret Stash"');

header('HTTP/1.0 401 Unauthorized');

print('You must provide the proper credentials!');

exit;

}

// restricted material goes here...

?>

Meskipun sistem autentikasi berbasis file bekerja bagus untuk relatif kecil, daftar autentikasi statis, strategi ini bisa menjadi agak tidak menyenangkan ketika Anda

menangani sejumlah besar pengguna, ketika pengguna secara berkala ditambahkan, dihapus, dan dimodifikasi, atau ketika Anda perlu untuk memasukkan skema autentikasi ke infrastruktur informasi yang lebih besar (ke tabel user yang sudah ada, misalnya). Persyaratan tersebut lebih memuaskan dengan menerapkan solusi berbasis database. Bagian berikut menunjukkan seperti itu solusi, menggunakan database untuk menyimpan pasangan autentikasi.

Autentikasi berbasis Database

Dari semua berbagai metodologi autentikasi dibahas pada bab ini, menerapkan solusi database-driven adalah yang paling kuat, karena tidak hanya meningkatkan kemudahan administratif dan skalabilitas, tetapi juga dapat diintegrasikan ke dalam infrastruktur database yang lebih besar. Untuk tujuan dari contoh ini, menyimpan data terbatas pada tiga field – primer key, username, dan password. Kolom ini ditempatkan dalam tabel dipanggil login, ditunjukkan pada Properti 14-5.

■ Catatan Jika Anda tidak terbiasa dengan server MySQL dan bingung dengan sintaks yang ditemukan dalam contoh ini, memikirkan untuk melihat kembali material yang ada pada Bab 30.

Properti 14-5. Sebuah Tabel Pengguna Autentikasi

CREATE TABLE logins (

id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT,

username VARCHAR(16) NOT NULL,

pswd VARCHAR(32) NOT NULL,

PRIMARY KEY(id));

Sebuah beberapa baris dari data sampel berikut:

id username password

1 wjgilmore 098f6bcd4621d373cade4e832627b4f6

2 mwade 0e4ab1a5a6d8390f09e9a0f2d45aeb7f

3 jgennick 3c05ce06d51e9498ea472691cd811fb6

Properti 14-6 menampilkan kode yang digunakan untuk autentikasi username yang disediakan pengguna dan password terhadap informasi yang disimpan dalam tabel login.

Properti 14-6. Mengautentikasi Pengguna Terhadap Database MySQL

<?php

/* Because the authentication prompt needs to be invoked twice,

embed it within a function.

*/

function authenticate_user() {

header('WWW-Authenticate: Basic realm="Secret Stash"');

header("HTTP/1.0 401 Unauthorized");

exit;

}

/* If $_SERVER['PHP_AUTH_USER'] is blank, the user has not yet been

prompted for the authentication information.

*/

if (! isset($_SERVER['PHP_AUTH_USER'])) {

authenticate_user();

} else {

// Connect to the MySQL database

mysql_pconnect("localhost","authenticator","secret")

or die("Can't connect to database server!");

mysql_select_db("corporate")

or die("Can't select database!");

// Create and execute the selection query

$query = "SELECT username, pswd FROM userauth

WHERE username='$_SERVER[PHP_AUTH_USER]' AND

pswd=MD5('$_SERVER[PHP_AUTH_PW]')";

$result = mysql_query($query);

// If nothing was found, reprompt the user for the login information

if (mysql_num_rows($result) == 0) {

authenticate_user();

} else {

echo "Welcome to the secret archive!";

}

}

?>

Meskipun autentikasi Database lebih kuat dari dua metodologi yang diuraikan sebelumnya, sebenarnya sangat sepele untuk melaksanakan. Cukup menjalankan seleksi query terhadap tabel login, menggunakan username dan password dimasukkan sebagai kriteria untuk query. Tentu saja, solusi tersebut tidak tergantung pada penggunaan tertentu dari database MySQL, setiap Database relasional dapat digunakan pada tempatnya.

BREAK

■ ■ ■

CHAPTER 15

Handling File Uploads

Sementara kebanyakan orang cenderung untuk menyamakan Web dengan halaman Web saja, HTTP sebenarnya memfasilitasi transfer berbagai jenis file, seperti dokumen Microsoft Office, PDF, executable, MPEG, file zip, dan berbagai macam jenis file lainnya. Meskipun FTP sejarahnya telah menjadi cara standar untuk meng-upload file ke server, seperti transfer file menjadi semakin lazim lewat antarmuka berbasis web. Dalam bab ini, Anda akan mempelajari semua tentang kemampuan penanganan PHP file-upload, secara khusus, sebagai berikut:

• PHP file-upload perintah konfigurasi

• PHP $_FILES array superglobal, digunakan untuk menangani file-upload data

• PHP fungsi built-in file-upload: is_uploaded_file() dan move_uploaded_file()

• tinjauan pesan kesalahan yang mungkin dikembalikan dari script upload

• Tinjauan tentang paket PEAR HTTP_Upload

Seperti biasa, sejumlah dunia nyata contoh yang ditawarkan di seluruh bab ini, memberikan Anda dengan wawasan yang berlaku dalam topik ini.

Mengupload File melalui HTTP

cara File di-upload melalui browser Web resmi diresmikan pada bulan November 1995, ketika Ernesto Nebel dan Larry Masinter dari Xerox Corporation mengusulkan metodologi standar untuk melakukannya dalam RFC 1867, "File

Berbasis Form Upload dalam HTML" (http://www.ietf.org/rfc/rfc1867.txt). Memo Ini, yang dirumuskan dasar untuk membuat tambahan yang diperlukan untuk HTML untuk memungkinkan upload file (kemudian digabungkan ke dalam HTML 3.0), juga ditawarkan spesifikasi untuk jenis media Internet baru, multipart/form-data. Jenis media baru ini diinginkan karena tipe standar yang digunakan untuk mengkodekan "normal" nilai form, application/x-www-form-urlencoded, dianggap terlalu tidak efisien untuk menangani sejumlah besar biner data seperti itu yang mungkin di-upload melalui seperti form antarmuka. Sebuah contoh form-upload file berikut, dan screenshot output yang sesuai akan ditampilkan pada Gambar 15-1:

<form action="uploadmanager.html" enctype="multipart/form-data" method="post">

Name:<br /> <input type="text" name="name" value="" /><br />

Email:<br /> <input type="text" name="email" value="" /><br />

Class notes:<br /> <input type="file" name="homework" value="" /><br />

<p><input type="submit" name="submit" value="Submit Homework" /></p>

</form>

Memahami bahwa formulir ini hanya menawarkan bagian dari hasil yang diinginkan, sedangkan tipe input file dan atribut lain terkait upload file cara standarisasi dikirim ke server melalui suatu halaman HTML, tidak ada kemampuan yang ditawarkan untuk menentukan apa yang terjadi setelah file tersebut sampai

di sana. Penerimaan dan penanganan selanjutnya dari file upload adalah fungsi dari penanganan upload, dibuat menggunakan beberapa proses server, atau kemampuan bahasa server-side seperti Perl, Java, atau PHP. Sisa dari bab ini dikhususkan pada aspek proses upload.

Mengupload File dengan PHP

BREAK

■ ■ ■

CHAPTER 16

Networking

Anda mungkin telah berpaling ke bab ini bertanya-tanya apa mungkin PHP menawarkan dalam hal jaringan. Setelah semuanya, bukan tugas-tugas jaringan terutama diturunkan ke bahasa yang umum digunakan untuk administrasi sistem, seperti Perl atau Python? Sementara seperti stereotip mungkin sekali dilukis gambaran yang cukup akurat, saat ini, menggabungkan kemampuan jaringan ke dalam aplikasi Web adalah biasa. Bahkan, aplikasi berbasis web secara teratur digunakan untuk memantau dan bahkan memelihara infrastruktur jaringan. Selanjutnya, dengan pengenalan antarmuka baris perintah (CLI) dalam versi PHP 4.2.0, PHP kini semakin banyak digunakan untuk administrasi sistem di antara pengembang yang ingin terus menggunakan bahasa favorit mereka untuk tujuan lain. PHP pengembang, selalu tertarik untuk mengetahui kebutuhan yang tumbuh di bidang pengembangan aplikasi web dan untuk memperbaiki permintaan dengan memasukkan fitur-fitur baru ke dalam bahasa, telah mengumpulkan array agak menakjubkan fungsionalitas jaringan khusus.

Bab ini dibagi menjadi beberapa bagian yang mencakup topik-topik berikut:

DNS, servers, and services: PHP menawarkan berbagai fungsi yang mampu mengambil informasi mengenai jaringan internal, DNS, protokol, dan skema alamat Internet. Bagian ini memperkenalkan fungsi-fungsi ini dan menawarkan beberapa contoh penggunaan.

Sending e-mail with PHP: Mengirim e-mail melalui aplikasi Web tidak diragukan lagi salah satu fitur yang paling biasa Anda dapat temukan hari ini, dan untuk alasan yang baik. E-mail merupakan aplikasi pembunuh Internet dan menawarkan cara yang luar biasa yang efisien untuk berkomunikasi dan memelihara data penting dan informasi. Bagian ini menjelaskan cara mudah mengirim pesan melalui skrip PHP. Selain itu, Anda akan belajar cara menggunakan paket PEAR

Mail dan Mail_Mime untuk memfasilitasi lebih kompleks kiriman e-mail, seperti yang melibatkan beberapa penerima, format HTML, dan masuknya lampiran.

Common networking tasks: Pada bagian ini, anda akan belajar bagaimana menggunakan PHP untuk meniru tugas yang biasa dilakukan oleh perangkat command-line, termasuk ping sebuah alamat jaringan, melacak koneksi jaringan, scanning port membuka server, dan banyak lagi.

DNS, Services, and Servers

Hari ini, menyelidiki atau mengatasi masalah jaringan sering melibatkan pengumpulan berbagai informasi yang berkaitan yang dipengaruhi klien, server, dan jaringan internal seperti protokol, resolusi nama domain, dan IP skema pengalamatan. PHP menawarkan sejumlah fungsi untuk mengambil sebuah perkumpulan informasi tentang setiap subyek, masing-masing yang diperkenalkan di bagian ini.

■ Catatan Beberapa fungsi diperkenalkan dalam bab ini tidak bekerja pada Windows. Check out paket PEAR Net_DNS untuk mengemulasikan kemampuan mereka.

DNS

Domain Name System (DNS) adalah apa yang memungkinkan Anda untuk menggunakan nama domain (misalnya example.com) di tempat dari alamat IP yang sesuai tidak begitu-user-friendly, seperti 192.0.34.166. Nama domain dan melengkapi alamat IP mereka yang disimpan dan tersedia untuk referensi di nama domain server, yang diselingi di seluruh dunia. Biasanya, domain memiliki beberapa jenis rekaman yang terkait untuk itu, salah satu pemetaan alamat IP ke

domain, satu lagi untuk mengarahkan e-mail, dan satu lagi untuk alias nama domain, misalnya. Seringkali administrator jaringan dan pengembang memerlukan cara untuk mempelajari lebih lanjut tentang berbagai DNS record untuk domain yang diberikan. Bagian ini diperkenalkan sejumlah fungsi standar PHP yang mampu menggali banyak informasi mengenai data DNS.

Memeriksa Keberadaan Records DNS

fungsi checkdnsrr() memeriksa keberadaan data DNS. Prototipe nya berikut:

int checkdnsrr(string host [, string type])

Data DNS diperiksa berdasarkan nilai host yang disediakan dan opsional DNS tipe catatan sumber daya, mengembalikan TRUE jika ada record berada, dan FALSE sebaliknya. Tipe record mungkin meliputi berikut ini:

A: Alamat Rekaman IPv4. Bertanggung jawab atas terjemahan alamat hostname-ke IPv4.

AAAA: Alamat IPv6 Record. Bertanggung jawab atas penerjemahan nama host ke alamat IPv6.

A6: : Alamat IPv6 Record. Digunakan untuk merepresentasikan alamat IPv6. Ditujukan untuk menggantikan penggunaan kini rekaman AAAA untuk pemetaan IPv6.

ANY: Mencari semua jenis rekaman

CNAME: Canonical Name Record. Peta alias untuk nama domain yang sebenarnya.

MX: Mail Exchange Record. Menentukan preferensi nama dan relatif dari sebuah mail server untuk host. Ini adalah pengaturan default.

NAPTR: Naming Authority Pointer. Memungkinkan untuk nama non-DNS-sesuai, penyelesaian mereka ke domain baru menggunakan ekspresi reguler menulis

ulang aturan. Sebagai contoh, sebuah NAPTR dapat digunakan untuk menjaga warisan (pra-DNS) pelayanan.

NS: Name Server Record. Menentukan nama server untuk host.

PTR: Pointer Record. Peta alamat IP untuk host.

SOA: Start of Authority Record. Mengatur global parameter untuk host.

SRV: Services Record. Menunjukkan lokasi berbagai layanan untuk domain yang disediakan.

Pertimbangkan contoh. Misalnya anda ingin memastikan apakah nama domain example.com memiliki rekaman DNS yang sesuai:

<?php

$recordexists = checkdnsrr("example.com", "ANY");

if ($recordexists) echo "The domain name has been reserved. Sorry!";

else echo "The domain name is available!";

?>

Ini mengembalikan sebagai berikut:

Anda juga dapat menggunakan fungsi ini untuk memverifikasi keberadaan sebuah domain dari alamat email yang disediakan:

<?php

$email = "[email protected]";

$domain = explode("@",$email);

$valid = checkdnsrr($domain[1], "ANY");

if($valid) echo "The domain exists!";

else echo "Cannot locate MX record for $domain[1]!";

?>

Ini mengembalikkan sebagai berikut :

Perlu di ingat ini bukan permintaan untuk memverifikasi adanya record MX. Terkadang administrator jaringan menggunakan metode konfigurasi lainnya untuk memungkinkan resolusi mail tanpa menggunakan MX record (karena MX record tidak wajib). Berbuat salah pada sisi peringatan, hanya memeriksa keberadaan domain, tanpa secara khusus meminta verifikasi apakah MX record ada.

Selanjutnya, ini tidak memverifikasi apakah alamat e-mail benar-benar ada. Satu-satunya cara yang pasti untuk membuat penentuan ini adalah untuk mengirim user tersebut e-mail dan memintanya untuk memverifikasi alamat dengan mengklik URL satu kali. Anda dapat mempelajari lebih lanjut tentang URL satu kali dalam Bab 14.

Mengambil sumber Records DNS

fungsi dns_get_record() mengembalikan array yang terdiri dari berbagai record sumber DNS bersangkutan untuk domain tertentu. Prototipe nya berikut:

array dns_get_record(string hostname [, int type [, array &authns, array &addtl]])

Meskipun secara default dns_get_record () mengembalikan semua record itu dapat menemukan khusus untuk domain yang disediakan (hostname), Anda dapat merampingkan proses pengambilan melalui menetapkan sebuah tipe, nama yang harus diawali dengan DNS. Fungsi ini mendukung semua jenis diperkenalkan bersama dengan checkdnsrr(), selain kepada orang lain yang akan diperkenalkan dalam sekejap. Akhirnya, jika Anda mencari untuk penjelasan lengkap-besaran dari hostname DNS ini penjelasan, Anda dapat melewati parameter authns dan addtl oleh referensi, yang menetapkan bahwa informasi yang bersangkutan dengan server nama otoritatif dan record tambahan juga harus dikembalikan.

Dengan asumsi bahwa hostname yang disediakan adalah sah dan ada, panggilan untuk dns_get_record () mengembalikan sedikitnya empat atribut:

host: Menentukan nama namespace DNS untuk yang semua atribut lainnya yang sesuai.

class: Mengembalikan record Internet kelas saja, jadi atribut ini selalu membaca IN.

type: Menentukan tipe record. Tergantung pada jenis dikembalikan, atribut lainnya juga mungkin telah disediakan.

ttl: Menghitung asli rekaman waktu-untuk-hidup minus jumlah waktu yang telah berlalu sejak server nama otoritatif ditanya.

Selain jenis diperkenalkan pada bagian checkdnsrr (),sebagai berikut jenis domain record yang dibuat tersedia untuk dns_get_record ():

DNS_ALL: Mengambil semua record tersedia, bahkan mereka yang mungkin tidak diakui bila menggunakan kemampuan pengenalan dari sistem operasi yang Anda gunakan. Gunakan ini bila Anda ingin benar-benar yakin bahwa semua record yang ada telah diambil.

DNS_ANY: Mengambil semua record yang diakui oleh sistem operasi yang Anda gunakan.

DNS_HINFO: Menentukan sistem operasi dan tipe komputer dari host. Perlu diingat bahwa informasi ini tidak diperlukan.

DNS_NS: Menentukan apakah name server adalah jawaban otoritatif untuk domain yang diberikan, atau apakah tanggung jawab ini pada akhirnya dilimpahkan ke server lain.

Hanya mengingat bahwa nama-nama jenis harus selalu diawali dengan DNS_. Sebagai contoh, misalkan Anda ingin mempelajari lebih lanjut tentang domain example.com:

<?php

$result = dns_get_record("example.com");

print_r($result);

?>

Sebuah contoh dari informasi dikembalikan berikut:

Jika Anda hanya tertarik dalam record nama server, Anda bisa menjalankan sebagai berikut:

<?php

$result = dns_get_record("example.com","DNS_CNAME");

print_r($result);

?>

Ini mengembalikan sebagai berikut:

Mengambil Records MX

CHAPTER 17

PHP and LDAP

Sebagai perusahaan perangkat keras dan infrastruktur perangkat lunak diperluas sepanjang dekade terakhir, TI profesional menemukan diri mereka kewalahan dengan overhead administrasi yang diperlukan untuk mengelola berkembang pesat jumlah sumber daya yang ditambahkan ke perusahaan Printer, workstation, server, switch, dan lain aneka perangkat jaringan semua diperlukan pemantauan berkelanjutan dan dikelola tidak efisien, seperti yang dilakukan pengguna akses jaringan sumber daya dan hak istimewa.

Cukup sering sistem administrator dirakit secara sendiri modus operandi internal untuk menjaga urutan, sistem yang terlalu sering yang dirancang dengan buruk, tidak aman, dan nonscalable. Sebuah alternatif tapi juga solusi tidak efisien melibatkan penyebaran berbagai sistem yang berbeda, masing-masing melakukan bagiannya sendiri untuk mengelola beberapa perusahaan, namun datang dengan biaya overhead yang cukup besar karena kurangnya integrasi. Hasilnya adalah bahwa baik pengguna dan administrator diderita dari tidak adanya solusi manajemen yang komprehensif, setidaknya sampai layanan direktori datang.

Pelayanan direktori menawarkan administrator sistem, pengembang, dan pengguna akhir sama cara konsisten, efisien, dan aman untuk melihat dan mengelola sumber daya seperti orang, file, printer, dan aplikasi. Struktur dari inidioptimalkan membaca data repositori-sering erat model struktur perusahaan fisik, contoh yang digambarkan pada Gambar 17-1.

Banyak vendor perangkat lunak terkemuka telah membangun andalan pelayanan direktori produk dan memang berpusat keseluruhan operasi mereka di sekitar penawaran efek tersebut. Berikut adalah beberapa produk yang lebih populer.

• Fedora Directory Server: http://directory.fedoraproject.org/

• Microsoft Active Directory: http://www.microsoft.com/activedirectory/

• Novell eDirectory: http://www.novell.com/products/edirectory/

• Oracle Collaboration Suite: http://www.oracle.com/collabsuite/

Semuanya secara luas digunakan pelayanan direktori produk sangat tergantung pada sebuah kation-spesifik terbuka yang dikenal sebagai Lightweight Directory Access Protocol atau LDAP. Dalam bab ini, anda akan belajar bagaimana mudahnya untuk membicarakan dengan LDAP melalui ekstensi LDAP PHP. Pada akhirnya, Anda akan memiliki pengetahuan yang diperlukan untuk mulai berbicara dengan layanan direktori melalui aplikasi PHP Anda. Karena suatu bagian pengantar pada LDAP hampir tidak akan cukup untuk melakukan pengadilan topik, ini diasumsikan Anda membaca bab ini karena Anda telah menjadi pengguna LDAP yang berpengetahuan dan mencari informasi lebih lanjut tentang cara berkomunikasi kemampuan baca untuk menyampaikan dengan server LDAP Anda menggunakan bahasa PHP. Jika Anda tetapi, baru untuk topik ini, mempertimbangkan untuk mengambil beberapa waktu untuk mengkaji sumber daya online berikut sebelum melanjutkan:

LDAP v3 specification (http://www.ietf.org/rfc/rfc3377.txt): The official specification of Lightweight Directory Access Protocol Version 3

The Official OpenLDAP Web site (http://www.openldap.org/): The official Web site of LDAP’s widely used open source implementation

IBM LDAP Redbooks (http://www.redbooks.ibm.com/): IBM’s free 700+ page introduction to LDAP

■ ■ ■

CHAPTER 18

Session Handlers

Hari ini, menggunakan sesi HTTP untuk melacak informasi yang gigih seperti preferensi pengguna dalam bahkan yang paling sederhana aplikasi lebih aturan daripada pengecualian. Oleh karena itu, tidak peduli apakah Anda benar-benar baru untuk pengembangan Web atau seorang veteran beruban memanggil dari bahasa lain, Anda harus meluangkan waktu untuk dengan cermat membaca bab ini. Tersedia sejak rilis versi 4.0, kemampuan PHP menangani session menjadi salah satu fitur yang paling keren dan paling dibahas. Dalam bab ini Anda akan mempelajari semua tentang fitur, termasuk:

• Mengapa menangani session diperlukan, dan berguna

• Bagaimana mengkonfigurasi PHP ke paling efektif menggunakan fitur ini

• Bagaimana membuat dan menghancurkan session, dan menangani variabel session

• Mengapa Anda mungkin mempertimbangkan mengelola data session pada database, dan bagaimana melakukannya.

Apa itu Penanganan Session?

Hypertext Transfer Protocol (HTTP) mendefinisikan aturan yang digunakan untuk mentransfer teks, grafik, video, dan semua data lainnya melalui World Wide Web. Ini adalah protokol stateless, yang berarti bahwa setiap permintaan yang diproses tanpa pengetahuan dari setiap permintaan sebelumnya atau masa mendatang. Meskipun kesederhanaan HTTP adalah kontributor yang signifikan untuk banyak pembahasan nya, sifat tanpa kewarganegaraan yang telah lama menjadi masalah bagi pengembang yang ingin membuat aplikasi berbasis web yang kompleks yang harus mampu menyesuaikan dengan perilaku pengguna tertentu dan preferensi. Untuk mengatasi masalah ini, praktek bit menyimpan informasi pada mesin klien,

pada apa yang umumnya disebut cookie, dengan cepat memperoleh penerimaan, menawarkan beberapa bantuan teka-teki ini. Namun, keterbatasan pada ukuran cookie dan jumlah cookie diijinkan, dan berbagai ketidaknyamanan sekitarnya pelaksanaannya, diminta para pengembang untuk merancang solusi lain: penanganan session.

Penanganan Session pada dasarnya adalah sebuah solusi cerdas untuk masalah ini Tanpa Kewarganegaraan. Hal ini dicapai dengan menugaskan kepada setiap pengunjung situs atribut identifikasi yang unik, dikenal sebagai session ID (SID), dan kemudian berhubungan bahwa SID dengan sejumlah potongan data lain, baik jumlah kunjungan bulanan, warna background favorit, atau nama tengah-sebutkan saja semuanya. Dalam istilah database relasional, Anda bisa memikirkan SID sebagai kunci utama bahwa mengikat semua pengguna lain atribut bersamaan. Tapi bagaimana SID terus berkorelasi dengan pengguna, mengingat perilaku tanpa kewarganegaraan HTTP? Hal ini dapat dilakukan dengan dua cara berbeda:

• Cookies: Salah satu cara cerdik untuk mengelola informasi pengguna sebenarnya membangun pada metode asli menggunakan cookie. Bila pengguna mengunjungi situs web, server menyimpan informasi tentang pengguna, seperti preferensi mereka, di dalam cookie dan mengirimkannya ke browser, yang menyimpannya. Sebagai pengguna mengeksekusi permintaan untuk halaman lain, server mengambil informasi pengguna dan menggunakannya, misalnya, untuk menyesuaikan halaman. Namun, daripada menyimpan preferensi pengguna pada cookie, SID disimpan pada cookie. Sebagai klien menavigasi seluruh situs, SID yang diambil ketika diperlukan, dan berbagai item data berkorelasi dengan SID dilengkapi untuk digunakan dalam halaman. Sebagai klien menavigasi seluruh situs, SID yang diambil ketika diperlukan, dan berbagai item data berkorelasi dengan SID dilengkapi untuk digunakan dalam halaman. Selain itu, karena cookie dapat tetap pada klien bahkan setelah session berakhir, itu bisa dibaca pada selama session berikutnya, yang berarti kegigihan dipelihara bahkan di jangka waktu yang lama dan tidak aktif. Namun, perlu diingat karena penerimaan cookie suatu hal pada akhirnya dikendalikan oleh klien, Anda harus siap untuk

kemungkinan bahwa pengguna telah menonaktifkan dukungan cookie dalam browser atau telah dibersihkan cookie dari mesin mereka.

• URL rewriting: Metode kedua digunakan untuk perambatan SID hanya melibatkan menambahkan SID untuk setiap URL lokal ditemukan dalam halaman yang diminta. Hal ini mengakibatkan perambatan SID secara otomatis setiap kali pengguna mengklik salah satu link lokal. Metode ini dikenal sebagai URL rewriting, menghilangkan kemungkinan bahwa fitur penanganan session situs Anda dapat dinegasikan jika klien menonaktifkan cookie. Namun, metode ini memiliki kekurangan. Pertama, rewriting URL tidak memungkinkan untuk kegigihan di antara session, karena proses secara otomatis menambahkan SID ke URL tersebut tidak melanjutkan di saat pengguna meninggalkan situs Anda. Kedua, tidak menghentikan pengguna dari menyalin URL ke dalam sebuah e-mail dan mengirimkannya ke pengguna lain; sepanjang session tidak kedaluwarsa, session akan melanjutkan pada workstation penerima. Perhatikan berpotensi malapetaka yang bisa terjadi jika baik pengguna adalah untuk secara bersamaan menavigasi menggunakan session yang sama, atau jika penerima link tidak dimaksudkan untuk melihat data diresmikan oleh session itu. Untuk alasan ini, metodologi berbasis cookie dianjurkan. Namun, pada akhirnya terserah anda untuk mempertimbangkan berbagai faktor dan memutuskan untuk diri Anda.

Proses Penanganan Session

Karena PHP dapat dikonfigurasi untuk secara mandiri mengontrol proses penanganan seluruh session dengan sedikit interaksi programmer, Anda dapat mempertimbangkan rincian mengerikan agak tidak relevan. Namun, ada begitu banyak potensi variasi untuk prosedur default yang mengambil beberapa saat untuk lebih memahami proses ini akan sepadan dengan waktu Anda. Tugas yang pertama dieksekusi oleh halaman sesi-enabled adalah untuk menentukan apakah sebuah session valid sudah ada atau salah satu baru harus dimulai. Jika session

valid tidak ada, salah satu dihasilkan dan berhubungan dengan pengguna yang menggunakan salah satu metode propagasi SID dijelaskan sebelumnya.

PHP menentukan apakah session sudah ada dengan menemukan SID baik dalam URL yang diminta atau dalam cookie. Namun, Anda juga mampu melakukannya secara terprogram. Sebagai contoh, jika nama session sid dan ini ditambahkan ke URL, Anda bisa mengambil nilai dengan variabel berikut:

$_GET['sid']

Jika disimpan dalam cookie, Anda dapat mengambilnya seperti ini:

$_COOKIE['sid']

Setelah diambil, Anda dapat memulai informasi berhubungan dengan SID atau mengambil data SID berhubungan sebelumnya. Sebagai contoh, anggaplah bahwa pengguna browsing berbagai artikel berita situs. Artikel pengidentifikasi dapat dipetakan ke SID pengguna, memungkinkan Anda untuk menyusun sebuah daftar artikel yang pengguna telah membaca, dan menampilkan daftar itu sebagai pengguna berlanjut untuk navigasi. Dalam bagian yang akan datang, Anda akan belajar bagaimana untuk menyimpan dan mengambil informasi session ini.

■ Tip Anda juga dapat mengambil informasi cookie melalui superglobal $_REQUEST. Sebagai contoh, jika nama session sid, $_REQUEST['sid'] akan mengambil SID, sama seperti $_COOKIE ['sid'] akan. Namun, untuk tujuan kejelasan, pertimbangkan untuk menggunakan superglobal yang paling cocok dengan tempat variabel asal.

Proses ini berlanjut sampai pengguna baik menutup browser atau menavigasi ke situs luar. Jika Anda menggunakan cookie, dan tanggal kedaluwarsa cookie telah diatur untuk tanggal tertentu di masa depan, pengguna harus kembali ke situs sebelum tanggal kadaluwarsa, session bisa dilanjutkan seperti bila pengguna tidak pernah pergi. Jika Anda menggunakan URL rewriting, session secara pasti lebih

dari, dan baru salah satu harus dimulai pada saat pengguna mengunjungi situs. Dalam bagian-bagian yang akan datang, Anda akan belajar tentang perintah konfigurasi dan fungsi yang bertanggung jawab untuk melaksanakan proses ini.

Instruksi Konfigurasi

Hampir 30 perintah konfigurasi yang bertanggung jawab atas perilaku penanganan session-tweak PHP. Karena banyak dari arahan memainkan peranan penting dalam menentukan perilaku ini, Anda harus meluangkan waktu untuk menjadi akrab dengan arahan dan pengaturan kemungkinan mereka. Yang paling relevan diperkenalkan di bagian ini.

Mengelola Media Penyimpanan Session

direktif session.save_handler menentukan bagaimana informasi session akan disimpan. Prototipe nya terlihat seperti ini:

session.save_handler = files|mm|sqlite|user

data Session dapat disimpan dalam empat cara: dalam flat file (file), dalam memori volatile (mm), menggunakan database SQLite (sqlite), atau melalui fungsi yang ditetapkan pengguna (user). Walaupun pengaturan default, file, akan cukup untuk banyak situs, ingatlah untuk ktif web situs bahwa jumlah file penyimpanan session berpotensi berjalan ke dalam ribuan, dan bahkan ratusan ribu selama jangka waktu tertentu. Pilihan memori volatile yang paling cepat untuk mengelola data session, tetapi juga yang paling stabil karena data disimpan pada RAM. Pilihan sqlite mengambil keuntungan dari perpanjangan SQLite baru untuk mengelola informasi session secara transparan menggunakan database ringan (lihat Bab 22 untuk informasi lebih lanjut tentang SQLite). Opsi keempat, meskipun yang paling rumit untuk mengkonfigurasi, juga yang paling fleksibel dan kuat, karena handler kustom dapat dibuat untuk menyimpan informasi pada media apapun keinginan pengembang. Kemudian pada bab ini anda akan

mempelajari bagaimana menggunakan opsi ini untuk menyimpan data session dalam database MySQL.

Mengatur Path File Session

Jika session.save_handler diatur ke pilihan penyimpanan file, maka direktif session.save_path harus ditetapkan untuk mengidentifikasi direktori penyimpanan. prototipenya terlihat seperti ini:

session.save_path = string

Secara default session.save_path diatur ke / tmp. Perlu diingat bahwa hal ini tidak harus diatur ke direktori yang terletak di dalam dokumen root server, karena informasi dengan mudah dapat dikompromikan melalui browser. Selain itu, direktori ini harus dapat ditulis oleh server daemon.

Untuk alasan efisiensi, Anda dapat menentukan session.save_path menggunakan sintaks N; / path, dimana N merupakan integer yang mewakili jumlah subdirektori N-level di mana data session dapat disimpan. Hal ini berguna jika session.save_handler diatur ke file dan situs Web Anda proses sejumlah besar sesi, karena ini membuat penyimpanan lebih efisien karena file sesi akan dibagi ke dalam berbagai direktori daripada disimpan dalam tunggal, direktori monolitik. Jika Anda memutuskan untuk mengambil keuntungan dari fitur ini, PHP tidak akan secara otomatis membuat direktori tersebut untuk Anda. Namun, pengguna Linux dapat mengotomatisasikan proses ini dengan menjalankan script yang bernama mod_files.sh, yang terletak di direktori / ext session. Jika Anda menggunakan Windows, script shell ini tidak didukung, meskipun menulis skrip yang kompatibel menggunakan VBScript harus cukup sepele.

secara otomatis Mengaktifkan Session

Secara default halaman hanya session akan diaktifkan dengan memanggil fungsi session_start () (diperkenalkan di akhir bab ini). Namun, jika Anda berencana untuk menggunakan seluruh session. situs ini, Anda bisa melupakan

menggunakan fungsi ini dengan menetapkan session.auto_start ke 1. Prototipe nya berikut:

session.auto_start = 0|1

Salah satu kelemahan untuk memungkinkan direktif ini adalah bahwa hal itu melarang Anda menyimpan obyek dalam session, karena definisi kelas akan perlu untuk dimuat sebelum memulai session dalam rangka untuk objek yang akan diciptakan kembali. Karena session.auto_start akan menghalangi hal itu terjadi, Anda perlu meninggalkan ini dinonaktifkan jika Anda ingin mengelola obyek dalam session.

Mengatur Nama Session

Secara default PHP akan menggunakan nama session PHPSESSID. Namun, Anda bebas untuk mengubah ini untuk nama apapun yang Anda inginkan menggunakan direktif session.name. Prototipe nya berikut:

session.name = string

Memilih Cookie atau Menulis ulang URL

Jika Anda ingin memelihara session pengguna atas beberapa kunjungan ke situs, Anda harus menggunakan cookie sehingga SID dapat kemudian diambil. Jika data pengguna yang akan digunakan hanya selama kunjungan ke lokasi single, kemudian menulis ulang URL akan cukup (walaupun Anda harus diingat masalah keamanan menulis ulang URL disebutkan sebelumnya dalam bab ini). Anda dapat memilih metode menggunakan session.use_cookies. Mengatur direktif ini untuk 1 (default) hasil dalam penggunaan cookie untuk perbanyakan SID, pengaturan untuk 0 URL menyebabkan menulis ulang untuk digunakan. Prototipe nya berikut:

session.use_cookies = 0|1

Perlu diingat bahwa ketika session.use_cookies diaktifkan, tidak perlu secara eksplisit memanggil fungsi cookie-setting (melalui PHP set_cookie (), misalnya), karena hal ini akan secara otomatis ditangani oleh perpustakaan session. Jika Anda memilih cookie sebagai metode untuk melacak SID pengguna, maka ada beberapa petunjuk bahwa harus Anda pertimbangkan, masing-masing yang diperkenalkan dalam entri berikutnya.

Mengotomatisasi Menulis ulang URL

Jika session.use_cookies dinonaktifkan, SID unik pengguna harus dilampirkan ke URL untuk memastikan perambatan ID. Hal ini dapat ditangani secara eksplisit, secara manual menambahkan variabel $SID ke bagian akhir setiap URL, atau secara otomatis, dengan mengaktifkan direktif session.use_trans_sid. Prototipe nya berikut:

session.use_trans_sid = 0|1

Tidak mengherankan, jika Anda berkomitmen untuk menggunakan penulisan ulang URL, Anda harus mengaktifkan direktif ini untuk menghilangkan kemungkinan kesalahan manusia selama proses menulis ulang.

Mengatur Cookie Session Seumur Hidup

direktif session.cookie_lifetime menentukan masa sesi cookie mengenai validitas. Prototipe nya berikut:

session.cookie_lifetime = integer

Seumur hidup ini ditentukan dalam detik, jadi jika cookie harus tinggal 1 jam, maka direktif ini harus diatur ke 3600. Jika direktif ini diset ke 0 (default), maka cookie akan hidup sampai browser di-restart.

Setting Path URL Valid Cookie Session

session.cookie_path direktif menentukan path di mana cookie dianggap sah. Cookie juga berlaku untuk semua direktori anak jatuh di bawah path ini. Prototipe nya berikut:

session.cookie_path = string

Sebagai contoh, jika diatur ke /, maka cookie akan berlaku untuk situs Web secara keseluruhan. Setting ke /books menyebabkan cookie menjadi hanya berlaku saat dipanggil dari dalam path http://www.example.com/books/.

Pengaturan Domain yang valid Cookie Session

direktif session.cookie_domain menentukan domain dimana cookie berlaku. Direktif ini sangat diperlukan karena mencegah domain lainnya dari membaca cookie Anda. Prototipe nya berikut:

session.cookie_domain = string

Contoh berikut menggambarkan penggunaan:

session.cookie_domain = www.example.com

Jika Anda ingin session yang akan dibuat tersedia untuk subdomain situs, katakan pelanggan. example.com, intranet.example.com, dan www2.example.com, atur direktif seperti ini:

session.cookie_domain = .example.com

Memvalidasi Sessions Menggunakan sebuah Referer

Menggunakan menulis ulang URL sebagai cara untuk menyebarkan ID session membuka kemungkinan bahwa keadaan session tertentu dapat dilihat oleh banyak individu hanya dengan menyalin dan menyebarluaskan URL. Direktif

session.referer_check mengurangi kemungkinan ini dengan menetapkan suatu substring bahwa setiap referer divalidasi bertentangan. Jika referer tidak mengandung substring ini, SID akan tidak valid. Prototipe nya berikut:

session.referer_check = string

Pengaturan Caching Petunjuk untuk Halaman Session-Diaktifkan

Ketika bekerja dengan session, Anda mungkin ingin menggunakan kontrol yang lebih besar atas bagaimana halaman session yang diaktifkan cache oleh browser pengguna dan oleh setiap proxy yang berada antara server dan pengguna. Direktif session.cache_limiter memodifikasi cache halaman-halaman '-header terkait, memberikan instruksi mengenai preferensi caching. Prototipe nya berikut:

session.cache_limiter = string

Lima nilai yang tersedia:

none: Pengaturan ini Menonaktifkan transmisi dari setiap header cache kontrol bersama dengan halaman session-diaktifkan.

nocache: Ini adalah pengaturan default. Pengaturan ini memastikan bahwa setiap permintaan pertama kali dikirim ke server berasal sebelum versi berpotensi cache yang ditawarkan.

private: Menunjuk dokumen cache sebagai cara private bahwa dokumen akan dibuat tersedia hanya untuk pengguna berasal. Ini tidak akan dibagi dengan pengguna lain.

private_no_expire: Ini adalah variasi dari penunjukan private, sehingga tidak ada

dokumen tanggal kedaluwarsa yang dikirim ke browser. Ini ditambahkan sebagai solusi untuk berbagai browser yang menjadi membingungkan oleh header Kadaluarsa dikirim bersama ketika direktif ini diatur ke private.

public: Pengaturan ini dianggap semua dokumen disimpan di cache, bahkan jika permintaan dokumen awal memerlukan otentikasi.

Mengatur Cache Kadaluarsa Waktu untuk Halaman Session-Diaktifkan

direktif session.cache_expire menentukan jumlah dalam detik (180 secara default) yang di-cache halaman session yang dibuat tersedia sebelum halaman baru dibuat. Prototipe nya berikut:

session.cache_expire = integer

Jika session.cache_limiter diatur ke nocache, direktif ini diabaikan.

Mengatur seumur hidup Session

direktif session.gc_maxlifetime menentukan durasi, dalam detik (secara default 1440), dimana session dianggap valid. Prototipe nya berikut:

session.gc_maxlifetime = integer

Setelah batas ini tercapai, informasi sesi akan dihancurkan, sehingga memungkinkan untuk pemulihan sumber daya sistem.

Bekerja dengan Session

Bagian ini memperkenalkan banyak tugas-session penanganan kunci, penyajian fungsi session relevan sepanjang jalan. Beberapa tugas ini meliputi penciptaan dan penghancuran session, penunjukan dan pengambilan SID, dan penyimpanan dan pengambilan variabel session. Pengenalan ini menetapkan tahap untuk bagian berikutnya, di mana beberapa praktek contoh penanganan session yang disediakan.

Memulai Session

Ingatlah bahwa HTTP menyadari baik kondisi pengguna lalu dan masa depan. Karena itu, Anda perlu secara eksplisit memulai dan kemudian melanjutkan session dengan setiap permintaan. Kedua tugas dilakukan menggunakan fungsi session_start (). nya prototipe terlihat seperti ini:

boolean session_start()

Menjalankan session_start () akan membuat session baru jika SID tidak ditemukan, atau melanjutkan session saat ini jika SID ada. Anda menggunakan fungsi hanya dengan menyebutnya seperti ini:

session_start();

Catatan bahwa fungsi session_start () melaporkan hasil yang sukses terlepas dari hasilnya. Oleh karena itu, menggunakan setiap jenis penanganan pengecualian dalam hal ini akan terbukti sia-sia.

Anda dapat menghilangkan pelaksanaan fungsi ini sama sekali dengan mengaktifkan direktif konfigurasi session.auto_start. Perlu diingat, bahwa ini akan memulai atau melanjutkan session untuk setiap halaman PHP diaktifkan.

Menghancurkan Session

Meskipun Anda dapat mengkonfigurasi direktif -penanganan session PHP untuk secara otomatis menghancurkan sebuah session berdasarkan waktu berakhir atau probabilitas, Terkadang berguna untuk secara manual membatalkan session sendiri. Sebagai contoh, Anda mungkin ingin memungkinkan pengguna untuk secara manual log out dari situs Anda. Ketika pengguna mengklik link yang sesuai, Anda dapat menghapus variabel session dari memori, dan bahkan sepenuhnya menghapus sesi dari penyimpanan, dilakukan melalui fungsi session_unset () dan session_destroy (), masing-masing.

fungsi session_unset () menghapus semua variabel session yang disimpan dalam session saat ini, secara efektif mereset session ke keadaan di mana ia ditemukan pada penciptaan (tidak ada variabel session didaftarkan). prototipe nya terlihat seperti ini:

void session_unset()

Sementara mengeksekusi session_unset () memang akan menghapus semua variabel session yang disimpan dalam session saat ini, ini tidak akan sepenuhnya menghapus session dari mekanisme penyimpanan. Jika Anda ingin menghancurkan session, Anda harus menggunakan fungsi session_destroy (), yang membatalkan session saat ini dengan sepenuhnya menghapus session dari mekanisme penyimpanan. Perlu diingat bahwa ini tidak akan menghancurkan setiap cookies pada browser pengguna. prototipe nya terlihat seperti ini:

boolean session_destroy()

Jika anda tidak tertarik menggunakan cookie di luar akhir session, hanya mengatur session.cookie_lifetime ke 0 (nilai default) dalam file php.ini.

Mengatur dan Mengambil Session ID

Ingat bahwa SID ikatan semua data session ke pengguna tertentu. Meskipun PHP akan keduanya membuat dan menyebarkan SID yang mandiri, ada kalanya Anda mungkin ingin mengatur secara manual atau mengambilnya. Fungsi session_id () mampu melaksanakan keduanya tugas. prototipe nya terlihat seperti ini:

string session_id([string sid])

fungsi session_id () dapat keduanya mengatur dan mendapatkan SID tersebut. Jika ini dilewatkan bukan parameter, fungsi session_id () mengembalikan SID saat ini. Jika parameter opsional sid disertakan, SID saat ini akan diganti dengan nilai tersebut. Sebuah contoh berikut:

<?php

session_start();

echo "Your session identification number is ".session_id();

?>

Hal ini menghasilkan output yang sama sebagai berikut:

Membuat dan Menghapus Variabel Session

Variabel Session ini digunakan untuk mengelola data dimaksudkan untuk bepergian dengan pengguna dari satu halaman ke halaman berikutnya. Hari ini, bagaimanapun, metode yang disukai hanya melibatkan pengaturan dan menghapus variabel ini sama seperti yang lain, kecuali bahwa Anda perlu untuk merujuk ke dalam konteks superglobal $_SESSION. Misalnya, Anda ingin mengatur variabel session bernama username:

<?php

session_start();

$_SESSION['username'] = "jason";

printf("Your username is %s.", $_SESSION['username']);

?>

Ini mengembalikan sebagai berikut:

Untuk menghapus variabel, Anda dapat menggunakan fungsi unset ():

<?php

session_start();

$_SESSION['username'] = "jason";

printf("Your username is: %s <br />", $_SESSION['username']);

unset($_SESSION['username']);

printf("Username now set to: %s", $_SESSION['username']);

?>

Ini mengembalikan:

■ Perhatian Anda mungkin menemukan sumber belajar yang lebih tua dan diskusi grup berita merujuk pada fungsi session_register () dan session_unregister (),dimana dulunya cara yang direkomendasikan untuk membuat dan menghancurkan variabel session, masing. Namun, karena fungsi ini bergantung pada direktif konfigurasi yang disebut register_globals, yang dinonaktifkan secara default pada PHP 4.2.0, dan dihapus seluruhnya pada PHP 6.0, Anda malah harus menggunakan penugasan variabel dan metode penghapusan seperti yang dijelaskan dalam bagian ini.

Encoding dan Decoding Data Session

Terlepas dari media penyimpanan, PHP menyimpan data session dalam format standar yang terdiri dari sebuah string tunggal. Sebagai contoh, isi dari suatu session terdiri dari dua variabel, yaitu username dan loggedon, ditampilkan di sini:

username|s:5:"jason";loggedon|s:20:"Feb 16 2008 22:32:29";

Setiap referensi variabel session dipisahkan oleh titik koma dan terdiri dari tiga komponen: nama, panjang, dan nilai. Sintaks umum berikut:

name|s:length:"value";

Syukurlah, PHP menangani session encoding dan decoding secara mandiri. Namun, terkadang Anda mungkin ingin untuk melaksanakan tugas ini secara manual. Dua fungsi yang tersedia untuk melakukannya: session_encode () dan session_decode (), masing-masing.

Encoding Data Session

session_encode () menawarkan metode sangat nyaman untuk manual pengkodean semua variabel session ke dalam string tunggal. Prototipe nya berikut:

string session_encode()

Anda mungkin kemudian masukkan string ini ke dalam database dan kemudian mengambilnya, decoding dengan session_decode (), misalnya.

Sebagai contoh, asumsikan bahwa cookie berisi pengguna SID disimpan di komputernya. Ketika pengguna meminta halaman yang berisi daftar berikut, ID pengguna diambil dari cookie. Nilai Ini kemudian ditugaskan untuk menjadi SID tersebut. Variabel session tertentu diciptakan dan diberikan nilai-nilai, dan kemudian semua informasi ini dikodekan menggunakan session_encode (), menyiapkan itu untuk dimasukkan ke dalam database.

<?php

// Initiate session and create a few session variables

session_start();

// Set a few session variables.

$_SESSION['username'] = "jason";

$_SESSION['loggedon'] = date("M d Y H:i:s");

// Encode all session data into a single string and return the result

$sessionVars = session_encode();

echo $sessionVars;

?>

This returns:

Perlu diketahui bahwa session_encode () akan mengkodekan semua variabel session yang tersedia untuk user tersebut, tidak hanya mereka yang didaftarkan dalam script tertentu dimana session_encode () dijalankan.

Decoding Data Session

Pengkodean data session dapat diterjemahkan dengan session_decode (). prototipenya terlihat seperti ini:

boolean session_decode(string session_data)

Parameter masukan session_data merupakan string dikodekan variabel session. Fungsi ini akan decode variabel, mengembalikan mereka ke format aslinya, dan kemudian mengembalikan TRUE pada kesuksesan dan FALSE sebaliknya. Melanjutkan contoh sebelumnya, anggaplah bahwa beberapa data session yang dikodekan dan disimpan dalam database, yaitu SID dan variabel $_SESSION['username'] and $_SESSION['loggedon']. Dalam script berikut, data yang diambil dari tabel dan didekodekan:

<?php

session_start();

$sid = session_id();

// Encoded data retrieved from database looks like this:

// $sessionVars = username|s:5:"jason";loggedon|s:20:"Feb 16 2008 22:32:29";

session_decode($sessionVars);

echo "User ".$_SESSION['username']." logged on at".$_SESSION['loggedon'].".";

?>

Hal ini mengembalikan:

Contoh hipotetis ini dimaksudkan hanya untuk menunjukkan encoding session PHP dan fungsi decoding. Jika Anda ingin menyimpan data session di database, ada jauh lebih efisien metode yang melibatkan mendefinisikan Penanganan sesi kustom, dan mengikat mereka yang menangani langsung ke PHP API.

Praktik Contoh Penanganan Session

Sekarang bahwa Anda terbiasa dengan fungsi dasar yang membuat pekerjaan penanganan session, Anda siap untuk mempertimbangkan contoh dunia nyata sedikit. Contoh pertama menunjukkan Anda bagaimana untuk membuat mekanisme yang secara otomatis autentikasi mengembalikan pengguna situs yang terdaftar. Contoh kedua menunjukkan bagaimana variabel session dapat digunakan untuk menyediakan pengguna dengan indeks dokumen yang baru dilihat. Kedua contoh cukup umum, yang tidak harus datang sebagai kejutan yang diberikan utilitas yang jelas mereka. Apa yang mungkin datang sebagai kejutan adalah kemudahan dimana anda dapat membuat mereka.

■ Catatan Jika Anda tidak terbiasa dengan database MySQL dan bingung dengan sintaks yang ditemukan dalam contoh berikut, memikirkan untuk melihat kembali material yang ada di Bab 30.

Secara otomatis Logging In Mengembalikan Pengguna

Sekali pengguna telah login, biasanya dengan menyertakan username dan kombinasi password yang secara unik mengidentifikasi user tersebut, hal ini sering mudah digunakan untuk memungkinkan pengguna untuk kemudian kembali ke situs tersebut tanpa harus mengulangi proses tersebut. Dapat melakukan ini dengan mudah menggunakan session, beberapa variabel sedikit session, dan tabel MySQL. Meskipun ada banyak cara untuk menerapkan fitur ini, memeriksa sebuah variabel session yang ada (yaitu $ username) sudah cukup. Jika variabel itu ada, pengguna dapat secara otomatis log in ke situs tersebut. Jika tidak, login form disajikan.

■ Catatan Secara default, direktif konfigurasi session.cookie_lifetime diatur ke 0, yang berarti topi cookie tidak akan bertahan jika browser di-restart. Oleh karena itu, Anda harus mengubah nilai ini ke nomor yang sesuai detik untuk membuat session berlangsung selama jangka waktu tertentu.

Tabel MySQL, pengguna, disajikan pada properti 18-1.

properti 18-1. Tabel Pengguna

CREATE TABLE users (

id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,

username VARCHAR(10) NOT NULL,

pswd VARCHAR(10) NOT NULL,

PRIMARY KEY(id)

);

Sebuah potongan (login.html) digunakan untuk menampilkan form login untuk user jika sesi valid tidak ditemukan disajikan berikutnya:

<p>

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">

Username:<br /><input type="text" name="username" size="10" /><br />

Password:<br /><input type="password" name="pswd" SIZE="10" /><br />

<input type="submit" value="Login" />

</form>

</p>

Akhirnya, logika yang digunakan untuk mengelola proses auto-login berikut:

<?php

session_start();

// Has a session been initiated previously?

if (! isset($_SESSION['username'])) {

// If no previous session, has the user submitted the form?

if (isset($_POST['username']))

{

$username = mysqli_real_escape_string($_POST['username']);

$pswd = mysqli_real_escape_string($_POST['pswd']);

// Connect to the MySQL server and select the database

mysql_connect("localhost","webuser","secret");

mysql_select_db("chapter18");

// Look for the user in the users table.

$query = "SELECT username FROM users

WHERE username='$username' AND pswd='$pswd'";

$result = mysql_query($query);

// Has the user been located?

if (mysql_numrows($result) == 1)

{

$_SESSION['username'] = mysql_result($result,0,"username");

echo "You've successfully logged in. ";

}

// If the user has not previously logged in, show the login form

} else {

include "login.html";

}

// The user has returned. Offer a welcoming note.

} else {

printf("Welcome back, %s!", $_SESSION['username']);

}

?>

Pada saat pengguna dibanjiri dengan kebutuhan untuk mengingat username dan password untuk setiap jenis dibayangkan layanan online, dari memeriksa e-mail untuk pembaharuan buku perpustakaan untuk meninjau sebuah rekening bank, memberikan fitur login secara otomatis ketika situasi memungkinkan tentunya akan disambut oleh pengguna Anda.

menghasilkan Indeks Dokumen Dilihat Baru-baru ini

Berapa banyak waktu anda dikembalikan ke situs Web, bertanya-tanya di mana tepatnya untuk menemukan bahwa tutorial besar PHP yang Anda tetap lupa untuk bookmark? Bukankah lebih baik jika situs Web yang mampu mengingat dimana artikel yang Anda baca, dan sekarang Anda dengan daftar setiap kali diminta? Contoh ini menunjukkan fitur tersebut.

Solusinya adalah mengherankan mudah, namun efektif. Untuk diingat dimana dokumen telah dibaca oleh pengguna tertentu, Anda dapat meminta bahwa baik pengguna dan setiap dokumen diidentifikasi oleh pengenal unik. Bagi

pengguna, SID memenuhi persyaratan ini. Dokumen-dokumen dapat diidentifikasi sebenarnya dalam dengan cara yang Anda inginkan, tapi contoh ini menggunakan judul artikel dan URL, dan mengasumsikan bahwa informasi ini berasal dari data yang tersimpan dalam tabel database bernama artikel, ditampilkan di sini:

CREATE TABLE articles (

id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,

title VARCHAR(50),

content MEDIUMTEXT NOT NULL,

PRIMARY KEY(id)

);

Tugas hanya diminta untuk menyimpan pengidentifikasi artikel pada variabel session, yang dilaksanakan berikutnya:

<?php

// Start session

session_start();

// Connect to server and select database

mysql_connect("localhost","webuser","secret");

mysql_select_db("chapter18");

// Retrieve requested article id

$articleid = mysqli_real_escape_string($_GET['id']);

// User wants to view an article, retrieve it from database

$query = "SELECT title, content FROM articles WHERE id='$id'";

$result = mysql_query($query);

// Retrieve query results

list($title, $content) = mysql_fetch_row($result);

// Add article title and link to list

$articlelink = "<a href='article.php?id=$id'>$title</a>";

if (! in_array($articlelink, $_SESSION['articles']))

$_SESSION['articles'][] = $articlelink;

// Output list of requested articles

echo "<p>$title</p><p>$content</p>";

echo "<p>Recently Viewed Articles</p>";

echo "<ul>";

foreach($_SESSION['articles'] as $doc) echo "<li>$doc</li>";

echo "</ul>";

?>

Output sampel ditunjukkan dalam Gambar 18-1.

■ ■ ■

CHAPTER 21

Secure PHP Programming

Setiap situs web dapat dianggap sebagai sebuah istana selalu diserang oleh lautan orang biadab. Dan sebagai sejarah dari kedua menunjukkan perang konvensional dan informasi, sering kemenangan penyerang 'tidak sepenuhnya tergantung pada derajat mereka keahlian atau licik, tetapi lebih pada pengawasan dengan pertahanan. Sebagai penjaga kerajaan elektronik, anda berhadapan tanpa sejumlah kecil ingresses potensial dari malapetaka yang bisa dikerjakan, mungkin terutama sebagai berikut:

Kelemahan Software : biasanya server database, server Web, dan satu atau lebih bahasa pemrograman, semua yang dapat berjalan pada satu atau lebih sistem operasi. Oleh karena itu, penting untuk terus-menerus mengikuti perkembangan kelemahan terbuka dan mengambil langkah yang diperlukan untuk patch masalah sebelum seseorang mengambil keuntungan dari itu.

User input: pemanfaatan cara di mana input pengguna diproses mungkin cara termudah untuk menyebabkan kerusakan serius pada data dan aplikasi, pernyataan yang didukung oleh berbagai laporan serangan diluncurkan pada situs web berprofil tinggi dengan cara ini. Manipulasi data yang diberikan melalui bentuk Web, parameter URL, cookies, dan rute mudah diakses lainnya memungkinkan penyerang untuk menyerang jantung logika aplikasi Anda.

Data dilindungi Dengan buruk: Data adalah nyawa dari perusahaan Anda, kehilangan itu risiko Anda sendiri. Semua juga sering, database dan account Web dibiarkan dibuka atau dilindungi dengan password patut dipertanyakan. Atau akses ke aplikasi administrasi berbasis web tersedia melalui URL mudah diidentifikasi. Semacam ini gaffes keamanan tidak dapat diterima, terutama

karena mereka begitu mudah dipecahkan. Karena setiap skenario menimbulkan risiko signifikan bagi integritas aplikasi Anda, semua harus diselidiki secara menyeluruh dan ditangani yang sesuai. Bab ini mengulas banyak langkah yang dapat Anda ambil untuk lindung terhadap dan bahkan menghilangkan bahaya ini.

Mengkonfigurasi PHP dengan aman

PHP menawarkan sejumlah parameter konfigurasi yang dimaksudkan untuk lebih meningkatkan tingkat kepedulian keamanan. Bagian ini memperkenalkan banyak pilihan yang paling relevan.

Safe Mode

Jika Anda menjalankan versi PHP yang lebih awal dari PHP 6, safe mode akan menjadi menarik khususnya jika Anda menjalankan PHP pada lingkungan bersama-server. Bila diaktifkan, safe mode selalu memverifikasi bahwa pemilik script yang sedang dijalankan itu cocok dengan pemilik file dimana script berupaya untuk membuka. Hal ini untuk mencegah pelaksanaan yang tidak diinginkan, meninjau, dan modifikasi file yang tidak dimiliki oleh user pelaksana, dengan ketentuan bahwa hak istimewa file juga terkonfigurasi dengan baik untuk mencegah modifikasi. Mengaktifkan modus safe juga memiliki efek penting lainnya pada perilaku PHP, selain mengurangi, atau bahkan menonaktifkan, kemampuan berbagai fungsi standar PHP. Efek ini dan berbagai parameter yang berhubungan dengan mode safe yang terdiri dari fitur ini akan dibahas dalam bagian ini.

■Perhatian Pada versi 6, safe mode tidak lagi tersedia. Lihat Bab 2 untuk informasi lebih lanjut.

safe_mode = On | Off

Scope: PHP_INI_SYSTEM; Default value: Off

Mengaktifkan direktif safe_mode menempatkan pembatasan beberapa fitur bahasa yang berpotensi berbahaya ketika menggunakan PHP dalam lingkungan bersama. Anda Dapat mengaktifkan safe_mode dengan pengaturan ke nilai boolean on, atau menonaktifkannya dengan pengaturan untuk Off. Skema pembatasan yang didasarkan pada membandingkan UID (user ID) dari skrip yang sedang dijalankan dan UID file bahwa script berupaya untuk mengakses. Jika UID yang sama, script dapat mengeksekusi, jika tidak, script gagal.

Khususnya, bila safe mode diaktifkan, beberapa pembatasan mulai berpengaruh:

• Penggunaan semua fungsi input / output (misalnya, fopen (), file (), dan require ()) dibatasi untuk file yang memiliki pemilik yang sama dengan script yang memanggil fungsi tersebut. Sebagai contoh, dengan asumsi bahwa safe mode diaktifkan, jika skrip yang dimiliki oleh Mary memanggil fopen () dan mencoba untuk membuka file yang dimiliki oleh John, maka akan gagal. Namun, jika Maria memiliki kedua script memanggil fopen () dan file yang dipanggil oleh fopen (), upaya ini akan berhasil.

• Mencoba oleh pengguna untuk membuat file baru akan dibatasi untuk menciptakan file dalam direktori yang dimiliki oleh pengguna.

• Mencoba untuk menjalankan script melalui fungsi seperti popen (), system (), atau exec () hanya memungkinkan bila script berada pada direktori yang ditentukan oleh direktif konfigurasi safe_mode_exec_dir. Direktif ini dibahas kemudian dalam bagian ini.

• otentikasi HTTP ini diperkuat karena UID dari pemilik skrip otentikasi didahului ke wilayah otentikasi. Selanjutnya, variabel PHP_AUTH tidak menetapkan kapan safe mode diaktifkan.

• Jika menggunakan database server MySQL, username yang digunakan untuk terhubung ke server MySQL harus sama sebagai username dari pemilik file memanggil mysql_connect ().

Berikut ini adalah daftar lengkap dari fungsi, variabel, dan perintah konfigurasi yang dipengaruhi ketika direktif safe_mode diaktifkan:

safe_mode_gid = On | Off

Scope: PHP_INI_SYSTEM; Default value: 0ff

Direktif ini mengubah safe mode's perilaku dari memverifikasi UID sebelum eksekusi untuk memverifikasi ID grup. Misalnya, jika Maria dan Yohanes berada dalam kelompok pengguna yang sama, script Mary dapat memanggil fopen () pada file John.

safe_mode_include_dir = string

Scope: PHP_INI_SYSTEM; Default value: NULL

Anda dapat menggunakan safe_mode_include_dir untuk menunjuk berbagai path di mana safe mode akan diabaikan jika diaktifkan. Misalnya, Anda mungkin menggunakan fungsi ini untuk menentukan direktori yang berisi berbagai template yang mungkin dimasukkan ke dalam beberapa pengguna situs Web. Anda dapat menetapkan beberapa direktori dengan memisahkan masing-masing dengan kolon pada sistem berbasis Unix, dan tanda titik koma pada Windows.

Catatan bahwa menetapkan path tertentu tanpa garis miring akan menyebabkan semua direktori terjatuh di bawah path yang juga diabaikan oleh pengaturan mode safe. Misalnya, pengaturan direktif ini untuk /home/configuration berarti bahwa /home/configuration/templates/ dan /home/configuration/passwords/ juga dibebaskan dari pembatasan safe mode. Oleh karena itu, jika Anda ingin mengecualikan hanya sebuah direktori tunggal atau serangkaian direktori dari pengaturan mode safe, memastikan untuk menyimpulkan masing-masing dengan garis miring di belakang.

safe_mode_allowed_env_vars = string

Scope: PHP_INI_SYSTEM; Default value: "PHP_"

■ ■ ■

CHAPTER 24

MVC and the Zend Framework

Bahkan pada tahap awal kemungkinan pengembangan karir Web Anda, kemungkinan Anda sudah mencoba untuk membuat sketsa fitur dari aplikasi custom jangka panjang yang diinginkan. Sebuah toko e-commerce mungkin? Sebuah forum komunitas online yang ditujukan untuk mengumpulkan perangko?