php - 自动加载不适用于静态方法
php - autoload not working with static method
我使用 spl_autoload_register 自动加载 class 就像
我的结构
index.php
Module\Autoloader.php
Module\MyClass.php
Test\test.php
在 index.php
文件中
require_once ("Module\Autoloader.php");
use Module\MyClass;
include 'Test\test.php';
在Module\Autoloader.php
文件中
class Autoloader {
static public function loader($className) {
$filename = __DIR__."/" . str_replace("\", '/', $className) . ".php";
echo $filename.'<br>';
if (file_exists($filename)) {
include($filename);
}
}
}
spl_autoload_register('Autoloader::loader');
在Module\MyClass.php
文件中
namespace Module;
class MyClass {
public static function run() {
echo 'run';
}
}
在 Test\test.php
文件中
MyClass::run();
但是有错误
Fatal error: Uncaught Error: Class 'MyClass' not found in ..\Test\test.php
如何解决这个问题谢谢
你的问题是你在前面添加了 __DIR__
__DIR__
基于调用它的文件所在的位置:
__DIR__
The directory of the file. If used inside an include, the directory of the included file is returned. This is equivalent to dirname(__FILE__
). This directory name does not have a trailing slash unless it is the root directory.
http://php.net/manual/en/language.constants.predefined.php
所以因为您的自动加载器例程位于 ./Module/
__DIR__
在从 index.php 调用时不会 return /
但 Module
,使你完成的类路径 Module/Module/MyClass.php
显然可以'找不到。
要么使用另一种方式在目录前添加目录,例如预先确定的列表,要么使用命名空间的第一部分(因此只需放弃 __DIR__
)或将 类 移动到相对于目录的位置您的包含文件所在的位置。
您的自动加载器位于模块目录中,因此当您尝试将“DIR”附加到 class 全名时,它会附加一个额外的 "Module" .文件位置将是这样的:
../Module/Module/MyClass.php
尝试将自动加载器移动到与 index.php 相同的目录或将其更改为以下内容:
<?php
class Autoloader {
static public function loader($className) {
$filename = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR .
str_replace("\", DIRECTORY_SEPARATOR, $className) . ".php";
if (file_exists($filename)) {
include($filename);
} else {
echo "$filename not found!\n";
}
}
}
spl_autoload_register('Autoloader::loader');
我使用 spl_autoload_register 自动加载 class 就像
我的结构
index.php
Module\Autoloader.php
Module\MyClass.php
Test\test.php
在 index.php
文件中
require_once ("Module\Autoloader.php");
use Module\MyClass;
include 'Test\test.php';
在Module\Autoloader.php
文件中
class Autoloader {
static public function loader($className) {
$filename = __DIR__."/" . str_replace("\", '/', $className) . ".php";
echo $filename.'<br>';
if (file_exists($filename)) {
include($filename);
}
}
}
spl_autoload_register('Autoloader::loader');
在Module\MyClass.php
文件中
namespace Module;
class MyClass {
public static function run() {
echo 'run';
}
}
在 Test\test.php
文件中
MyClass::run();
但是有错误
Fatal error: Uncaught Error: Class 'MyClass' not found in ..\Test\test.php
如何解决这个问题谢谢
你的问题是你在前面添加了 __DIR__
__DIR__
基于调用它的文件所在的位置:
__DIR__
The directory of the file. If used inside an include, the directory of the included file is returned. This is equivalent to dirname(
__FILE__
). This directory name does not have a trailing slash unless it is the root directory.
http://php.net/manual/en/language.constants.predefined.php
所以因为您的自动加载器例程位于 ./Module/
__DIR__
在从 index.php 调用时不会 return /
但 Module
,使你完成的类路径 Module/Module/MyClass.php
显然可以'找不到。
要么使用另一种方式在目录前添加目录,例如预先确定的列表,要么使用命名空间的第一部分(因此只需放弃 __DIR__
)或将 类 移动到相对于目录的位置您的包含文件所在的位置。
您的自动加载器位于模块目录中,因此当您尝试将“DIR”附加到 class 全名时,它会附加一个额外的 "Module" .文件位置将是这样的:
../Module/Module/MyClass.php
尝试将自动加载器移动到与 index.php 相同的目录或将其更改为以下内容:
<?php
class Autoloader {
static public function loader($className) {
$filename = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR .
str_replace("\", DIRECTORY_SEPARATOR, $className) . ".php";
if (file_exists($filename)) {
include($filename);
} else {
echo "$filename not found!\n";
}
}
}
spl_autoload_register('Autoloader::loader');