php 中的 __autoload 魔法函数无法使用命名空间
Namespace not working with __autoload magic function in php
我创建了一个名为 class_one
的 class,命名空间 MyClassOne
,如下所示。
class_one.php
namespace MyClassOne;
class class_one
{
function __construct()
{
echo 'I am from Class One Constructor';
}
}
我正尝试在 index.php
文件中将其用作:
namespace MyClassOne;
require_once('class_one.php');
$one = new class_one();
它工作正常,但是当我尝试包含 __autoload
魔法函数时:
namespace MyClassOne;
function __autoload($className)
{
include_once("$className.php");
}
$one = new class_one();
报错:
Fatal error: Uncaught Error: Class 'MyClassOne\class_one' not found in
C:\xampp\htdocs\PHP\autoload\index.php:9 Stack trace: #0 {main} thrown
in C:\xampp\htdocs\PHP\autoload\index.php on line 9
请帮我看看这段代码哪里做错了?有更好的方法吗?
spl_autoload_register(function($class) {
include 'classes/' . str_replace('\', '/', $class) . '.class.php';
});
您在程序代码中放置了一个名称空间声明,它将 __autoload()
函数放入该名称空间中,使其成为 \MyClassOne\__autoload()
而不是所需的 \__autoload()
,因此 PHP 在尝试加载 class.
时不会触发它
通常,您只需要 class 定义文件中的命名空间声明:
namespace MyClassOne;
class class_one
{
}
然后在你的程序代码中使用use
:
use MyClassOne\class_one;
$one = new class_one();
或使用完整的 class 名称:
$one = new \MyClassOne\class_one();
有关普遍接受的自动加载程序的详细信息,请参见PSR-4。
我创建了一个名为 class_one
的 class,命名空间 MyClassOne
,如下所示。
class_one.php
namespace MyClassOne;
class class_one
{
function __construct()
{
echo 'I am from Class One Constructor';
}
}
我正尝试在 index.php
文件中将其用作:
namespace MyClassOne;
require_once('class_one.php');
$one = new class_one();
它工作正常,但是当我尝试包含 __autoload
魔法函数时:
namespace MyClassOne;
function __autoload($className)
{
include_once("$className.php");
}
$one = new class_one();
报错:
Fatal error: Uncaught Error: Class 'MyClassOne\class_one' not found in C:\xampp\htdocs\PHP\autoload\index.php:9 Stack trace: #0 {main} thrown in C:\xampp\htdocs\PHP\autoload\index.php on line 9
请帮我看看这段代码哪里做错了?有更好的方法吗?
spl_autoload_register(function($class) {
include 'classes/' . str_replace('\', '/', $class) . '.class.php';
});
您在程序代码中放置了一个名称空间声明,它将 __autoload()
函数放入该名称空间中,使其成为 \MyClassOne\__autoload()
而不是所需的 \__autoload()
,因此 PHP 在尝试加载 class.
通常,您只需要 class 定义文件中的命名空间声明:
namespace MyClassOne;
class class_one
{
}
然后在你的程序代码中使用use
:
use MyClassOne\class_one;
$one = new class_one();
或使用完整的 class 名称:
$one = new \MyClassOne\class_one();
有关普遍接受的自动加载程序的详细信息,请参见PSR-4。