spl_autoload_register()
memungkinkan Anda untuk mendaftarkan banyak fungsi (atau metode statis dari kelas Autoload Anda sendiri) yang akan dimasukkan PHP ke dalam tumpukan / antrian dan memanggil secara berurutan ketika "Kelas baru" dideklarasikan.
Jadi misalnya:
spl_autoload_register('myAutoloader');
function myAutoloader($className)
{
$path = '/path/to/class/';
include $path.$className.'.php';
}
//-------------------------------------
$myClass = new MyClass();
Pada contoh di atas, "MyClass" adalah nama kelas yang Anda coba instantiate, PHP meneruskan nama ini sebagai string spl_autoload_register()
, yang memungkinkan Anda untuk mengambil variabel dan menggunakannya untuk "memasukkan" kelas / file yang sesuai . Akibatnya Anda tidak perlu secara khusus menyertakan kelas itu melalui pernyataan sertakan / memerlukan ...
Cukup panggil saja kelas yang ingin Anda instantiate seperti pada contoh di atas, dan karena Anda mendaftarkan fungsi (via spl_autoload_register()
) Anda sendiri yang akan mencari tahu di mana semua kelas Anda berada, PHP akan menggunakan fungsi itu.
Manfaat menggunakan spl_autoload_register()
adalah tidak seperti __autoload()
Anda tidak perlu menerapkan fungsi pengisian otomatis di setiap file yang Anda buat. spl_autoload_register()
Anda juga dapat mendaftarkan beberapa fungsi pengisian otomatis untuk mempercepat autoloading dan membuatnya lebih mudah.
Contoh:
spl_autoload_register('MyAutoloader::ClassLoader');
spl_autoload_register('MyAutoloader::LibraryLoader');
spl_autoload_register('MyAutoloader::HelperLoader');
spl_autoload_register('MyAutoloader::DatabaseLoader');
class MyAutoloader
{
public static function ClassLoader($className)
{
//your loading logic here
}
public static function LibraryLoader($className)
{
//your loading logic here
}
Sehubungan dengan spl_autoload , manual menyatakan:
Fungsi ini dimaksudkan untuk digunakan sebagai implementasi standar untuk __autoload()
. Jika tidak ada yang ditentukan dan spl_autoload_register()
dipanggil tanpa parameter apa pun maka fungsi ini akan digunakan untuk panggilan selanjutnya __autoload()
.
Dalam istilah yang lebih praktis, jika semua file Anda berada dalam satu direktori dan aplikasi Anda tidak hanya menggunakan file .php, tetapi file konfigurasi khusus dengan ekstensi .inc misalnya, maka salah satu strategi yang dapat Anda gunakan adalah menambahkan direktori Anda yang berisi semua file ke jalur sertakan PHP (via set_include_path()
).
Dan karena Anda juga memerlukan file konfigurasi, Anda akan gunakan spl_autoload_extensions()
untuk membuat daftar ekstensi yang Anda inginkan dari PHP.
Contoh:
set_include_path(get_include_path().PATH_SEPARATOR.'path/to/my/directory/');
spl_autoload_extensions('.php, .inc');
spl_autoload_register();
Karena spl_autoload adalah implementasi default __autoload()
metode sulap, PHP akan memanggil spl_autoload ketika Anda mencoba dan membuat instance kelas baru.
Semoga ini membantu...
spl_autoload_register()
(dan__autoload()
secara umum) bahwa itu memuat malas termasuk file / kelas? Ini tersirat oleh jawabannya, tetapi tidak secara eksplisit dinyatakan. Bagi saya, ini adalah informasi penting yang sempurna untuk dimasukkan dalam jawaban Anda! :)Sejak PHP 5.3, Anda dapat menggunakan
spl_autoload_register()
namespaces, yang berarti bahwa Anda dapat mengatur proyek Anda dan secara otomatis memuat kelas php Anda tanpa perlu atau menyertakan dan tanpa mendefinisikan ulang suatu__autoload()
fungsi.Untuk menunjukkan perilaku ini, cukup buat file bernama index.php:
Kemudian buat folder bernama Main yang terletak tepat di sebelah file index.php. Terakhir, buat file bernama Application.php yang terletak di Main dan tempel kode berikut ke dalamnya:
sumber
spl_autoload_register()
implementasi default tidak dapat menemukan kelas yang diwariskan. Jadi menggunakan default, file huruf kecil dan direktori yang mencerminkan jalur namespace, semuanya berfungsi dengan baik kecuali saya memiliki kelas yang memperluas kelas lain (induk). PHP kemudian melempar kesalahan yang tidak dapat menemukan kelas induk itu, bahkan mereka semua berada di direktori / namespace yang sama! Yang membingungkan adalah bahwa secara harfiah hanya kelas tingkat pertama yang ditemukan, jadi saya harus meletakkan yang lainspl_autoload_register()
dengan aturan fungsi anonim tepat setelah yang pertama agar secara manual menyertakan orang tua yang hilang / kelas yang diwarisi.Inilah cara saya menggunakan Autoload. Dalam contoh yang diberikan saya ingin memuat kelas membentuk 3 direktori yang berbeda.
Saya contoh yang diberikan, PHP akan mencari kelas namespace \ di tiga direktori ini menggunakan tiga format nama file yang berbeda.
sumber