0% menganggap dokumen ini bermanfaat (0 suara)
2K tayangan480 halaman

PHP MySQL Untuk Pemula Sampai Profesional

PHP,MySQL, Newbie,Pemula,Advance PHP MySQL

Diunggah oleh

djale7
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
2K tayangan480 halaman

PHP MySQL Untuk Pemula Sampai Profesional

PHP,MySQL, Newbie,Pemula,Advance PHP MySQL

Diunggah oleh

djale7
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 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.

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 masingmasing.

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 masingmasing.


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


disable_functions, seperti ini:

menempatkan

mereka

untuk

parameter

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 kelaskelas tertentu ditemukan di dalam perpustakaan ini bahwa Anda tidak ingin
membuat tersedia, Namun demikian. Anda dapat mencegah penggunaan kelaskelas 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 masingmasing kata kunci warna. Sebagai contoh, warna biasanya kita sebut sebagai
hitam bisa direpresentasikan sebagai rgb (0,0,0), # 000000, atau hitam, masingmasing.
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, masingmasing 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 email 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-INSTALLATIONDIRECTORY/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 PHPenabled Web server, Anda akan melihat output yang ditunjukkan pada Gambar 31.

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
-678900

// decimal
// 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
menawarkan informasi tentang kedua sistem operasi dan browser.

biasanya

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;
$a = "5";

// assign integer value 5 to the variable $a


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

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


$wine = "Zinfandel";
$inventory++;

// assign "Zinfandel" to the variable $wine


// 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-kekanan 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 kelompokkelompok 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. Masingmasing 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 satusatunya 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 dibangunpada, 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-pertamakeluar, 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 tanggaltanggal 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 masingmasing 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
E_ALL
E_COMPILE_ERROR
E_COMPILE_WARNING
E_CORE_ERROR
E_CORE_WARNING
E_ERROR
E_NOTICE
E_PARSE
E_RECOVERABLE_ERROR
E_STRICT
E_USER_ERROR
E_USER_NOTICE
E_USER_WARNING
E_WARNING

Deskripsi
Semua error dan peringatan
Fatal error saat kompilasi
Peringatan Saat kompilasi
Fatal error yang terjadi selama start awal PHP
Peringatan yang terjadi saat start awal PHP
Fatal error saat berjalan
pemberitahuan Menjalankan waktu
Saat kompilasi mengurai error
Dekat dengan fatal error (diperkenalkan dalam
PHP 5.2)
Usulan portabilitas versi PHP (diperkenalkan pada
PHP 5.0)
error yang dihasilkan Pengguna
pemberitahuan yang dihasilkan Pengguna
peringatan yang dihasilkan Pengguna
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_NOTICE)

&

~(E_USER_ERROR

E_USER_WARNING

Seperti yang sering terjadi, nama permainan ini adalah untuk tetap baikinformasi 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
LOG_CONS
LOG_NDELAY
LOG_ODELAY
LOG_PERROR
LOG_PID

Deskripsi
Jika error terjadi saat menulis ke syslog, mengirim output ke
sistem konsol.
Segera membuka koneksi ke syslog.
Jangan membuka koneksi sampai pesan pertama telah
diajukan untuk logging. Ini adalah default.
Output pesan log untuk kedua syslog dan standard error.
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, penangananpengecualian 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 penangananeksepsi 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 casetidak 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
i
g
m

s
x
U

Deskripsi
Melakukan pencarian case-tidak sensitif.
Mencari semua kejadian (melakukan pencarian global).
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.
Perlakukan string sebagai garis tunggal, mengabaikan karakter
baris baru yang ditemukan di dalam; ini menyelesaikan hanya
kebalikan dari pengubah m.
Mengabaikan spasi kosong dan komentar dalam ekspresi reguler.
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 (). Fungsifungsi 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,
htmlentities(). Prototipe nya berikut :

anda

dapat

mengunakan

fungsi

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
BIG5
BIG5-HKSCS
cp866
cp1251
cp1252
EUC-JP
GB2312
ISO-8859-1
ISO-8859-15
KOI8-R
Shift-JIS
UTF-8

Deskripsi
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 Franaise' 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
sebelumnya

Bagian

dari

String

Berdasarkan

diimbagi

ditetapkan

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-356432 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 commandline, 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 CPUintensif. 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
r
r+
w
w+
a
a+
b
t

Deskripsi
Hanya membaca. Pointer file ditempatkan pada awal file.
Membaca dan menulis. Pointer file ditempatkan pada awal file.
hanya Menulis. Sebelum menulis, menghapus isi file dan
mengembalikan pointer file ke awal file. Jika file tidak ada,
berusaha untuk menciptakannya.
Membaca dan menulis. Sebelum membaca atau menulis,
menghapus isi file dan mengembalikan pointer file ke awal file. Jika
file tidak ada, berusaha untuk menciptakannya.
Hanya Menulis. Pointer file ditempatkan pada akhir file. Jika file
tidak ada, berusaha untuk menciptakannya. Mode ini lebih dikenal
sebagai Tambahkan.
Membaca dan menulis. Pointer file ditempatkan pada akhir file.
Jika file tidak ada, berusaha untuk menciptakannya. Proses ini
dikenal sebagai menambahkan ke file.
Membuka file dalam mode biner.
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 PEARspesifik 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 tugastanggal 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, langkahlangkah 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
15

echo "<tr>";
}

16
17

if ($day->isEmpty()) {

18
19

echo "<td>&nbsp;</td>";
} else {

20
21
22

echo '<td>'.$day->thisDay()."</td>";
}

23

if ($day->isLast()) {

24
25

echo "</tr>";
}

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 1315: Jika $Day adalah hari pertama dalam minggu itu, output tag <tr>.
Lines 1721: Jika $Day kosong, output sel kosong. Jika tidak, output jumlah hari.
Lines 2325: 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
menegakkan
menggunakan
menampilkan
aturan:

berikut
validasi
window
sebuah

menunjukkan penggunaan aturan yang diperlukan,


sisi klien dengan menampilkan pesan kesalahan
alert JavaScript (perilaku default HTML_QuickForm), atau
pesan selamat datang harus melewati mengumpulkan

<?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,
$_SERVER['PHP_AUTH_PW']

yaitu

$_SERVER['PHP_AUTH_USER']

and

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 hardcoding 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 Incs 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 145.
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

mwade

jgennick 3c05ce06d51e9498ea472691cd811fb6

0e4ab1a5a6d8390f09e9a0f2d45aeb7f

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/formdata. 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 formupload 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 hostnameke 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
LDAPs widely used open source implementation
IBM LDAP Redbooks (http://www.redbooks.ibm.com/): IBMs 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?

Anda mungkin juga menyukai