-
- class A{
- public function __construct(){
- echo 'Got it.';
- }
- }
-
复制代码 然后,有一个index.php需要用到这个类A,常规写法:
require('A.php'); - $a = new A();
-
复制代码
问题所在:
假如index.php需要包含的不只是类A,而是需要很多类,则必须写很多行require语句。
在php5中,试图使用尚未定义的类时会自动调用__autoload函数,所以可以通过编写__autoload函数来让php自动加载类。
以上的例子,可以修改为:
-
-
function __autoload($class) { - $file = $class . '.php';
- if (is_file($file)) {
- require_once($file);
- }
- }
$a = new A();
__autoload只是去include_path寻找类文件并加载,我们可以根据自己的需要定义__autoload加载类的规则。
-
复制代码
此外,假如不想自动加载的时候调用__autoload,而是调用自己的函数(或者类方法),可以使用spl_autoload_register来注册自己的autoload函数。
函数原型如下:
bool spl_autoload_register ( [callback $autoload_function] )
继续修改以上的例子:
-
-
- function loader($class) {
- $file = $class . '.php';
- if (is_file($file)) {
- require_once($file);
- }
- }
spl_autoload_register('loader');
$a = new A();
-
复制代码
php在寻找类时就没有调用__autoload而是调用自己定义的函数loader了。
以下写法也是可以的,例如:
-
-
- class Loader {
- public static function loadClass($class) {
- $file = $class . '.php';
- if (is_file($file)) {
- require_once($file);
- }
- }
- }
spl_autoload_register(array('Loader', 'loadClass'));
$a = new A();
-
复制代码
|