Mark berkolaborasi di GitHub

Pendahuluan

Di internet, tersebar banyak sekali tutorial kuno yang menyesatkan programmer PHP. Mengajarkan cara buruk dan menyebarkan contoh kode yang tidak aman. PHP: The Right Way adalah referensi yang mengikuti standar pengkodean modern, ditujukan bagi para programmer baru agar dapat membangun software berkualitas menggunakan PHP.

Sebetulnya, tidak ada satu cara autentik untuk menggunakan PHP. Namun, website ini bermaksud untuk mengenalkan programmer PHP baru kepada hal-hal yang tidak mereka temukan selama ini.

Bagi programmer senior, tulisan ini dapat menjadi penyegar pada apa yang telah mereka lakukan selama ini. Tulisan ini juga akan memperbarui cara-cara lama yang sudah terlanjur mendarahdaging.

Dokumen ini akan terus diperbarui dengan informasi dan contoh-contoh terbaru sehingga akan terus bermanfaat.

Terjemahan di Bahasa Lain

PHP: The Right Way sudah diterjemahkan ke banyak bahasa lain:

Ingin berkontribusi?

Ayo bantu website ini agar menjadi sumber terbaik bagi para progammer PHP baru! Ayo berkontribusi di GitHub

Bantu sebarkan

PHP: The Right Way memiliki gambar banner yang bisa dipasang di website Anda. Tunjukkan kepedulian anda kepada programmer PHP baru untuk mengetahui letak informasi yang bagus.

Gambar Banner

Kembali ke atas

Memulai

Gunakan versi PHP stabil terbaru (5.5)

Jika Anda baru saja mulai PHP, pastikan memulai dengan rilis stabil terbaru yaitu PHP 5.5. Selama beberapa tahun terakhir ini, PHP telah membuat langkah besar dengan menambahkan fitur baru. Jangan tertipu oleh perbedaan versi minor antara 5.2 dan 5.5, karena sebenarnya itu adalah perubahan yang sangat besar. Jika Anda mencari fungsi atau penggunaannya, silakan kunjungi php.net.

Web server bawaan

Anda dapat mulai belajar PHP dengan menggunakan web server bawaan (minimal PHP 5.4). Untuk memulai server, jalankan perintah berikut dari terminal Anda dalam sebuah directory:

> php -S localhost:8000

Setup di Mac

OSX sudah dikemas dengan PHP, tetapi biasanya sedikit tertinggal dari versi terbaru. Lion datang dengan PHP 5.3.6, Mountain Lion membawa PHP 5.3.10, dan Mavericks membawa PHP 5.4.17.

Untuk memperbarui PHP di OSX, Anda bisa menginstalnya melalui mac-package-managers, dan dianjurkan dengan [php-OSX oleh Liip] [php-osx-download].

Pilihan lainnya adalah dengan mengkompilasi sendiri, dalam kasus ini pastikan Xcode telah diinstal. Atau pengganti [“Tools Command Line untuk Xcode”] Apple apple-developer dapat didownload dari Apple Mac Developer Center.

Untuk paket “all-in-one” termasuk PHP, web server Apache, dan database MySQL, dengan kontrol yang baik dilengkapi GUI, cobalah [MAMP] [mamp-download] atau XAMPP.

Setup di Windows

Ada beberapa cara untuk setup PHP di Windows. Anda dapat [men-download binari] [php-download].

Untuk proses belajar dan development di lokal, Anda dapat menggunakan built in webserver dengan PHP 5.4+ sehingga Anda tidak perlu mengkhawatirkan konfigurasi yang rumit.

Jika Anda ingin paket “all-in-one” yang mencakup webserver dan MySQL, paket seperti Web Platform Installer, Zend Server CE, XAMPP dan WAMP akan membantu memberikan environment di Windows.

Namun, harap berhati-hati karena paket ini akan sedikit berbeda dari environment produksi jadi berhati-hatilah dengan perbedaan lingkungan jika Anda bekerja pada Windows dan menggunakan untuk Linux.

Vagrant

Seringkali developer menemukan masalah ketika menjalankan aplikasi pada saat development dan production. Masalah itu ditimbulkan karena perbedaan environment. Misalkan developer membuat aplikasi di Windows, sedangkan server produksi menggunakan Linux.

Masalah tersebut semakin terasa ketika anda bekerja dalam sebuah tim di mana setiap anggota menggunakan OS yang berbeda-beda. Salah seorang menggunakan Windows, satu orang menyukai MacOS, dan lainnya memilih Linux.

Jika itulah yang Anda alami, mungkin ada baiknya Anda mempertimbangkan menggunakan mesin virtual dalam development. Kedengarannya rumit, tapi dengan menggunakan Vagrant, Anda dapat dengan mudah mengatur mesin virtual hanya dalam beberapa langkah.

Mesin virtual ini kemudian dapat diatur secara manual, atau Anda dapat menggunakan “provisioning” software seperti Puppet atau Chef untuk melakukannya. Provisioning mesin virtual adalah cara yang bagus untuk memastikan bahwa beberapa mesin ditetapkan dalam cara yang identik. Dan menghilangkan kebutuhan bagi Anda untuk men-setup nya secara manual. Anda bahkan dapat dengan mudah menghapus mesin virtual tersebut dan membuatnya lagi dari awal.

Vagrant menciptakan shared folder yang digunakan untuk berbagi kode antara host dan mesin virtual Anda, yang berarti Anda dapat membuat dan mengedit file Anda pada mesin host Anda dan kemudian menjalankan kode di dalam mesin virtual Anda.

Bantuan Singkat

Jika Anda perlu sedikit bantuan untuk mulai menggunakan Vagrant ada tiga layanan yang mungkin berguna:

Kembali ke atas

Panduan Code Style

Komunitas PHP sangatlah besar dan beragam. Ada banyak library, framework, dan component yang sudah tersedia. Dalam memilih library-_library_ dan framework ini dan menggunakannya dalam sebuah proyek, developer perlu mematuhi aturan code style yang digunakan pada framework tersebut.

The PHP Framework Interop Group telah mengusulkan dan menyetujui serangkaian rekomendasi gaya pengkodean. Meskipun tidak semuanya terkait dengan code style, tapi mereka yang merumuskan PSR-0, PSR-1, PSR-2 dan PSR-4.

Rekomendasi ini hanyalah seperangkat aturan dan sudah diadopsi oleh beberapa proyek seperti Drupal, Zend, Symfony, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium, dll. Anda dapat memilih antara mengikuti PSR untuk proyek-proyek Anda sendiri, atau terus menggunakan gaya pribadi Anda sendiri.

Idealnya Anda harus menulis kode PHP yang mematuhi standar yang dikenal. Ini bisa berupa kombinasi dari PSR, atau satu standar coding yang dibuat oleh PEAR atau Zend. Ini berarti developer lain dapat dengan mudah membaca dan bekerja dengan kode Anda, dan aplikasi yang menerapkan komponen dapat memiliki konsistensi bahkan ketika bekerja dengan banyak kode pihak ketiga.

Anda dapat menggunakan PHP_CodeSniffer untuk memeriksa kode terhadap salah satu dari rekomendasi tersebut, dan plugin untuk editor teks seperti Text Sublime 2 dapat memberikan feedback secara real time.

Gunakan tools dari Fabien Potencier ini PHP Coding Standards Fixer untuk secara otomatis mengubah sintaks kode Anda sehingga sesuai dengan standar-standar ini, menghemat waktu untuk memperbaiki setiap masalah secara manual.

Bahasa Inggris lebih disukai untuk semua nama simbol dan infrastruktur kode. Komentar dapat ditulis dalam bahasa yang mudah dibaca oleh semua pihak saat ini dan masa depan yang akan mengerjakan source code tersebut.

Kembali ke atas

Gambaran Bahasa PHP

Paradigma Pemrograman

PHP adalah bahasa pemrograman fleksibel, dinamis, dan mendukung berbagai teknik pemrograman. Perkembangan yang sangat pesat telah terjadi di PHP selama bertahun-tahun, terutama dukungan terhadap pemrograman berorientasi objek (OOP) di PHP 5.0 (2004), anonymous function dan namespace di PHP 5.3 (2009), dan trait di PHP 5.4 (2012).

Pemrograman Berorientasi Object

PHP sangat mendukung pemrograman berorientasi obyek termasuk dukungan untuk class, abstract class, interface, inheritance, constructor, cloning, exception, dan banyak lagi.

Pemrograman Fungsional

PHP mendukung first class function, yang berarti bahwa fungsi dapat dimasukkan ke dalam sebuah variabel. Kedua user-defined dan built-in fungsi dapat direferensikan oleh variabel dan dipanggil secara dinamis. Fungsi dapat disahkan sebagai argumen untuk lainnya fungsi (fitur yang disebut fungsi-order yang lebih tinggi) dan fungsi dapat kembali fungsi lainnya.

Rekursi, sebuah fitur yang memungkinkan fungsi untuk menyebut dirinya didukung oleh bahasa, tetapi sebagian besar fokus kode PHP pada iterasi.

Fungsi anonim baru (dengan dukungan untuk penutupan) yang hadir sejak PHP 5.3 (2009).

PHP 5.4 menambahkan kemampuan untuk mengikat penutupan untuk lingkup obyek dan juga meningkatkan dukungan untuk callables sehingga mereka dapat digunakan secara bergantian dengan fungsi anonim di hampir semua kasus.

Pemrograman Meta

PHP mendukung berbagai bentuk meta-pemrograman melalui mekanisme seperti API Refleksi dan Metode Sihir. ada Metode Sihir banyak tersedia seperti __get (), __set (), __clone (), __toString (), __invoke (), dll yang memungkinkan pengembang untuk menghubungkan ke perilaku kelas. Pengembang Ruby sering mengatakan bahwa PHP kurang method_missing, tetapi tersedia sebagai __call () dan __callStatic ().

Namespaces

Sebagaimana disebutkan di atas, komunitas PHP memiliki banyak pengembang menciptakan banyak kode. Ini berarti bahwa kode PHP sebuah library dapat menggunakan nama kelas yang sama dengan perpustakaan lain. Ketika kedua perpustakaan digunakan dalam namespace yang sama, mereka bertabrakan dan menyebabkan masalah.

Namespaces memecahkan masalah ini. Seperti dijelaskan dalam manual referensi PHP, ruang nama dapat dibandingkan ke direktori sistem operasi yang namespace file; dua file dengan nama yang sama dapat hidup berdampingan dalam direktori terpisah. Demikian juga, dua kelas PHP dengan nama yang sama dapat hidup berdampingan dalam PHP terpisah namespaces. Ini sesederhana itu.

Hal ini penting bagi Anda untuk memberikan namespace pada kode Anda sehingga dapat digunakan oleh pengembang lain tanpa rasa takut bertabrakan dengan library lain.

Salah satu cara yang direkomendasikan untuk menggunakan namespaces diuraikan dalam PSR-0, yang bertujuan untuk memberikan file standar, kelas dan namespace konvensi untuk memungkinkan kode plug-and-play.

Pada bulan Desember 2013 PHP-FIG menciptakan standar baru autoloading: PSR-4, yang suatu saat akan mungkin menggantikan PSR-0. Saat ini keduanya masih digunakan, PSR-4 membutuhkan PHP 5.3 dan banyak proyek yang masih menggunakan PHP 5.2 yang saat ini menerapkan PSR-0. Jika Anda akan menggunakan standar autoloader untuk aplikasi atau library baru maka Anda hampir pasti ingin lebih tau tentang PSR-4.

Standard PHP Library

Standard PHP Library (SPL) dikemas bersamaan dengan PHP dan menyediakan sekumpulan class dan interface. SPL terdiri dari class dan interface struktur data yang umumnya diperlukan seperti stack, queue, heap, dan sebagainya. Juga iterator yang dapat traverse struktur data tersebut yang dapat Anda implementasikan sendiri menggunakan interface SPL.

Command Line Interface

Pada dasarnya, PHP diciptakan untuk menulis aplikasi web. Akan tetapi PHP juga berguna untuk scripting program command line interface (CLI). CLI dengan PHP dapat membantu Anda mengotomatisasi tugas-tugas umum seperti pengujian, distribusi, dan aplikasi administratif.

Program CLI PHP sangat bermanfaat karena Anda dapat menggunakan kode aplikasi Anda secara langsung tanpa harus membuat dan mengamankan web GUI untuk itu. Hanya pastikan untuk tidak menempatkan script CLI PHP di root web publik Anda!

Coba jalankan PHP dari baris perintah Anda:

> php -i

Opsi -i akan menampilkan konfigurasi PHP Anda seperti fungsi phpinfo.

Mari kita menulis “Hello, $ name” Program CLI sederhana. Untuk mencobanya, membuat file bernama hello.php, seperti di bawah ini.

<?php
if ($argc != 2) {
    echo "Usage: php hello.php [name].\n";
    exit(1);
}
$name = $argv[1];
echo "Hello, $name\n";

PHP set up dua variabel khusus berdasarkan argumen apa script Anda dijalankan. $ argc adalah variabel integer yang berisi argumen * count * dan $ argv adalah variabel array yang berisi nilai * setiap argumen *. Argumen pertama selalu nama file script PHP Anda, dalam hal ini hello.php.

Expresi exit () digunakan dengan nomor selain nol untuk memberitahu shell bahwa perintah gagal. Kode keluar yang umum digunakan dapat ditemukan [di sini] [exit-kode].

Untuk menjalankan script kita di atas, jalankan baris perintah:

> php hello.php
Usage: php hello.php [name]
> php hello.php world
Hello, world

XDebug

Salah satu alat yang paling berguna dalam pengembangan perangkat lunak adalah debugger yang tepat. Hal ini memungkinkan Anda untuk melacak pelaksanaan kode Anda dan memantau isi stack. XDebug, debugger PHP, dapat dimanfaatkan oleh berbagai IDE untuk memberikan Breakpoints dan tumpukan inspeksi. Hal ini juga dapat memungkinkan alat seperti PHPUnit dan KCacheGrind untuk melakukan analisis code scope dan code profile.

Jika Anda telah menggunakan var_dump / print_r, dan Anda masih tidak dapat menemukan solusi - mungkin Anda perlu menggunakan debugger.

Instalasi XDebug bisa jadi cukup rumit, tetapi salah satu fitur yang paling penting adalah “Remote Debugging” - jika Anda mengembangkan kode lokal dan kemudian mengujinya di dalam VM atau server lain, Remote Debugging adalah fitur yang Anda akan ingin mengaktifkannya segera.

Secara tradisional, Anda akan memodifikasi file htaccess Apache VHost atau dengan nilai-nilai ini.:

php_value xdebug.remote_host=192.168.?.?
php_value xdebug.remote_port=9000

“remote host” dan “remote port” akan sesuai dengan komputer lokal Anda dan port yang Anda mengkonfigurasi IDE untuk mendengarkan pada. Maka itu hanya masalah menempatkan IDE Anda ke dalam “mendengarkan koneksi” mode, dan memuat URL:

http://your-website.example.com/index.php?XDEBUG_SESSION_START=1

IDE Anda sekarang akan mencegat keadaan saat ini sebagai script yang dieksekusi, yang memungkinkan Anda untuk mengatur breakpoints dan probe nilai-nilai dalam memori.

Debugger grafis membuatnya sangat mudah untuk langkah melalui kode, memeriksa variabel, dan kode eval terhadap runtime hidup. Banyak IDE ini telah built-in atau dukungan berbasis-plugin untuk debugging grafis dengan Xdebug. MacGDBp adalah tool gratis, open-source, berdiri sendiri Xdebug GUI untuk Mac.

Kembali ke atas

Dependency Management

Ada segudang library, framework, dan komponen yang dapat dipilih di PHP. Proyek Anda mungkin akan menggunakan beberapa dari mereka - hal ini disebut sebagai dependensi / ketergantungan. Sampai saat ini, PHP tidak memiliki cara yang baik untuk mengelola dependensi proyek ini. Bahkan jika Anda berhasil melakukannya secara manual, Anda masih harus khawatir tentang autoloaders.

Namun kini tidak lagi. Saat ini ada dua sistem manajemen paket utama untuk PHP - Komposer dan PEAR. Mana yang tepat bagi Anda? Jawabannya adalah keduanya.

Secara umum, paket Composer akan tersedia hanya dalam proyek-proyek yang secara eksplisit Anda tentukan sedangkan paket PEAR akan tersedia bagi semua proyek PHP Anda. Sementara PEAR mungkin terdengar seperti lebih mudah pendekatan pada pandangan pertama, ada keuntungan untuk menggunakan pendekatan dependensi proyek-by-proyek.

Composer dan Packagist

Composer adalah sebuah pengelola ketergantungan (dependency manager) yang brilian untuk PHP. Daftarkan ketergantungan proyek Anda dalam file composer.json, lalu dengan beberapa perintah sederhana, Composer secara otomatis akan mendownload ketergantungan proyek Anda dan melakukan setup autoloading untuk Anda.

Sudah ada banyak library PHP yang kompatibel dengan Composer, siap untuk digunakan dalam proyek Anda. “Paket-paket” tersebut terdaftar pada Packagist, repositori resmi untuk library PHP yang kompatibel dengan Composer.

Cara Install Composer

Anda dapat menginstal Composer di lokal (dalam direktori kerja Anda saat ini, meskipun hal ini tidak lagi dianjurkan) atau global (misalnya /usr/local/bin). Kita berasumsi bahwa Anda ingin menginstal Composer lokal. Dari direktori root proyek Anda:

curl -s https://getcomposer.org/installer | php

Perintah di atas akan men-download composer.phar (arsip biner PHP). Anda dapat menjalankan composer dengan php untuk mengelola dependensi proyek Anda. Harap dicatat bahwa </ strong> Jika Anda mendownload dengan melakukan pipe langsung ke PHP, silakan baca sumber kode nya terlebih dulu untuk mengkonfirmasi bahwa kode tersebut aman.

Install di Windows

Untuk pengguna Windows cara termudah untuk memulai adalah dengan menggunakan ComposerSetup installer, yang melakukan instalasi global dan set up $ PATH Anda sehingga Anda dapat memanggil composer dari direktori manapun dalam Command Line Anda.

Cara Install Composer (manual)

Menginstal Composer secara manual adalah teknik canggih; Namun, ada berbagai alasan mengapa pengembang mungkin lebih memilih metode ini vs menggunakan rutin instalasi interaktif. Instalasi interaktif memeriksa instalasi PHP Anda untuk memastikan bahwa:

Karena instalasi manual tidak melakukan pemeriksaan di atas, Anda harus memutuskan apakah trade-off nya sangat berharga untuk Anda. Dengan demikian, di bawah ini adalah bagaimana untuk mendapatkan Komposer secara manual:

curl -s https://getcomposer.org/composer.phar -o $HOME/local/bin/composer
chmod +x $HOME/local/bin/composer

Path $HOME/local/bin (atau direktori pilihan Anda) seharusnya sudah masuk dalam $PATH – variabel lingkungan Anda. Hal ini akan mengakibatkan perintah composer menjadi tersedia.

Bila Anda menemukan dokumentasi yang menyatakan untuk menjalankan Composer sebagai php composer.phar install, Anda dapat mengganti dengan:

composer install

Bagian ini akan menganggap Anda telah menginstal komposer global.

Cara mendefinisikan ketergantungan dan cara installnya

Composer melacak dependensi proyek Anda dalam sebuah file yang bernama composer.json. Anda dapat mengelolanya dengan teks editor jika Anda suka, atau menggunakan Composer itu sendiri. Perintah composer require dapat menambahkan ketergantungan proyek dan jika Anda tidak memiliki file composer.json, file itu akan dibuat. Berikut ini adalah contoh yang menambahkan Twig sebagai ketergantungan proyek Anda.

composer require twig/twig:~1.8

Sebagai alternatif, perintah composer init akan memandu Anda melalui penciptaan file composer.json untuk proyek Anda. Selain itu, jika anda telah Anda membuat file composer.json, Anda dapat memberitahu Composer untuk men-download dan menginstal dependensi Anda ke direktori vendor/. Hal ini juga berlaku untuk proyek-proyek yang telah anda download yang sudah menyediakan file composer.json:

composer install

Selanjutnya, tambahkan baris ini ke file utama aplikasi PHP Anda; ini akan memberitahu PHP untuk menggunakan autoloader Composer sebagai dependensi proyek Anda.

<?php
require 'vendor/autoload.php';

Sekarang Anda dapat menggunakan dependensi proyek Anda, dan mereka akan otomatis diambil pada permintaan.

Meng-update ketergantungan

Composer membuat sebuah file bernama composer.lock yang menyimpan versi yang tepat dari setiap paket yang di-download ketika Anda pertama kali menjalankan php composer.phar install. Jika Anda berbagi proyek Anda dengan pengembang lain dan file composer.lock merupakan bagian dari distribusi Anda, ketika mereka menjalankan php composer.phar install mereka akan mendapatkan versi yang sama seperti Anda. Untuk memperbarui dependensi, jalankan php composer.phar update.

Hal ini sangat berguna ketika Anda mendefinisikan persyaratan versi yang fleksibel. Misalnya persyaratan versi ~ 1,8 berarti “sesuatu yang lebih baru dari 1.8.0, tetapi kurang dari 2.0.x-dev”. Anda juga dapat menggunakan * wildcard seperti dalam 1.8. *. Sekarang dengan menjalankan perintah php composer.phar update, Composer akan meng-upgrade semua dependensi Anda ke versi terbaru sesuai dengan batasan yang Anda tetapkan.

Notifikasi Update

Untuk menerima pemberitahuan tentang rilis versi baru Anda dapat mendaftar untuk VersionEye, sebuah layanan web yang dapat memonitor GitHub dan BitBucket menyumbang composer.json file dan mengirim email dengan rilis paket baru.

Cek ketergantungan Anda terhadap masalah keamanan

The Security Advisories Checker adalah layanan web dan alat perintah baris, keduanya akan memeriksa file composer.lock Anda dan memberitahu Anda jika Anda perlu memperbarui dependensi Anda.

PEAR

Manajer paket lain veteran bahwa banyak pengembang PHP menikmati adalah PEAR. Ini berperilaku dengan cara yang sama seperti Composer, namun memiliki beberapa perbedaan mencolok.

PEAR mewajibkan setiap paket memiliki struktur tertentu, yang berarti bahwa penulis paket harus mempersiapkan untuk penggunaan dengan PEAR. Menggunakan proyek yang tidak siap untuk bekerja dengan PEAR tidak mungkin.

PEAR menginstal paket secara global, yang berarti setelah menginstal mereka sekali mereka yang tersedia untuk semua proyek yang pada Server. Hal ini dapat baik jika banyak proyek bergantung pada paket yang sama dengan versi yang sama tetapi mungkin menyebabkan masalah jika konflik antara versi dua proyek muncul.

Cara Install PEAR

Anda dapat menginstal PEAR dengan men-download installer Phar dan melaksanakan itu. Dokumentasi PEAR telah rinci petunjuk instalasi untuk setiap sistem operasi.

Jika Anda menggunakan Linux, Anda juga dapat melihat di manajer paket distribusi Anda. Debian dan Ubuntu, misalnya, memiliki apt php-pear paket.

Cara Install Paket

Jika paket terdaftar di paket PEAR list, Anda dapat menginstalnya dengan menetapkan nama resmi:

pear install foo

Jika paket di-host di saluran lain, Anda perlu menemukan saluran pertama dan juga menentukan ketika menginstal. Lihat Menggunakan saluran docs Untuk informasi lebih lanjut tentang topik ini.

Menangani Paket PEAR dengan Composer

Jika Anda sudah menggunakan Composer dan Anda ingin menginstal beberapa kode PEAR juga, Anda dapat menggunakan Komposer untuk menangani dependensi PEAR Anda. Contoh ini akan menginstal kode dari pear2.php.net:

{
    "repositories": [
        {
            "type": "pear",
            "url": "http://pear2.php.net"
        }
    ],
    "require": {
        "pear-pear2/PEAR2_Text_Markdown": "*",
        "pear-pear2/PEAR2_HTTP_Request": "*"
    }
}

Bagian pertama " repositori " akan digunakan untuk membiarkan Composer tahu itu harus “menginisialisasinya” (atau “menemukan” dalam terminologi PEAR) repo pir. Kemudian bagian akan membutuhkan awalan paket nama seperti ini:

pear-channel/Package

The “pir” awalan hardcoded untuk menghindari konflik, sebagai saluran pir bisa menjadi sama dengan nama vendor lain paket misalnya, maka nama pendek channel (atau URL lengkap) dapat digunakan untuk referensi yang menyalurkan paket tersebut masuk.

Ketika kode ini terinstal akan tersedia dalam direktori vendor Anda dan secara otomatis tersedia melalui autoloader Composer:

vendor/pear-pear2.php.net/PEAR2_HTTP_Request/pear2/HTTP/Request.php

Untuk menggunakan paket PEAR ini hanya referensi seperti:

$request = new pear2\HTTP\Request();

Kembali ke atas

Coding Practices

Dasar

PHP adalah bahasa yang luas yang memungkinkan coders dari semua tingkat kemampuan untuk menghasilkan kode tidak hanya cepat, tapi efisien. Namun selagi maju melalui bahasa, kita sering melupakan dasar-dasar yang pertama kita pelajari (atau diabaikan) dalam mendukung pemotongan pendek dan / atau kebiasaan buruk. Untuk membantu memerangi masalah umum ini, bagian ini ditujukan untuk mengingatkan coders dari praktek coding dasar dalam PHP.

Tanggal dan Waktu

PHP memiliki kelas bernama DateTime untuk membantu Anda ketika membaca, menulis, atau menghitung membandingkan dengan tanggal dan waktu. ada banyak tanggal dan waktu fungsi dalam PHP terkait selain DateTime, tetapi menyediakan antarmuka yang bagus berorientasi obyek untuk sebagian penggunaan umum. Ia bisa menangani zona waktu, tapi itu di luar pengenalan singkat ini.

Untuk mulai bekerja dengan DateTime, mengubah tanggal dan waktu baku string untuk obyek dengan createFromFormat () metode pabrik atau melakukan baru \ DateTime untuk mendapatkan tanggal dan waktu. Gunakan format () metode `` untuk mengkonversi DateTime kembali ke string untuk output.

<?php
$raw = '22. 11. 1968';
$start = \DateTime::createFromFormat('d. m. Y', $raw);

echo 'Start date: ' . $start->format('m/d/Y') . "\n";

Menghitung dengan DateTime adalah mungkin dengan kelas DateInterval. DateTime memiliki metode seperti add () dan sub () yang mengambil DateInterval sebagai argumen. Jangan menulis kode yang mengharapkan jumlah yang sama detik setiap hari, baik siang hari tabungan dan zona waktu perubahan akan mematahkan asumsi tersebut. Gunakan interval tanggal gantinya. Untuk menghitung tanggal penggunaan perbedaan yang diff () metode. Ini akan mengembalikan DateInterval baru, yang super mudah untuk menampilkan.

<?php
// create a copy of $start and add one month and 6 days
$end = clone $start;
$end->add(new \DateInterval('P1M6D'));

$diff = $end->diff($start);
echo 'Difference: ' . $diff->format('%m month, %d days (total: %a days)') . "\n";
// Difference: 1 month, 6 days (total: 37 days)

On DateTime objects you can use standard comparison:

<?php
if ($start < $end) {
    echo "Start is before end!\n";
}

Salah satu contoh terakhir untuk menunjukkan kelas DatePeriod. Hal ini digunakan untuk beralih di atas berulang peristiwa. Hal ini dapat mengambil dua Objek DateTime, awal dan akhir, dan interval yang akan mengembalikan semua peristiwa di antara.

<?php
// output all thursdays between $start and $end
$periodInterval = \DateInterval::createFromDateString('first thursday');
$periodIterator = new \DatePeriod($start, $periodInterval, $end, \DatePeriod::EXCLUDE_START_DATE);
foreach ($periodIterator as $date) {
    // output each date in the period
    echo $date->format('m/d/Y') . ' ';
}

Design Patterns

Ketika Anda sedang membangun aplikasi Anda akan sangat membantu untuk menggunakan pola-pola umum dalam kode Anda dan pola umum untuk struktur keseluruhan dari proyek Anda. Menggunakan pola umum adalah membantu karena membuat lebih mudah untuk mengelola kode Anda dan memungkinkan pengembang lain dengan cepat memahami bagaimana segalanya cocok bersama-sama.

Jika Anda menggunakan kerangka maka sebagian besar kode tingkat tinggi dan struktur proyek akan didasarkan pada kerangka itu, sehingga banyak keputusan pola yang dibuat untuk Anda. Tapi itu masih terserah Anda untuk memilih pola terbaik untuk mengikuti kode Anda membangun di atas kerangka. Jika, di sisi lain, Anda tidak menggunakan kerangka kerja untuk membangun aplikasi Anda maka Anda harus menemukan pola yang paling sesuai dengan jenis dan ukuran aplikasi yang Anda sedang membangun.

PHP dan UTF-8

Bagian this awalnya ditulis oleh [Alex Cabal] (https://alexcabal.com/) ke arah [PHP Praktik Terbaik] (https://phpbestpractices.org/ # utf-8) dan kini telah bersama here.

Tidak ada satu baris. Hati-hati, detail, dan konsisten.

Saat ini PHP tidak mendukung Unicode pada tingkat yang rendah. Ada beberapa cara untuk memastikan bahwa UTF-8 string diproses OK, tapi itu tidak mudah, dan membutuhkan menggali ke hampir semua tingkat aplikasi web, dari HTML ke SQL ke PHP. Kami akan bertujuan untuk singkat, ringkasan praktis.

UTF-8 di level PHP

Operasi string dasar, seperti concatenating dua string dan menetapkan string ke variabel, tidak perlu apa-apa khusus untuk UTF-8. Namun sebagian besar fungsi string, seperti strpos () dan strlen (), perlu pertimbangan khusus. ini fungsi sering memiliki mitra mb_ *: misalnya, mb_strpos () dan mb_strlen (). Bersama-sama, mitra ini fungsi disebut Fungsi multibita String. Fungsi multibyte string yang secara khusus dirancang untuk beroperasi pada string Unicode.

Anda harus menggunakan mb_ * fungsi setiap kali Anda beroperasi pada string Unicode. Sebagai contoh, jika Anda menggunakan substr () pada UTF-8 string, ada kesempatan baik hasilnya akan mencakup beberapa kacau setengah karakter. Fungsi yang benar untuk menggunakan akan menjadi mitra multibyte, mb_substr ().

Bagian yang sulit adalah mengingat untuk menggunakan mb_ * fungsi setiap saat. Jika Anda lupa bahkan hanya sekali, Unicode Anda string yang memiliki kesempatan menjadi kacau selama pemrosesan lebih lanjut.

Tidak semua fungsi string memiliki mitra mb_ *. Jika tidak ada satu untuk apa yang ingin Anda lakukan, maka Anda mungkin akan keluar keberuntungan.

Selain itu, Anda harus menggunakan mb_internal_encoding () fungsi di bagian atas setiap script PHP Anda menulis (atau di atas global Anda termasuk script), dan mb_http_output () fungsi tepat setelah itu jika skrip Anda keluaran untuk browser. Secara eksplisit mendefinisikan pengkodean string Anda dalam setiap naskah akan menghemat banyak sakit kepala bawah jalan.

Akhirnya, banyak fungsi PHP yang beroperasi pada string memiliki parameter opsional membiarkan Anda menentukan karakter encoding. Anda harus selalu secara eksplisit menunjukkan UTF-8 ketika diberi pilihan. Sebagai contoh, htmlentities () memiliki pilihan untuk encoding karakter, dan Anda harus selalu menentukan UTF-8 jika berurusan dengan string tersebut.

Perhatikan bahwa pada PHP 5.4.0, UTF-8 adalah encoding default untuk htmlentities () dan htmlspecialchars ().

UTF-8 di level Database

Jika script PHP Anda mengakses MySQL, ada kemungkinan string Anda dapat disimpan sebagai non-UTF-8 string dalam database bahkan jika Anda mengikuti semua tindakan pencegahan di atas.

Untuk memastikan string Anda pergi dari PHP ke MySQL sebagai UTF-8, pastikan database dan tabel semua diatur ke utf8mb4 set karakter dan pemeriksaan, dan bahwa Anda menggunakan utf8mb4 set karakter di PDO connection string. lihat contoh kode di bawah ini. Ini critically important.

Perhatikan bahwa Anda harus menggunakan utf8mb4 character set untuk dukungan UTF-8 selesai, bukan utf8 set karakter! lihat Bacaan lebih lanjut mengapa.

UTF-8 di level Web Browser

Gunakan mb_http_output () fungsi untuk memastikan bahwa script PHP Anda output UTF-8 string ke browser Anda. Dalam HTML Anda, termasuk [charset <meta> tag] (http://htmlpurifier.org/docs/enduser-utf8.html) di <head> tag halaman Anda.

<?php
// Tell PHP that we're using UTF-8 strings until the end of the script
mb_internal_encoding('UTF-8');
 
// Tell PHP that we'll be outputting UTF-8 to the browser
mb_http_output('UTF-8');
 
// Our UTF-8 test string
$string = 'Êl síla erin lû e-govaned vîn.';
 
// Transform the string in some way with a multibyte function
// Note how we cut the string at a non-Ascii character for demonstration purposes
$string = mb_substr($string, 0, 15);
 
// Connect to a database to store the transformed string
// See the PDO example in this document for more information
// Note the `set names utf8mb4` commmand!
$link = new \PDO(   
                    'mysql:host=your-hostname;dbname=your-db;charset=utf8mb4',
                    'your-username',
                    'your-password',
                    array(
                        \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
                        \PDO::ATTR_PERSISTENT => false
                    )
                );
 
// Store our transformed string as UTF-8 in our database
// Your DB and tables are in the utf8mb4 character set and collation, right?
$handle = $link->prepare('insert into ElvishSentences (Id, Body) values (?, ?)');
$handle->bindValue(1, 1, PDO::PARAM_INT);
$handle->bindValue(2, $string);
$handle->execute();
 
// Retrieve the string we just stored to prove it was stored correctly
$handle = $link->prepare('select * from ElvishSentences where Id = ?');
$handle->bindValue(1, 1, PDO::PARAM_INT);
$handle->execute();
 
// Store the result into an object that we'll output later in our HTML
$result = $handle->fetchAll(\PDO::FETCH_OBJ);
?><!doctype html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>UTF-8 test page</title>
    </head>
    <body>
        <?php
        foreach($result as $row){
            print($row->Body);  // This should correctly output our transformed UTF-8 string to the browser
        }
        ?>
    </body>
</html>

Bacaan Lebih Lanjut

Kembali ke atas

Dependency Injection

Dari Wikipedia:

Dependency injection is a software design pattern that allows the removal of hard-coded dependencies and makes it possible to change them, whether at run-time or compile-time.

Kutipan ini membuat konsep terdengar jauh lebih rumit daripada yang sebenarnya. Injeksi Ketergantungan menyediakan komponen dengan dependensinya baik melalui injeksi konstruktor, panggilan metode atau pengaturan properti. Hal ini sederhana itu.

Konsep Dasar

Kita dapat menunjukkan konsep dengan contoh sederhana, namun naif.

Di sini kita memiliki database kelas yang memerlukan adaptor untuk berbicara dengan database. Kami instantiate adaptor dalam konstruktor dan menciptakan ketergantungan keras. Hal ini membuat pengujian sulit dan berarti database kelas sangat erat digabungkan ke adaptor.

<?php
namespace Database;

class Database
{
    protected $adapter;

    public function __construct()
    {
        $this->adapter = new MySqlAdapter;
    }
}

class MysqlAdapter {}

Kode ini dapat refactored untuk menggunakan Dependency Injection dan karenanya melonggarkan ketergantungan.

<?php
namespace Database;

class Database
{
    protected $adapter;

    public function __construct(MySqlAdapter $adapter)
    {
        $this->adapter = $adapter;
    }
}

class MysqlAdapter {}

Sekarang kita memberikan database class ketergantungan daripada itu menciptakan itu sendiri. Kita bahkan bisa menciptakan sebuah metode yang akan menerima argumen dari ketergantungan dan mengatur seperti itu, atau jika $ adaptor properti adalah publik kita bisa mengaturnya secara langsung.

Masalah Kompleks

Jika Anda pernah membaca tentang Dependency Injection maka Anda mungkin telah melihat istilah * “Inversion of Control” * atau * “Ketergantungan Inversi Prinsip” *. Ini adalah masalah kompleks yang Dependency Injection memecahkan.

Inversion of Control

Inversion of Control adalah seperti yang dikatakan, “pembalik kontrol” dari suatu sistem dengan menjaga kontrol organisasi yang sama sekali terpisah dari benda kami. Dalam hal Dependency Injection, ini berarti melonggarkan ketergantungan kita dengan mengendalikan dan instantiating mereka di tempat lain dalam sistem.

Selama bertahun-tahun, kerangka kerja PHP telah mencapai Inversion of Control, namun, pertanyaannya menjadi, bagian mana dari kontrol Anda pembalik, dan di mana? Sebagai contoh, kerangka kerja MVC umumnya akan memberikan objek atau basis pengendali super yang lain pengendali harus memperpanjang untuk mendapatkan akses ke dependensinya. Ini ** adalah ** Inversion of Control, namun, bukannya melonggarkan dependensi, metode ini hanya bergerak mereka.

Injeksi Ketergantungan memungkinkan kita untuk lebih elegan memecahkan masalah ini dengan hanya menyuntikkan dependensi yang kita butuhkan, ketika kita membutuhkan mereka, tanpa perlu untuk setiap dependensi kode keras sama sekali.

Dependency Inversion Principle

Ketergantungan Inversi Prinsip adalah “D” di set SOLID prinsip-prinsip desain berorientasi objek yang menyatakan orang harus

<?php
namespace Database;

class Database
{
    protected $adapter;

    public function __construct(AdapterInterface $adapter)
    {
        $this->adapter = $adapter;
    }
}

interface AdapterInterface {}

class MysqlAdapter implements AdapterInterface {}

Ada beberapa manfaat bagi database class sekarang tergantung pada interface daripada concretion a.

Pertimbangkan bahwa Anda bekerja dalam tim dan adaptor sedang dikerjakan oleh seorang rekan. Dalam contoh pertama kita, kita akan memiliki untuk menunggu rekan dikatakan menyelesaikan adaptor sebelum kita benar bisa mengejek itu untuk tes unit kami. Sekarang bahwa ketergantungan adalah sebuah antarmuka / kontrak kita bisa bahagia mengejek antarmuka yang mengetahui bahwa rekan kami akan membangun adaptor berdasarkan kontrak itu.

Manfaat yang lebih besar untuk metode ini adalah bahwa kode kita sekarang jauh lebih scalable. Jika tahun ke depan kita memutuskan bahwa kita ingin bermigrasi ke berbagai jenis database, kita dapat menulis sebuah adaptor yang mengimplementasikan antarmuka asli dan menyuntikkan bahwa alih-alih, tidak lebih refactoring akan diperlukan seperti yang kita dapat memastikan bahwa adaptor mengikuti kontrak yang ditetapkan oleh antarmuka.

Containers

Hal pertama yang harus Anda mengerti tentang Dependency Injection Wadah adalah bahwa mereka tidak sama dengan Dependency Injection. Sebuah wadah adalah utilitas kenyamanan yang membantu kita menerapkan Dependency Injection, bagaimanapun, mereka dapat dan sering disalahgunakan untuk menerapkan anti-pola, Layanan Lokasi. Penyuntikan wadah DI sebagai Layanan Locator ke kelas Anda dibilang menciptakan ketergantungan keras pada wadah dari ketergantungan yang akan diganti. Hal ini juga membuat kode Anda jauh lebih transparan dan akhirnya sulit untuk menguji.

Kebanyakan kerangka modern memiliki Dependency Injection Kontainer mereka sendiri yang memungkinkan Anda untuk kawat dependensi Anda bersama-sama melalui konfigurasi. Apa ini berarti dalam prakteknya adalah bahwa Anda dapat menulis kode aplikasi yang bersih dan de-digabungkan sebagai kerangka itu dibangun di atas.

Bacaan Lebih Lanjut

Kembali ke atas

Databases

Banyak kali kode PHP Anda akan menggunakan database untuk bertahan informasi . Anda memiliki beberapa pilihan untuk menghubungkan dan berinteraksi dengan database Anda . Pilihan yang dianjurkan until PHP 5.1.0 adalah menggunakan driver asli seperti [ mysql ] [ mysql ] , [ mysqli ] [ mysqli ] , [ pgsql ] [ pgsql ] , dll

Driver asli yang besar jika Anda hanya menggunakan SATU database dalam aplikasi Anda , tetapi jika , misalnya , Anda menggunakan MySQL dan sedikit MSSQL , atau Anda perlu menghubungkan ke database Oracle , maka Anda tidak akan dapat menggunakan driver yang sama . Anda akan perlu belajar API baru untuk masing-masing Database - dan yang bisa konyol .

Sebagai catatan tambahan pada driver asli , ekstensi mysql untuk PHP tidak lagi aktif dalam pembangunan , dan secara resmi ditinggalkan pada PHP 5.5 , yang berarti bahwa itu akan dihapus dalam beberapa rilis berikutnya . Jika Anda menggunakan ` mysql_connect ( ) ` dan ` mysql_query ( ) ` dalam aplikasi Anda maka Anda akan dihadapkan dengan penulisan ulang di beberapa titik bawah line, sehingga pilihan terbaik adalah untuk menggantikan penggunaan mysql dengan mysqli atau PDO dalam aplikasi Anda dalam jadwal pembangunan Anda sendiri sehingga Anda tidak akan terburu-buru nanti . If Anda memulai dari awal maka benar-benar tidak menggunakan ekstensi mysql : menggunakan [ MySQLi extension ] [ mysqli ] , atau menggunakan PDO.

PDO

PDO adalah database perpustakaan koneksi abstraksi - dibangun ke PHP 5.1.0 sejak - yang menyediakan antarmuka umum untuk berbicara dengan banyak database yang berbeda. PDO tidak akan menerjemahkan query SQL atau meniru fitur yang hilang; itu adalah murni untuk menghubungkan ke beberapa jenis database dengan API yang sama.

Lebih penting lagi, `` PDO memungkinkan Anda untuk dengan aman menyuntikkan masukan asing (misalnya ID) ke dalam query SQL Anda tanpa khawatir tentang database serangan injeksi SQL. Ini dimungkinkan dengan pernyataan PDO dan parameter terikat.

Mari kita asumsikan script PHP menerima ID numerik sebagai parameter permintaan. ID ini harus digunakan untuk mengambil catatan pengguna dari database. Ini adalah salah cara untuk melakukan ini:

<?php
$pdo = new PDO('sqlite:users.db');
$pdo->query("SELECT name FROM users WHERE id = " . $_GET['id']); // <-- NO!

Ini adalah kode yang mengerikan. Anda memasukkan parameter permintaan mentah menjadi query SQL. Ini akan membuat Anda hack dalam detak jantung. Bayangkan saja jika seorang hacker lewat di parameter inventif id dengan memanggil URL seperti http://domain.com/?id=1% 3BDELETE + FROM pengguna +. Ini akan mengatur $ _GET ['id'] variabel 1; DELETE FROM pengguna yang akan menghapus semua pengguna Anda! Sebaliknya, Anda harus membersihkan ID input menggunakan PDO terikat parameter.

<?php
$pdo = new PDO('sqlite:users.db');
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); // <-- Automatically sanitized by PDO
$stmt->execute();

Ini adalah kode yang benar. Ini menggunakan parameter terikat pada pernyataan PDO. Ini lolos ID masukan asing sebelum diperkenalkan ke Database mencegah serangan injeksi SQL potensial.

Anda juga harus menyadari bahwa koneksi database menggunakan sumber daya dan itu tidak pernah terdengar-dari memiliki sumber daya habis jika koneksi tidak secara implisit ditutup, namun ini lebih umum dalam bahasa lain. Menggunakan PDO Anda implisit dapat menutup koneksi dengan menghancurkan objek dengan memastikan semua referensi yang tersisa untuk itu akan dihapus, yaitu diatur ke NULL. Jika Anda tidak melakukan ini secara eksplisit, PHP secara otomatis akan menutup koneksi ketika naskah Anda berakhir - kecuali tentu saja Anda menggunakan koneksi persistent.

Abstraction Layers

Banyak kerangka menyediakan lapisan abstraksi mereka sendiri yang mungkin atau mungkin tidak duduk di atas PDO. Ini akan sering meniru fitur untuk satu sistem database yang lain hilang dari yang lain dengan membungkus pertanyaan Anda dalam metode PHP, memberikan Anda abstraksi database sebenarnya. Hal ini tentu saja akan menambah biaya overhead sedikit, tetapi jika Anda sedang membangun sebuah aplikasi portable yang perlu untuk bekerja dengan MySQL, PostgreSQL dan SQLite maka overhead kecil akan sia-sia demi kode kebersihan.

Beberapa lapisan abstraksi telah dibangun menggunakan PSR-0 atau PSR-4 standar namespace sehingga dapat diinstal dalam aplikasi apapun yang Anda suka:

Kembali ke atas

Errors dan Exceptions

Errors

Dalam banyak bahasa pemrograman “pengecualian-berat”, setiap kali ada yang tidak beres pengecualian akan dilempar. ini adalah tentu cara yang layak untuk melakukan hal-hal, tapi PHP adalah bahasa pemrograman “pengecualian-light”. Meskipun tidak memiliki pengecualian dan lebih inti mulai menggunakannya saat bekerja dengan objek, sebagian besar dari PHP itu sendiri akan mencoba untuk menjaga pengolahan terlepas dari apa yang terjadi, kecuali terjadi kesalahan fatal.

Sebagai contoh:

$ php -a
php > echo $foo;
Notice: Undefined variable: foo in php shell code on line 1

Ini hanya kesalahan pemberitahuan, dan PHP akan dengan senang hati melanjutkan. Hal ini dapat membingungkan bagi mereka yang berasal dari “pengecualian-berat” bahasa, karena referensi variabel hilang di Python misalnya akan melemparkan sebuah pengecualian:

$ python
>>> print foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined

Satu-satunya perbedaan yang nyata adalah bahwa Python akan panik atas setiap hal kecil, sehingga pengembang dapat menjadi super yakin setiap masalah potensial atau tepi-kasus tertangkap, sedangkan PHP akan terus pengolahan kecuali sesuatu yang ekstrim terjadi, di mana titik itu akan melemparkan kesalahan dan melaporkannya.

Tingkat Keparahan Kesalahan

PHP memiliki beberapa tingkat keparahan kesalahan. Ketiga jenis yang paling umum dari pesan kesalahan, pemberitahuan dan peringatan. Ini memiliki berbagai tingkat keparahan; E_ERROR, E_NOTICE, dan E_WARNING. Kesalahan kesalahan run-time fatal dan biasanya disebabkan oleh kesalahan dalam kode Anda dan perlu diperbaiki karena mereka akan menyebabkan PHP untuk berhenti mengeksekusi. Peringatan yang kesalahan non-fatal, eksekusi script tidak akan dihentikan. Pemberitahuan adalah pesan penasihat disebabkan oleh kode yang mungkin atau tidak dapat menyebabkan masalah selama eksekusi script, eksekusi tidak dihentikan.

Tipe lain dari pesan kesalahan yang dilaporkan pada waktu kompilasi adalah pesan E_STRICT. Pesan ini digunakan untuk menunjukkan perubahan pada kode Anda untuk membantu memastikan interoperabilitas terbaik dan kompatibilitas maju dengan versi mendatang dari PHP.

Mengubah Perilaku Error Reporting PHP

Error Reporting dapat diubah dengan menggunakan pengaturan PHP dan / atau panggilan fungsi PHP. Menggunakan built in fungsi PHP error_reporting () Anda dapat mengatur tingkat kesalahan selama eksekusi script dengan melewati salah satu konstanta yang telah ditetapkan tingkat kesalahan, artinya jika Anda hanya ingin melihat Peringatan dan Kesalahan - tetapi tidak Pemberitahuan - maka Anda dapat mengkonfigurasi bahwa:

error_reporting(E_ERROR | E_WARNING);

Anda juga dapat mengontrol apakah atau tidak kesalahan ditampilkan ke layar (baik untuk pengembangan) atau disembunyikan, dan login (baik untuk produksi). Untuk informasi lebih lanjut tentang memeriksa Error Reporting bagian ini.

Inline Kesalahan Suppression

Anda juga dapat memberitahu PHP untuk menekan kesalahan tertentu dengan Kesalahan Kontrol Operator @. Anda menempatkan Operator ini pada awal dari sebuah ekspresi, dan kesalahan itu akibat langsung dari ekspresi dibungkam.

echo @$foo['bar'];

Ini akan menampilkan ` $ foo [ ‘ bar ‘ ] ` jika ada , tetapi hanya akan mengembalikan apa-apa batal cetak jika variabel ` $ foo ` atau ` ‘bar’ ` kunci tidak ada. Tanpa operator kontrol kesalahan , ungkapan ini bisa membuat Pemberitahuan ` PHP : Undefined variable : foo ` atau ` Pemberitahuan PHP : Undefined index : bar ` error .

Hal ini mungkin tampak seperti ide yang baik , tetapi ada timbal balik yang tidak diinginkan beberapa . PHP menangani ekspresi menggunakan ` @ ` dengan cara yang kurang performant dari ekspresi tanpa ` @ ` . Optimasi prematur mungkin menjadi akar dari semua argumen pemrograman , tetapi jika kinerja ini terutama penting bagi aplikasi Anda / perpustakaan itu penting untuk memahami implikasi kinerja operator kontrol kesalahan itu .

Kedua , operator kontrol kesalahan sepenuhnya ** ** menelan kesalahan . Kesalahan tidak ditampilkan , dan kesalahan tidak mengirim ke log error . Juga , sistem PHP saham / produksi tidak memiliki cara untuk mematikan operator kontrol kesalahan . Meskipun Anda mungkin benar bahwa kesalahan yang Anda lihat adalah tidak berbahaya , sebuah , kesalahan kurang berbahaya yang berbeda akan sama diam .

Jika ada cara untuk menghindari operator penindasan kesalahan , Anda harus mempertimbangkan itu . Sebagai contoh, kode kita di atas dapat ditulis ulang seperti ini

echo isset($foo['bar']) ? $foo['bar'] : '';

Salah satu contoh di mana penekanan kesalahan mungkin masuk akal adalah di mana fopen () gagal untuk menemukan file untuk memuat. Anda bisa memeriksa untuk keberadaan file sebelum Anda mencoba untuk memuat, tapi jika file akan dihapus setelah cek dan sebelum fopen () (yang mungkin terdengar mustahil, tapi hal ini bisa terjadi) maka fopen () akan mengembalikan false and melempar kesalahan. ini adalah berpotensi sesuatu PHP harus menyelesaikan, tetapi merupakan salah satu kasus di mana penekanan kesalahan mungkin tampak seperti hanya berlaku solusi.

Sebelumnya kami sebutkan tidak ada cara dalam sistem saham PHP untuk mematikan operator kontrol kesalahan. Namun, Xdebug memiliki xdebug.scream pengaturan inisial yang akan menonaktifkan operator kontrol kesalahan. Anda dapat mengatur ini melalui file Anda php.ini dengan berikut.

xdebug.scream = On

Anda juga dapat mengatur nilai ini pada saat runtime dengan `` ini_set fungsi

ini_set('xdebug.scream', '1')

The “[Berteriak]” ekstensi PHP menawarkan fungsionalitas mirip dengan Xdebug, meskipun inisial pengaturan Scream bernama scream.enabled.

Ini sangat berguna bila Anda debugging kode dan menduga kesalahan informatif ditekan. Gunakan menjerit dengan hati-hati, dan sebagai alat debugging sementara. Ada banyak kode perpustakaan PHP yang mungkin tidak bekerja dengan operator kontrol kesalahan dinonaktifkan.

ErrorException

PHP sangat mampu menjadi bahasa pemrograman “pengecualian-berat”, dan hanya membutuhkan beberapa baris kode untuk membuat saklar. Pada dasarnya Anda dapat membuang “kesalahan” Anda sebagai “pengecualian” menggunakan ErrorException class, yang memperpanjang `` Exception class.

Ini adalah praktek umum yang diterapkan oleh sejumlah besar kerangka modern seperti Symfony dan Laravel. Secara default Laravel akan menampilkan semua kesalahan sebagai pengecualian menggunakan Whoops! Paket jika app.debug saklar dihidupkan, maka menyembunyikan mereka jika saklar dimatikan.

Dengan melempar kesalahan sebagai pengecualian dalam pembangunan Anda dapat menangani mereka lebih baik dari hasil yang biasa, dan jika Anda melihat pengecualian selama pengembangan Anda bisa membungkusnya dalam sebuah pernyataan menangkap dengan petunjuk khusus tentang bagaimana menangani situasi. Setiap pengecualian Anda menangkap langsung membuat aplikasi Anda yang sedikit lebih kuat.

Informasi lebih lanjut tentang hal ini dan rincian tentang bagaimana menggunakan ErrorException dengan penanganan error dapat ditemukan diErrorException Class.

Exceptions

Pengecualian adalah bagian standar dari kebanyakan bahasa pemrograman populer, tetapi mereka sering diabaikan oleh programmer PHP . Bahasa seperti Ruby sangat Exception berat , sehingga setiap kali sesuatu yang tidak beres seperti permintaan HTTP gagal , atau query DB tidak beres , atau bahkan jika aset gambar tidak dapat ditemukan , Ruby ( atau permata yang digunakan ) akan memunculkan pengecualian ke layar berarti Anda langsung tahu ada kesalahan .

PHP itu sendiri cukup longgar dengan hal ini , dan panggilan untuk ` file_get_contents ( ) ` akan biasanya hanya mendapatkan Anda ` PALSU ` dan peringatan . Banyak kerangka PHP yang lebih tua seperti CodeIgniter hanya akan kembali palsu , log pesan ke log milik mereka dan mungkin membiarkan Anda menggunakan metode seperti ` $ this - > meng-upload - > get_error ( ) ` untuk melihat apa yang salah . Masalahnya di sini adalah bahwa Anda harus pergi mencari kesalahan dan memeriksa dokumentasi untuk melihat apa metode kesalahan adalah untuk kelas ini , bukan karena itu dibuat sangat jelas .

Masalah lain adalah ketika kelas secara otomatis melempar kesalahan ke layar dan keluar dari proses. Ketika Anda melakukan ini, Anda menghentikan pengembang lain dari mampu secara dinamis menangani kesalahan itu . Pengecualian harus dibuang untuk membuat pengembang menyadari kesalahan ; mereka kemudian dapat memilih cara untuk menangani hal ini . mis :

<?php
$email = new Fuel\Email;
$email->subject('My Subject');
$email->body('How the heck are you?');
$email->to('guy@example.com', 'Some Guy');

try
{
    $email->send();
}
catch(Fuel\Email\ValidationFailedException $e)
{
    // The validation failed
}
catch(Fuel\Email\SendingFailedException $e)
{
    // The driver could not send the email
}
finally
{
    // Executed regardless of whether an exception has been thrown, and before normal execution resumes
}

SPL Exceptions

Generik Exception kelas menyediakan sangat sedikit konteks debugging untuk pengembang; Namun, untuk memperbaiki hal ini, adalah mungkin untuk menciptakan Exception jenis khusus oleh sub-klasifikasi generik `` Exception class:

<?php
class ValidationException extends Exception {}

Ini berarti Anda dapat menambahkan beberapa blok catch dan menangani Pengecualian berbeda berbeda. Hal ini dapat menyebabkan penciptaan banyak </ em> Pengecualian kustom, beberapa di antaranya bisa dihindari dengan menggunakan Pengecualian SPL disediakan dalam SPL extension.

Jika misalnya Anda menggunakan __call () Metode Sihir dan metode yang tidak valid diminta maka bukannya melemparkan standar Exception yang tidak jelas, atau membuat Exception kustom hanya untuk itu, Anda hanya bisa melempar BadMethodCallException baru;.

Kembali ke atas

Keamanan

Keamanan Aplikasi Web

Ada orang jahat siap dan bersedia untuk mengeksploitasi aplikasi web Anda. Adalah penting bahwa Anda mengambil tindakan yang diperlukan untuk mengeraskan keamanan aplikasi web Anda. Untungnya, orang-orang baik di Open Web Application Security Project (OWASP) telah mengumpulkan daftar lengkap dari isu-isu keamanan yang telah diketahui dan metode untuk melindungi diri terhadap mereka. Ini adalah harus dibaca bagi pengembang sadar keamanan.

Password Hashing

Akhirnya semua orang membangun aplikasi PHP yang bergantung pada pengguna login. Username dan password yang disimpan dalam database dan kemudian digunakan untuk autentikasi pengguna pada saat login.

Adalah penting bahwa Anda benar hash password sebelum menyimpannya. Sandi hashing adalah ireversibel, fungsi salah satu cara yang dilakukan terhadap password user. Ini menghasilkan string tetap-panjang yang tidak memungkinkan untuk bisa terbalik. Ini berarti Anda dapat membandingkan hash terhadap yang lain untuk menentukan apakah mereka berdua datang dari sumber string yang sama, tetapi Anda tidak bisa menentukan string asli. Jika password tidak hash dan database Anda diakses oleh pihak ketiga yang tidak sah, semua akun pengguna sekarang dikompromikan. Beberapa pengguna mungkin (sayangnya) menggunakan password yang sama untuk layanan lainnya. Oleh karena itu, penting untuk mengambil keamanan serius.

Hashing passwords dengan password_hash

Dalam PHP 5.5 password_hash diperkenalkan. Pada saat ini adalah menggunakan BCrypt, algoritma terkuat saat ini didukung oleh PHP. Ini akan diperbarui di masa depan untuk mendukung lebih algoritma yang diperlukan sekalipun. The password_compat perpustakaan diciptakan untuk menyediakan kompatibilitas ke depan untuk PHP> = 5.3.7.

Di bawah ini kami hash string, dan kemudian memeriksa hash terhadap string baru. Karena kami dua string sumber yang berbeda (‘rahasia-password’ vs ‘buruk-password’) login ini akan gagal.

<?php
                      
require 'password.php';

$passwordHash = password_hash('secret-password', PASSWORD_DEFAULT);

if (password_verify('bad-password', $passwordHash)) {
    // Correct Password
} else {
    // Wrong password
}

Data Filtering

Tidak pernah ( pernah) kepercayaan masukan asing diperkenalkan ke kode PHP Anda . Selalu membersihkan dan memvalidasi masukan asing sebelum menggunakannya dalam kode . The ` filter_var ` dan ` filter_input ` fungsi dapat membersihkan teks dan memvalidasi format teks ( misalnya alamat email ) .

Masukan asing bisa apa saja : ` $ _GET ` dan ` $ _POST ` input data form, beberapa nilai dalam ` $ _SERVER ` superglobal , dan HTTP request tubuh melalui ` fopen ( ‘ php :/ / input’ , ‘ r ‘ ) ` . Ingat , masukan asing tidak terbatas untuk membentuk data yang diajukan oleh pengguna . Upload dan download file , nilai session , data cookie , dan data dari layanan web pihak ketiga adalah input asing , juga.

Sedangkan data asing dapat disimpan , dikombinasikan , dan diakses kemudian, masih masukan asing . setiap kali Anda memproses , output, menggabungkan , atau menyertakan data dalam kode Anda , tanyakan pada diri Anda apakah Data disaring dengan baik dan hal itu dapat dipercaya .

Data dapat filtered berbeda berdasarkan tujuannya . Misalnya, ketika masukan asing tanpa filter dilewatkan menjadi output halaman HTML , dapat mengeksekusi HTML dan JavaScript di situs Anda! Hal ini dikenal sebagai Cross- Site Scripting ( XSS ) dan bisa menjadi serangan yang sangat berbahaya . Salah satu cara untuk menghindari XSS adalah untuk membersihkan semua user-generated data sebelum keluaran ke halaman Anda dengan menghapus tag HTML dengan ` ` strip_tags fungsi atau melarikan diri karakter dengan makna khusus menjadi entitas HTML masing-masing dengan ` htmlentities ` atau ` fungsi htmlspecialchars ` .

Contoh lain adalah lewat opsi akan dieksekusi pada baris perintah . Ini bisa sangat berbahaya ( dan biasanya ide yang buruk ) , tetapi Anda dapat menggunakan built -in ` escapeshellarg ` berfungsi untuk membersihkan dieksekusi argumen perintah itu .

Salah satu contoh terakhir adalah menerima masukan asing untuk menentukan file untuk memuat dari filesystem . Hal ini dapat dimanfaatkan oleh mengubah nama file ke path file . Anda harus menghapus “ / “ , “ .. / “ , [ nol byte ] [ 6 ] , atau karakter lain dari path file sehingga tidak bisa memuat file tersembunyi , non - publik , atau sensitif .

Sanitization

Menghapus Sanitasi (atau lolos) ilegal atau tidak aman karakter dari input asing.

Misalnya, Anda harus membersihkan masukan asing sebelum termasuk input dalam HTML atau memasukkan itu menjadi query SQL mentah. Bila Anda menggunakan parameter terikat dengan [PDO] (# database), maka akan membersihkan masukan untuk Anda.

Kadang-kadang diperlukan untuk memungkinkan beberapa tag HTML aman di input ketika termasuk dalam HTML halaman. Hal ini sangat sulit untuk dilakukan dan banyak menghindarinya dengan menggunakan format lebih terbatas lainnya seperti Penurunan harga atau BBCode, meskipun membolehkan akses perpustakaan seperti [HTML Purifier] [html-pembersih] ada untuk alasan ini.

Lihat Sanitization Filters

Validation

Validasi memastikan bahwa masukan asing adalah apa yang Anda harapkan. Sebagai contoh, Anda mungkin ingin untuk memvalidasi alamat email, nomor telepon, atau usia saat memproses pengajuan pendaftaran.

Lihat Validation Filters

File Konfigurasi

Ketika membuat file konfigurasi untuk aplikasi Anda, praktik terbaik merekomendasikan bahwa salah satu metode berikut harus diikuti:

Register Globals

** CATATAN: ** Pada PHP 5.4.0 yang register_globals pengaturan telah dihapus dan tak dapat lagi digunakan. Ini hanya disertakan sebagai peringatan bagi siapa pun dalam proses upgrade aplikasi warisan.

Bila diaktifkan, register_globals pengaturan konfigurasi yang membuat beberapa jenis variabel (termasuk yang dari $ _POST, $ _GET Dan $ _REQUEST) tersedia dalam lingkup global aplikasi Anda. Hal ini dapat dengan mudah menyebabkan masalah keamanan sebagai aplikasi Anda tidak dapat secara efektif mengatakan di mana data berasal.

Sebagai contoh: $ _GET ['foo'] akan tersedia melalui $ foo, yang dapat menimpa variabel yang belum dideklarasikan. Jika Anda menggunakan PHP <5.4.0 __ membuat sure__ bahwa register_globals adalah __ off__.

Error Reporting

Error logging dapat berguna dalam menemukan titik masalah dalam aplikasi Anda, tetapi juga dapat mengekspos informasi tentang struktur aplikasi Anda ke dunia luar. Untuk secara efektif melindungi aplikasi Anda dari masalah yang bisa disebabkan oleh output dari pesan-pesan ini, Anda perlu mengkonfigurasi server Anda berbeda dalam pembangunan dibandingkan produksi (hidup).

Development

Untuk menampilkan setiap kesalahan yang mungkin selama pengembangan </ strong>, mengkonfigurasi pengaturan berikut dalam php.ini:

display_errors = On
display_startup_errors = On
error_reporting = -1
log_errors = On

Passing in the value -1 will show every possible error, even when new levels and constants are added in future PHP versions. The E_ALL constant also behaves this way as of PHP 5.4. - php.net

Tingkat E_STRICT error konstan diperkenalkan pada 5.3.0 dan tidak bagian dari E_ALL, namun menjadi bagian dari E_ALL dalam 5.4.0. Apa artinya ini? Dalam hal pelaporan setiap kesalahan yang mungkin di versi 5.3 itu berarti Anda harus menggunakan salah -1 atau E_ALL | E_STRICT.

** Pelaporan setiap kemungkinan kesalahan dengan versi PHP **

Production

Untuk menyembunyikan kesalahan pada produksi Anda </ strong> lingkungan, mengkonfigurasi php.ini sebagai:

display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL
log_errors = On

Dengan pengaturan ini dalam produksi, kesalahan masih akan login ke error log untuk server web, tetapi tidak akan ditampilkan kepada pengguna. Untuk informasi lebih lanjut tentang pengaturan ini, lihat manual PHP:

Kembali ke atas

Testing

Menulis tes otomatis untuk kode PHP Anda dianggap sebagai praktek terbaik dan dapat menyebabkan tegap aplikasi. Tes otomatis adalah alat yang hebat untuk memastikan aplikasi Anda tidak pecah ketika Anda membuat perubahan atau menambahkan fungsi baru dan tidak boleh diabaikan.

Ada beberapa jenis alat pengujian (atau kerangka kerja) yang tersedia untuk PHP, yang menggunakan pendekatan yang berbeda - yang semuanya berusaha untuk menghindari pengujian manual dan kebutuhan untuk besar Tim Quality Assurance, hanya untuk membuat perubahan terbaru yakin tidak mematahkan fungsi yang ada.

Test Driven Development

From Wikipedia:

Test-driven development (TDD) is a software development process that relies on the repetition of a very short development cycle: first the developer writes a failing automated test case that defines a desired improvement or new function, then produces code to pass that test and finally refactors the new code to acceptable standards. Kent Beck, who is credited with having developed or ‘rediscovered’ the technique, stated in 2003 that TDD encourages simple designs and inspires confidence

Ada beberapa jenis pengujian yang dapat Anda lakukan untuk aplikasi Anda

Unit Testing

Unit Testing adalah pendekatan pemrograman untuk memastikan fungsi , kelas dan metode bekerja sebagai diharapkan , dari titik Anda membangun mereka semua jalan melalui siklus pengembangan . dengan memeriksa nilai-nilai akan masuk dan keluar dari berbagai fungsi dan metode , Anda dapat memastikan logika internal bekerja dengan benar . Dengan menggunakan Dependency Injection dan membangun “ tiruan “ kelas dan bertopik Anda dapat memverifikasi bahwa dependensi yang benar digunakan untuk cakupan tes lebih baik .

Ketika Anda membuat sebuah kelas atau fungsi Anda harus membuat unit test untuk setiap perilaku itu harus memiliki . Pada tingkat yang sangat dasar Anda harus membuat kesalahan yakin jika Anda mengirim argumen buruk dan pastikan bekerja jika Anda mengirim argumen yang valid . Hal ini akan membantu memastikan bahwa ketika Anda membuat perubahan ke kelas ini atau fungsi nanti dalam pengembangan siklus yang fungsi lama terus bekerja seperti yang diharapkan . Satu-satunya alternatif untuk ini akan menjadi var_dump ( ) dalam test.php , yang ada cara untuk membangun sebuah aplikasi - besar atau kecil .

Penggunaan lainnya untuk tes unit memberikan kontribusi ke open source . Jika Anda dapat menulis sebuah tes yang menunjukkan rusak fungsi ( yaitu gagal ) , kemudian memperbaikinya , dan menunjukkan tes passing , patch jauh lebih mungkin untuk dapat diterima . jika Anda menjalankan sebuah proyek yang menerima permintaan menarik maka Anda harus menunjukkan ini sebagai suatu kebutuhan.

[ PHPUnit ] ( http://phpunit.de ) adalah kerangka pengujian de - facto untuk menulis unit test untuk PHP aplikasi , tetapi ada beberapa alternatif

Integration Testing

From Wikipedia:

Integration testing (sometimes called Integration and Testing, abbreviated “I&T”) is the phase in software testing in which individual software modules are combined and tested as a group. It occurs after unit testing and before validation testing. Integration testing takes as its input modules that have been unit tested, groups them in larger aggregates, applies tests defined in an integration test plan to those aggregates, and delivers as its output the integrated system ready for system testing.

Banyak alat yang sama yang dapat digunakan untuk unit testing dapat digunakan untuk pengujian integrasi sebanyak prinsip-prinsip yang sama digunakan.

Functional Testing

Kadang-kadang juga dikenal sebagai pengujian penerimaan, uji fungsional terdiri dari menggunakan alat-alat untuk membuat otomatis tes yang benar-benar menggunakan aplikasi Anda, bukan hanya memverifikasi bahwa unit individu kode berperilaku benar dan bahwa unit individu dapat berbicara satu sama lain dengan benar. Alat-alat ini biasanya bekerja menggunakan real data dan simulasi pengguna yang sebenarnya dari aplikasi.

Functional Testing Tools

Behavior Driven Development

Ada dua jenis Perilaku-Driven Development (BDD): SpecBDD dan StoryBDD. SpecBDD berfokus pada perilaku teknis kode, sementara StoryBDD berfokus pada bisnis atau fitur perilaku atau interaksi. PHP memiliki kerangka kerja untuk kedua jenis BDD.

Dengan StoryBDD, Anda menulis cerita terbaca-manusia yang menggambarkan perilaku aplikasi Anda. cerita-cerita ini kemudian dapat dijalankan sebagai tes yang sebenarnya terhadap aplikasi Anda. Kerangka yang digunakan dalam aplikasi PHP untuk StoryBDD adalah Behat, yang terinspirasi oleh [Ketimun] (http://cukes.info/) proyek Ruby dan menerapkan DSL Gherkin untuk menggambarkan perilaku fitur.

Dengan SpecBDD, Anda menulis spesifikasi yang menggambarkan bagaimana kode Anda yang sebenarnya harus bersikap. Alih-alih pengujian fungsi atau metode, Anda gambarkan bagaimana fungsi atau metode harus bersikap. PHP menawarkan kerangka PHPSpec untuk tujuan ini. Kerangka kerja ini terinspirasi oleh [RSpec proyek] (http://rspec.info/) untuk Ruby.

Complementary Testing Tools

Selain pengujian individu dan kerangka perilaku didorong, ada juga sejumlah kerangka generik dan perpustakaan pembantu berguna untuk setiap pendekatan yang lebih disukai diambil.

Kembali ke atas

Servers dan Deployment

Aplikasi PHP dapat digunakan dan dijalankan pada server web produksi dalam beberapa cara.

Platform as a Service (PaaS)

PaaS menyediakan sistem dan arsitektur jaringan yang diperlukan untuk menjalankan aplikasi PHP di web. Ini berarti sedikit atau tidak ada konfigurasi untuk meluncurkan aplikasi PHP atau kerangka kerja PHP.

Baru-baru ini PaaS telah menjadi metode populer untuk menyebarkan, hosting, dan skala aplikasi PHP dari semua ukuran. Anda dapat menemukan daftar [PHP PaaS “Platform sebagai Service” penyedia] (# php_paas_providers) di kami [sumber section] (# sumber daya).

Virtual atau Dedicated Servers

Jika Anda merasa nyaman dengan sistem administrasi, atau tertarik untuk belajar itu, server virtual atau dedicated memberikan kontrol penuh terhadap lingkungan produksi aplikasi Anda.

nginx dan PHP-FPM

PHP, PHP melalui built-in FastCGI Process Manager (FPM), pasangan benar-benar baik dengan [nginx] (http://nginx.org), yang merupakan ringan, kinerja tinggi server web. Ini menggunakan memori kurang dari Apache dan lebih baik dapat menangani permintaan lebih bersamaan. Hal ini sangat penting pada server virtual yang tidak memiliki banyak memori untuk cadangan.

Apache dan PHP

PHP dan Apache memiliki sejarah panjang bersama-sama . Apache adalah liar dikonfigurasi dan memiliki banyak tersedia [ modul ] ( http://httpd.apache.org/docs/2.4/mod/ ) untuk memperluas fungsi . Ini adalah pilihan populer untuk server bersama dan setup yang mudah untuk kerangka kerja PHP dan aplikasi open source seperti WordPress . Sayangnya , Apache menggunakan sumber daya lebih dari nginx secara default dan tidak dapat menangani banyak pengunjung pada saat yang sama .

Apache memiliki beberapa konfigurasi yang mungkin untuk menjalankan PHP . Yang paling umum dan paling mudah untuk setup adalah [ prefork MPM ] ( http://httpd.apache.org/docs/2.4/mod/prefork.html ) dengan mod_php5 . Meskipun bukan yang paling efisien memori , itu adalah yang paling sederhana untuk mendapatkan kerja dan digunakan. Ini mungkin adalah pilihan terbaik jika Anda tidak ingin menggali terlalu dalam ke aspek administrasi server . Catatan bahwa jika Anda menggunakan mod_php5 Anda harus menggunakan prefork MPM .

Atau, jika Anda ingin memeras lebih banyak kinerja dan stabilitas dari Apache maka Anda dapat mengambil keuntungan dari sistem FPM sama seperti nginx dan menjalankan [ pekerja MPM ] ( http://httpd.apache.org/docs/2.4/mod/ worker.html ) atau [ event MPM ] ( http://httpd.apache.org/docs/2.4/mod/event.html ) dengan mod_fastcgi atau mod_fcgid . Konfigurasi ini akan secara signifikan lebih banyak memori efisien dan jauh lebih cepat tetapi lebih banyak pekerjaan untuk mengatur .

Shared Servers

PHP telah berbagi server untuk berterima kasih untuk popularitas. Sulit untuk menemukan host tanpa PHP terinstal, tapi pastikan itu versi terbaru. Shared server memungkinkan Anda dan pengembang lain untuk menyebarkan website untuk mesin tunggal. Terbalik untuk ini adalah bahwa ia telah menjadi komoditas murah. The downside adalah bahwa Anda tidak pernah tahu apa jenis keributan penyewa tetangga Anda akan menciptakan; memuat down server atau membuka lubang keamanan adalah kekhawatiran utama. Jika anggaran proyek anda mampu untuk menghindari server bersama Anda harus.

Building dan Deploying

Jika Anda menemukan diri Anda melakukan petunjuk basis data perubahan skema atau menjalankan tes secara manual sebelum memperbarui file Anda (manual), berpikir dua kali! Dengan setiap tugas petunjuk tambahan yang diperlukan untuk menyebarkan versi baru dari aplikasi Anda, peluang untuk kesalahan fatal meningkat. Apakah Anda sedang berhadapan dengan update sederhana, proses membangun komprehensif atau bahkan strategi integrasi berkesinambungan, [membangun otomatisasi] (http://en.wikipedia.org/wiki/Build_automation) adalah Anda teman.

Di antara tugas-tugas Anda mungkin ingin untuk mengotomatisasi adalah:

Build Automation Tools

Membangun alat dapat digambarkan sebagai kumpulan skrip yang menangani tugas-tugas umum dari penyebaran perangkat lunak . membangun alat bukan merupakan bagian dari perangkat lunak Anda , itu bekerja pada perangkat lunak Anda dari ‘ luar ‘ .

Ada banyak tools open source yang tersedia untuk membantu Anda dengan membangun otomatisasi , beberapa ditulis dalam PHP yang lain tidak . Hal ini seharusnya tidak menghambat Anda dari menggunakan mereka , jika mereka lebih cocok untuk pekerjaan tertentu . Berikut adalah beberapa contoh :

[ Phing ] ( http://www.phing.info/ ) adalah cara termudah untuk memulai dengan penyebaran otomatis di dunia PHP . dengan Phing Anda dapat mengontrol kemasan , penyebaran atau proses pengujian dari dalam sederhana membangun file XML . Phing (yang didasarkan pada [ Apache Ant ] ( http://ant.apache.org/ ) ) menyediakan kaya set tugas biasanya diperlukan untuk menginstal atau memperbarui aplikasi web dan dapat diperpanjang dengan tugas-tugas tambahan lain , yang ditulis dalam PHP .

[ Capistrano ] ( https://github.com/capistrano/capistrano/wiki ) adalah sistem untuk * menengah hingga lanjutan programmer * untuk mengeksekusi perintah dengan cara yang terstruktur berulang pada satu atau lebih mesin remote . Hal ini pra - dikonfigurasi untuk menyebarkan Ruby on Rails aplikasi , namun orang ** berhasil menyebarkan sistem PHP ** dengan itu . Keberhasilan penggunaan Capistrano tergantung pada pengetahuan tentang Ruby dan Rake .

Posting blog dave Gardner [ PHP Deployment dengan Capistrano ] ( http://www.davegardner.me.uk/blog/2012/02/13/php-deployment-with-capistrano/ ) adalah titik awal yang baik untuk pengembang PHP tertarik Capistrano .

[ Chef ] ( http://www.opscode.com/chef/ ) lebih dari kerangka penyebaran , itu adalah sistem berbasis Ruby sangat kuat kerangka integrasi yang tidak hanya menyebarkan aplikasi Anda, tetapi dapat membangun lingkungan server seluruh atau kotak virtual.

Sumber daya koki untuk pengembang PHP :

Bacaan lebih lanjut :

Continuous Integration

Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily — leading to multiple integrations per day. Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly.

– Martin Fowler

Ada berbagai cara untuk menerapkan integrasi berkesinambungan untuk PHP. Baru-baru ini [Travis CI] (https://travis-ci.org/) memiliki melakukan pekerjaan yang besar membuat integrasi berkesinambungan kenyataan bahkan untuk proyek-proyek kecil. Travis CI adalah host kontinyu layanan integrasi untuk komunitas open source. Hal ini terintegrasi dengan GitHub dan menawarkan dukungan kelas pertama bagi banyak bahasa termasuk PHP.

Bacaan lebih lanjut:

Kembali ke atas

Caching

PHP cukup cepat dengan sendirinya, namun kemacetan dapat muncul ketika Anda membuat koneksi remote, load file, dll Untungnya, ada berbagai alat yang tersedia untuk mempercepat bagian-bagian tertentu dari aplikasi Anda, atau mengurangi jumlah kali ini berbagai tugas memakan waktu perlu menjalankan.

Bytecode Cache

Bila file PHP dijalankan , di bawah tenda itu pertama kali dikompilasi untuk bytecode ( juga dikenal sebagai opcode ) dan , hanya kemudian , bytecode dijalankan . Jika sebuah file PHP tidak diubah , bytecode akan selalu sama . Ini berarti bahwa langkah kompilasi adalah pemborosan sumber daya CPU .

Di sinilah Bytecode Cache masuk Ini mencegah kompilasi berlebihan dengan menyimpan bytecode dalam memori dan menggunakan kembali pada panggilan berturut-turut . Menyiapkan bytecode cache hitungan menit , dan aplikasi Anda akan mempercepat secara signifikan . Ada benar-benar ada alasan untuk tidak menggunakannya .

Pada PHP 5.5 , ada cache bytecode built -in yang disebut [ OPcache ] ( http://php.net/manual/en/book.opcache.php ) . ini adalah juga tersedia untuk versi sebelumnya .

Lain populer bytecode cache adalah :

Object Caching

Ada saat-saat itu dapat bermanfaat untuk cache objek individu dalam kode Anda , seperti dengan data yang mahal untuk mendapatkan atau database panggilan di mana hasilnya tidak mungkin berubah . Anda dapat menggunakan software object caching untuk menahan ini potongan data dalam memori untuk akses yang sangat cepat di kemudian hari . Jika Anda menyimpan barang-barang ini untuk menyimpan data setelah Anda mengambil mereka , kemudian menarik mereka langsung dari cache untuk permintaan berikut , Anda bisa mendapatkan peningkatan yang signifikan dalam kinerja serta mengurangi beban pada server database Anda .

Banyak solusi bytecode caching populer membiarkan Anda cache data kustom juga, jadi ada lebih banyak alasan untuk mengambil keuntungan dari mereka . APCu , XCache , dan WinCache semua menyediakan API untuk menyimpan data dari kode PHP Anda ke cache memori mereka .

Objek memori sistem caching yang paling sering digunakan adalah APCu dan memcached . APCu adalah pilihan yang sangat baik untuk objek caching , itu termasuk API sederhana untuk menambahkan data Anda sendiri ke cache memory dan sangat mudah untuk setup dan menggunakan . itu satu batasan nyata APCu adalah bahwa hal itu terikat ke server itu diinstal pada . Memcached di sisi lain dipasang sebagai layanan terpisah dan dapat diakses di seluruh jaringan , yang berarti bahwa Anda dapat menyimpan objek dalam data yang hyper-fast toko di lokasi pusat dan sistem yang berbeda dapat menarik dari itu .

Perhatikan bahwa ketika menjalankan PHP sebagai ( Cepat - ) aplikasi CGI dalam server Web Anda, setiap proses PHP akan memiliki sendiri cache, yaitu APCu data tidak dibagi antara proses kerja Anda . Dalam kasus ini , Anda mungkin ingin mempertimbangkan untuk menggunakan memcached sebaliknya, karena tidak terikat dengan proses PHP .

Dalam konfigurasi jaringan APCu biasanya akan mengungguli memcached dalam hal kecepatan akses , tapi memcached akan dapat untuk meningkatkan lebih cepat dan lebih lanjut . Jika Anda tidak berharap untuk memiliki beberapa server menjalankan aplikasi Anda , atau tidak perlu fitur tambahan yang memcached penawaran maka APCu mungkin pilihan terbaik Anda untuk objek caching .

Contoh logika menggunakan APCu :

<?php
// check if there is data saved as 'expensive_data' in cache
$data = apc_fetch('expensive_data');
if ($data === false) {
    // data is not in cache; save result of expensive call for later use
    apc_add('expensive_data', $data = get_expensive_data());
}

print_r($data);

Perhatikan bahwa sebelum PHP 5.5, APC menyediakan kedua cache objek dan cache bytecode. APCu adalah sebuah proyek untuk membawa APC object cache PHP 5.5 +, karena PHP sekarang memiliki cache bytecode built-in (OPcache).

Learn more about popular object caching systems:

Kembali ke atas

Sumber-Sumber

Sumber

Orang-Orang yang perlu di-Follow

Mentoring

PHP PaaS Providers

Frameworks

Daripada menemukan kembali roda , banyak pengembang PHP menggunakan kerangka kerja untuk membangun aplikasi web . Kerangka abstrak pergi banyak keprihatinan tingkat rendah dan memberikan membantu, mudah digunakan antarmuka untuk menyelesaikan tugas-tugas umum .

Anda tidak perlu menggunakan kerangka kerja untuk setiap proyek . PHP kadang-kadang polos adalah cara yang tepat untuk pergi , tetapi jika Anda memerlukan kerangka maka ada tiga jenis utama yang tersedia :

Micro - kerangka dasarnya pembungkus untuk rute permintaan HTTP ke callback , controller, metode , dll secepat mungkin , dan kadang-kadang datang dengan perpustakaan beberapa tambahan untuk membantu pembangunan seperti pembungkus database dasar dan sejenisnya . Mereka jelas digunakan untuk membangun layanan HTTP terpencil .

Banyak kerangka menambahkan sejumlah besar fitur di atas dari apa yang tersedia dalam mikro - kerangka dan ini dikenal Full- Stack Frameworks . Ini sering datang dibundel dengan ORMs , paket Authentication , dll

Kerangka kerja berbasis komponen adalah koleksi khusus dan single- tujuan perpustakaan . Kerangka berbasis komponen yang berbeda dapat digunakan bersama-sama untuk membuat mikro atau kerangka kerja full- stack.

Components

Seperti disebutkan di atas “Komponen” adalah pendekatan lain untuk tujuan bersama untuk menciptakan, mendistribusikan dan mengimplementasikan kode bersama. berbagai repositori komponen yang ada, dua utama yaitu:

Kedua repositori ini memiliki alat baris perintah yang terkait dengan mereka untuk membantu instalasi dan upgrade proses, dan telah dijelaskan secara lebih rinci dalam [Manajemen Ketergantungan] bagian.

Ada juga kerangka kerja berbasis komponen dan komponen-vendor yang menawarkan tidak ada kerangka kerja sama sekali. Proyek-proyek ini memberikan sumber lain dari paket yang idealnya memiliki sedikit atau tidak ada ketergantungan pada paket lain, atau kerangka kerja tertentu.

Sebagai contoh, Anda dapat menggunakan [paket FuelPHP Validasi], tanpa perlu menggunakan kerangka FuelPHP itu sendiri.

Laravel’s Illuminate components akan menjadi lebih baik dipisahkan dari kerangka Laravel. Untuk saat ini, hanya komponen terbaik dipisahkan dari kerangka Laravel tercantum above.

Buku

Ada banyak buku sekitar untuk PHP tapi ada pula yang sayangnya sekarang cukup lama dan tidak ada lagi mengandung informasi yang akurat. Bahkan ada buku yang diterbitkan untuk “PHP 6” yang tidak ada, apa pun mungkin tidak sekarang pernah ada karena buku-buku.

Bagian ini bertujuan untuk menjadi dokumen hidup untuk buku-buku yang dianjurkan pada PHP pembangunan pada umumnya. Jika Anda ingin buku Anda yang akan ditambahkan, mengirim PR dan itu akan ditinjau untuk relevansi.

Buku Gratis

Buku Berbayar

Kembali ke atas

Komunitas

Komunitas PHP adalah sebagai beragam seperti itu adalah besar, dan anggotanya siap dan bersedia untuk mendukung programmer PHP baru. Pertimbangkan bergabung dengan grup PHP pengguna lokal Anda (PUG) atau menghadiri konferensi PHP yang lebih besar untuk mempelajari lebih lanjut tentang praktik terbaik yang ditampilkan di sini. Anda bisa nongkrong di IRC di # channel phpc pada irc.freenode.com dan ikuti @ phpc akun twitter. Dapatkan di luar sana, bertemu pengembang baru, belajar topik baru, dan di atas semua, membuat teman baru! Sumber daya masyarakat lainnya termasuk Google+ PHP [komunitas Programmer] [php-programmer-gplus] dan [StackOverflow] [php-jadi].

Baca PHP Events Calendar Official

PHP User Groups

Jika Anda tinggal di kota yang lebih besar, kemungkinan besar ada kelompok pengguna PHP di dekatnya. Meskipun belum ada di sana daftar resmi Pugs, Anda dapat dengan mudah menemukan PUG lokal Anda dengan mencari di Google, Meetup.com atau PHP.ug. Jika Anda tinggal di sebuah kota kecil, mungkin tidak ada seorang PUG lokal; jika itu yang terjadi, mulai satu!

Baca tentang User Groups di PHP Wiki

Konferensi PHP

Komunitas PHP juga menjadi tuan rumah konferensi regional dan nasional yang lebih besar di banyak negara di seluruh dunia. Anggota terkenal dari komunitas PHP biasanya berbicara di acara ini lebih besar, jadi itu adalah kesempatan besar untuk belajar langsung dari para pemimpin industri.

Cari sebuah Konferensi PHP

Kembali ke atas