Ruang nama
Perubahan terbesar di PHP 5.3 tidak diragukan lagi adalah Namespaces (sebelumnya ada FAQ terkait Namespaces PHP). Hal ini membawa banyak manfaat bagi pengembang PHP, dan masalah penamaan fungsi yang banyak dikritik juga telah terpecahkan.
Kode lebih jelas
Kode umum sebelum 5.3 memerlukan awalan khusus untuk membedakan nama fungsi dan kelasKODE
TEKS PLAIN
:
function MY_wrapper() {}
kelas MY_DB {}
definisikan('MY_CONN_STR', '');
Pembungkus_saya();
MY_DB baru();
SAYA_CONN_STR;
Setelah menggunakan namespace, kodenya terlihat lebih bersih.
KODE
TEKS POLOS
:namespace MY;
pembungkus fungsi() {}
kelas DB {} }
const CONN_STR = '';
gunakan SAYA SEBAGAI SAYA;
pembungkus();
DB baru();
CONN_STR;
Beberapa namespace didefinisikan dalam satu file
Apa yang harus dilakukan jika beberapa namespace didefinisikan dalam sebuah file?
KODE
TEKS POLOS
:namespace LIB;
kelas MySQL {}
kelas SQLite {}
$b = SQLite baru();
ruang nama LIB_EXTRA;
kelas MScrypt {}
$a = MScrypt baru();
var_dump(
dapatkan_kelas($a),
dapatkan_kelas($b)
);
Output dari kode di atas adalah:
KODE
TEKS POLOS
:string(18)"LIB_EXTRA::MScrypt"
string(11)"LIB::SQLite"
PHP adalah bahasa untuk interpretasi dan eksekusi, dan hasil di atas masuk akal.
prioritas ruang nama
Fungsi, kelas, dan konstanta yang ditentukan dalam namespace akan diutamakan, diikuti oleh fungsi global.
KODE
TEKS POLOS
:namespace foo;
fungsi strlen($foo) { kembalikan htmlentitas($foo);
echo strlen("tes"); // tes
echo ::strlen("ujian"); // 4
echo namespace::strlen("tes"); // tes
Persahabatan antara namespace dan autoload
autoload akan mengurai lokasi file kelas berdasarkan nama namespace dan nama kelas. Autoload akan dipicu hanya ketika definisi kelas tidak ditemukan dalam namespace dan __autoload yang ditentukan dalam namespace tidak akan dipanggil secara otomatis.
TEKS POLOS
KODE:
fungsi __autoload($var) { var_dump($var } // LIB::foo
memerlukan "./ns.php"; /*
<?php
ruang nama LIB;
foo baru();
*/
namespace beberapa aksesoris
TEKS POLOS
:
namespace benar-benar::panjang::tidak ada gunanya::verbose::ns;
__NAMESPACE__; // Konstanta ajaib baru yang mewakili nama namespace saat ini
kelas a{}
get_class(new a()); // sungguh::panjang::tidak ada gunanya::verbose::ns::a
gunakan benar-benar::panjang::tanpa tujuan::verbose::ns::a AS b;// Referensi kelas dari namespace Catatan: Konten di sini dikutip dari pdfPengantar Slide PHP 5.3 dan tidak akan diulangi nanti.
Peningkatan kinerja
Kinerja keseluruhan php 5.3 telah meningkat sebesar 5-15%
dan md5() 10-15% lebih cepat
Implementasi tumpukan yang lebih baik di mesin
Konstanta dipindahkan ke memori read-only
Peningkatan proses penanganan pengecualian (penyederhanaan, opcode lebih sedikit)
(memerlukan/sertakan)_sekali perbaikan, hapus duplikat yang terbuka
Ukuran biner & ukuran startup lebih kecil dengan gcc4
Fitur bahasa baru__DIR__
Sebelum versi 5.3, untuk mendapatkan direktori skrip saat ini, diperlukan pemanggilan fungsi
KODE
TEKS POLOS
:echo dirname(__FILE__);
Di 5.3, hanya diperlukan satu konstanta ajaib __DIR__.
KODE
TEKS BIASA
:echo __DIR__; // >= PHP 5.3
?:Operator Kemudahan ?:operator dapat dengan cepat mendapatkan nilai bukan nol dari dua nilai/ekspresi.
KODE
TEKS BIASA
:$a = benar?: salah; // benar
$a = salah?: benar; // benar
$a = "" ?: 1; // 1
$a = 0?: 2; // 2
$a = susunan() ?: susunan(1); // susunan(1);
$a = strlen("") ?: strlen("a"); // 1
__panggilanStatis()
Metode ajaib baru __callStatic ditambahkan. Fungsinya mirip dengan __call, tetapi hanya valid untuk metode statis.
TEKS POLOS
:
class helper {
fungsi statis __callStatic($nama, $args) {
echo $nama.'('.implode(',', $args).')';
}
}
pembantu::tes("foo","bar"); // tes(foo,bar)
Memanggil metode statis secara dinamis. Kombinasi gerakan dan keheningan.
TEKS POLOS
:
class helper {
fungsi statis foo() { echo __METHOD__;
}
$a = "pembantu";
$b = "foo";
$a::$b(); // pembantu::foo
Pengikatan Statis Terlambat
Saya tidak tahu bagaimana menerjemahkannya, mungkin lebih mudah dipahami jika saya meninggalkan teks aslinya. Waktu pemrosesan peristiwa metode statis telah berubah. Dulunya diproses selama kompilasi, tetapi sekarang diproses selama eksekusi.
Sebelum PHP 5.3, kode berikut akan menampilkan A, tapi ini bukan yang kita inginkan. Metode whoami telah didefinisikan ulang di kelas B. Seharusnya menghasilkan output B agar sesuai dengan apa yang kita anggap remeh.
KODETEKS POLOS
:
kelas A {
fungsi statis publik whoami() {
gema __KELAS__;
}
identitas fungsi statis publik() {
diri::whoami();
}
}
kelas B meluas A {
fungsi statis publik whoami() {
gema __KELAS__;
}
}
B::identitas(); // SEBUAH <-- PHP <5.3
Kode berikut menggunakan static::whoami() untuk memanggil metode statis. Setelah PHP 5.3, karena __CLASS__ diproses selama eksekusi, kelas B berhasil ditangkap dalam contoh ini.
TEKS POLOS
:
kelas A {
fungsi statis publik whoami() {
gema __KELAS__;
}
identitas fungsi statis publik() {
statis::whoami();
}
}
kelas B meluas A {
fungsi statis publik whoami() {
gema __KELAS__;
}
}
B::identitas(); // B <-->= PHP 5.3
mysqlnd
Lihat bahwa mysqlnd telah menjadi driver mysql default di PHP 5.3
, tetapi PDO_MySQL belum mendukung mysqlnd. Saat ini, hanya ekstensi mysql(i) yang dapat menggunakan
fitur-fitur baru PHP 5.3 yang diperkenalkan sebelumnya, yang semuanya nyaman bagi pengembang. Berikut adalah fitur yang sangat disukai oleh penyedia web hosting.
Dukungan file ini ditingkatkan
CGI/FastCGI mendukung konfigurasi INI mirip dengan .htaccess. Setiap direktori dapat memiliki pengaturan INI Nama file ini tergantung pada konfigurasi php.ini, tetapi [PATH=/var/www/domain.com], [HOST=www Pengaturan bagian .domain.com] tidak dapat diubah oleh pengguna.
Penanganan kesalahan yang ditingkatkan
Variabel dan konstanta diperbolehkan untuk didefinisikan dalam file ini dan dapat dipanggil langsung di dalam program.
Terlampir adalah contoh file ini
TEKS POLOS
:
# Nama file php.ini yang ditentukan pengguna (.htaccess).
pengguna_ini.namafile=".pengguna.ini"
#Jika Anda ingin menonaktifkan fitur ini, setel ke nilai nol.
pengguna_ini.namafile=
#File php.ini yang ditentukan pengguna Panjang TTL (waktu untuk hidup), satuannya adalah detik, saya memahaminya sebagai waktu kedaluwarsa cache. Standarnya adalah 300 detik
pengguna_ini.cache_ttl=300
[PATH=/var/www/domain.com]
variabel_urutan = GPC
mode_aman =1
[variabel saya]
somevar = "1234"
anothervar = ${somevar}; anothervar == beberapavar
[array ini]
foo[bar]=1
foo[123]=2
foo[]=3