بیشتر برنامهنویسان برنامههای شیگرا یک فایل تنها برای هر یک از تعریف کلاسها فراهم مینماید. یکی از بزرگترین آزارها نوشتن یک فهرست بلندبالای شامل شروع هر اسکریپت است (یکی برای هر کلاس).
در PHP 5 دیگر این کار ضروری نیست. شما ممکن است تابع __autoload را که بصورت خودکار هنگام استفاده شما از یک کلاس/واسط فراخوانی میشود استفاده کنید. با فراخوانی این تابع موتور اسکریپت داده شده آخرین شانس خود را برای بارگذاری کلاس امتحان خواهد کرد پیش از آنکه PHP با یک خطا مواجه شود.
Note:
پیش از 5.3.0 استثنای داده شده تابع __autoload نمیتواند با استفاده از بلوک catch گرفته شود و در نتیجه یک خطای مرگبار ایجاد میکند. از 5.3.0+ استثناهای تابع __autoload در بلوک catch را میتوان به همراه 1 proviso شناسایی کرد. ایجاد یک استثنای تغییر یافته باید به همراه کلاس استثنای آن باشد. تابع __autoload را میتوان به صورت بازگشتی برای بارگذاری خودکار کلاس استنا به کار برد.
Note:
بارگذاری خودکار هنگام استفاده PHP در CLI حالت برهمکنشی موجود نیست.
Note:
اگر نام کلاس استفاده شده باشد به عنوان نمونه در call_user_func() آنگاه میتواند کاراکترهای خطرناکی مانند../ در آن موجود باشد. توصیه میشود که از ورودی کاربر پبش از تایید ورودی در توابعی مانند __autoload() استفاده نکنید.
Example #1 نمونه بار نمودن خودکار
این مثال تلاش مینماید تا کلاسهای MyClass1 و MyClass2 از فایلهای MyClass1.php و MyClass2.php را به ترتیب بار نماید.
<?php
function __autoload($class_name) {
require_once $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
این نمونه تلاش مینماید تا واسط ITest را بارگذاری نماید.
<?php
function __autoload($name) {
var_dump($name);
}
class Foo implements ITest {
}
/*
string(5) "ITest"
Fatal error: Interface 'ITest' not found in ...
*/
?>
Example #2 Autoload به همراه استثنا در 5.3.0+
این مثال استثنا را ایجاد کرده وبلوک try/catch را نشان میدهد.
<?php
function __autoload($name) {
echo "Want to load $name.\n";
throw new Exception("Unable to load $name.");
}
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
The above example will output:
Want to load NonLoadableClass. Unable to load NonLoadableClass.
Example #3 Autoloading with exception handling for 5.3.0+ - Missing custom exception
This example throws an exception for a non-loadable, custom exception.
<?php
function __autoload($name) {
echo "Want to load $name.\n";
throw new MissingException("Unable to load $name.");
}
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
The above example will output:
Want to load NonLoadableClass. Want to load MissingException. Fatal error: Class 'MissingException' not found in testMissingException.php on line 4