PHP 魔术方法 - __autoload()
如果上一章节中的 clone
关键字你不熟悉的话,想必 __autoload()
魔术函数你应该很熟悉了。
_autoload()
魔术函数是 PHP 16 个魔术方法中仅有的定义在全局的魔术函数。
PHP 面试的时候经常爱问,你知道 PHP 中加载一个类有几种方式吗?
巴拉巴拉....,人家最重要的就是靠你 spl_register_autoload()
方法和 __autoload()
魔术方法
魔术方法 __autoload()
很遗憾,随着 spl_register_autoload()
的完善,__autoload()
魔术方法在 7.2.0
版本中被标记为 「 已废弃 」 状态。在你的代码中,最好的就是使用 spl_register_autoload()
来取代它
不管 _autoload()
魔术方法的最终命运如何,我们不得不承认它开启了 PHP 自动加载类的新时代。
过去,有两种自动加载类的方式:
- 把所有的类都定义在一个文件中,对,有可能,如果你看到那些古董代码,就会看到一个类文件中定义了不下 100 个类
- 使用
Zend Framework
提供的自动加载机制,也就是类名等于目录名
但是,当 __autoload()
魔术方法出现后,情况立刻改变了
如果在你的应用程序里定义了魔术方法 __autoload()
,如果你使用了一个未定义的类。那么 PHP 就会自动调用该方法来加载那个类。这种机制下,我们可以一个类一个文件,如果配合命名空间,就可以抛弃 Zend Framework 那长长的类名,而且再也不用担心类名重复了。
该方法的原型如下
void __autoload ( string $class )
它没有任何返回值,而唯一的参数,就是需要加载的类名。
范例
假设我们的项目目录为 /www/localhost/htdocs
,在该目录下的 classes
子目录中存放了大量的类,比如
/www/localhost/htdocs/classes/Person1.class
<?php class Person1 { public $sex; public $name; public $age; public static $cnt = 1; public function __construct($name="", $age=25, $sex='Male') { $this->name = $name; $this->age = $age; $this->sex = $sex; } }
/www/localhost/htdocs/classes/Person2.class
<?php class Person2 { public $sex; public $name; public $age; public static $cnt = 1; public function __construct($name="", $age=25, $sex='Male') { $this->name = $name; $this->age = $age; $this->sex = $sex; } }
/www/localhost/htdocs/classes/Person3.class
<?php class Person3 { public $sex; public $name; public $age; public static $cnt = 1; public function __construct($name="", $age=25, $sex='Male') { $this->name = $name; $this->age = $age; $this->sex = $sex; } }
我们就可以定一个 __autoload()
魔术函数来自动加载我们的 Person1
、Person2
和 Person3
<?php function __autoload($className) { $filePath = “/www/localhost/htdocs/classes/{$className}.php”; if (is_readable($filePath)) { require($filePath); } } $person = new Person1('Yufei'); $person2 = new Person2('Hero'); $person3 = new Person3('Aini');