设我们有一个类文件A.php,里面定义了一个名字为A的类:
<?php
class A
{
public function __construct()
{
echo 'Got it.';
}
}
<?php
class A
{
public function __construct()
{
echo 'Got it.';
}
}
然后我们有一个index.php需要用到这个类A,常规的写法就是
<?php
require('A.php');
$a = new A();
<?php
require('A.php');
$a = new A();
但是有一个问题就是,假如我们的index.php需要包含的不只是类A,而是需要很多类,这样子就必须写很多行require语句,有时候也会让人觉得不爽。
不过在php5之后的版本,我们就不再需要这样做了。在php5中,试图使用尚未定义的类时会自动调用__autoload函数,所以我们可以通过编写__autoload函数来让php自动加载类,而不必写一个长长的包含文件列表。
例如在上面那个例子中,index.php可以这样写:
<?php
function __autoload($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
$a = new A();
<?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] )
我们继续改写上面那个例子:
<?php
function loader($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
spl_autoload_register('loader');
$a = new A();
<?php
function loader($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
spl_autoload_register('loader');
$a = new A();
这样子也是可以正常运行的,这时候php在寻找类的时候就没有调用__autoload而是调用我们自己定义的函数loader了。同样的道理,下面这种写法也是可以的:
<?php
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();
分享到:
相关推荐
4. 如果项目中已经实现了__autoload()函数,那么必须显式地使用spl_autoload_register('__autoload')将其加入自动加载栈中,因为spl_autoload_register()函数会将Zend Engine中的__autoload()函数取代为spl_autoload...
spl_autoload_register(PHP 5 >= 5.1.2)spl_autoload_register — 注册__autoload()函数说明bool spl_autoload_register ([ ...因为spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload
这是因为在spl_autoload_register()函数内部,它会将Zend引擎中原有的__autoload()函数替换为spl_autoload()或spl_autoload_call()。 至于自动加载函数的编写,通常需要编写一个能够根据类名来定位并包含类文件的...
本文将深入探讨`spl_autoload_register()`的用法及其在实际开发中的应用。 首先,我们来看一下`__autoload`函数。在PHP5中,当尝试实例化一个未定义的类时,系统会自动调用`__autoload`函数。这个函数接受一个参数...
与 __autoload 函数不同,spl_autoload_register() 函数可以注册多个自动加载函数,以便在实例化未定义的类时自动加载该类的类文件。 例如,我们可以使用 spl_autoload_register() 函数来注册 loadprint 函数: ``...
spl_autoload_register('autoload_function'); ``` 在这个例子中,`$class_name`是未定义的类名,我们将其转换为文件路径,然后尝试包含对应类的文件。如果文件不存在,将输出错误信息。 三、大写字母位置查找算法...
当你首次调用 `spl_autoload_register()` 且不传递参数时,它会将 `autoload_func` 指向 `spl_autoload`。这样,当PHP尝试实例化一个未定义的类时,`spl_autoload_register` 就会按照注册的顺序逐个调用这些自动加载...
当调用`spl_autoload_register`时,它会将`__autoload`函数替换为`spl_autoload`或`spl_autoload_call`,从而管理整个自动加载栈。 让我们看一个实际的例子。假设我们有一个名为`A.php`的文件,其中定义了一个类`A`...
下面我们将详细介绍 spl_autoload_register() 函数的用法实例。 一、__autoload 函数 在 PHP5 中,__autoload 函数是一个自动加载函数,当我们实例化一个未定义的类时,就会触发此函数。例如: printit.class....
需要注意的是,如果你的代码中已经有了 `__autoload` 函数,你需要将其显式地注册到自动加载栈中,因为 `spl_autoload_register()` 会替换掉 Zend Engine 中的 `__autoload` 函数。 SPL(Standard PHP Library)是...
bool spl_autoload_register ([ callback $autoload_function [, bool $throw = true [, bool $prepend = false ]]]) ``` - `$autoload_function`:这是必须的参数,用来指定一个或多个自动加载函数。这些函数会在...
spl_autoload_register(function ($class_name) { // 自定义的加载规则 }); ``` 5. **SPL Autoload的优点** 使用SPL Autoload,我们可以方便地管理和组织多个自动加载函数,避免了单一`__autoload()`函数的...
然而,随着PHP 5的引入,最佳实践逐渐转向了使用SPL(Standard PHP Library)中的spl_autoload_register()函数来注册多个自动加载函数,这种做法更为灵活和健壮,尤其是在大型项目中。 尽管如此,了解__autoload()...
PHP中的autoload机制是为了解决在面向对象编程中类的自动加载问题,从而简化了开发流程并提升...通过spl_autoload_register()注册的自动加载函数,开发者可以灵活地处理类文件的加载逻辑,以适应项目中不断变化的需求。