Fungsi Sendiri untuk Autoload Kelas dalam OOP dalam PHP
Sering kali autoload lalai mungkin tidak memuaskan anda atas sebab-sebab tertentu. Dalam kes sedemikian, anda boleh menulis autoload anda sendiri.
Untuk melakukan ini, ke fungsi spl_autoload_register
perlu menghantar fungsi callback yang ditulis oleh anda
sebagai parameter pertama. Fungsi ini akan dipanggil
apabila PHP mengesan akses kepada
kelas yang belum dimuat. Nama kelas dengan ruang nama
akan dimasukkan ke dalam parameter fungsi ini:
<?php
spl_autoload_register(function($class) {
// dalam pembolehubah $class akan ada nama kelas dengan ruang nama
});
?>
Dan tanggungjawab fungsi adalah berdasarkan nama kelas
untuk memuatkan kelas tersebut melalui require.
Iaitu, di dalam fungsi ini kita perlu menetapkan
peraturan kita sendiri untuk memuatkan kelas, iaitu
persetujuan penamaan kita sendiri.
Mari kita tulis contoh autoload kami sendiri. Sebagai contoh, katakan kita bersetuju bahawa laluan ke fail kelas dari akar tapak web akan sama dengan ruang nama, tetapi dengan mengekalkan kes huruf.
Iaitu, jika kita mempunyai kelas Core\Admin\PageController,
maka laluan kepadanya harus Core/Admin/PageController.php.
Seperti yang anda lihat, untuk menukar nama kelas
dengan ruang namanya, anda hanya perlu menukar
garis miring belakang kepada garis miring ke hadapan, dan kepada nama kelas
tambahkan .php. Mari lakukan ini:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Walau bagaimanapun, kita akan mendapat laluan relatif kepada fail (berbanding akar tapak web). Lebih baik buat laluan mutlak, seperti ini:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Ada satu lagi nuansa. Dalam sistem pengendalian yang berbeza
laluan melalui folder mungkin mempunyai garis miring ke hadapan
atau garis miring belakang. Mari jadikan kod kami bebas
daripada sistem pengendalian. Untuk melakukan ini, gantikan
garis miring ke hadapan untuk pemisah laluan dengan
pemalar DIRECTORY_SEPARATOR,
yang mengandungi garis miring yang betul untuk sistem pengendalian
di mana skrip kami sedang berjalan.
Hasilnya, kami mendapat kod berikut:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Uji fungsi autoload yang saya buat.
Cipta peraturan autoload anda sendiri dan laksanakannya.