我使用spl_autoload_register自动加载类,如
我的结构
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
如何解决谢谢
答案 0 :(得分:2)
您的问题是您在Chronometer simpleChronometer = (Chronometer) findViewById(R.id.simpleChronometer); // initiate a chronometer
simpleChronometer.start(); // start a chronometer
之前加了
__DIR__
基于调用它的文件所在的位置:
__DIR__
文件目录。 如果在include中使用,则返回包含文件的目录。这等效于dirname(
__DIR__
)。除非它是根目录,否则该目录名称不带斜杠。
http://php.net/manual/en/language.constants.predefined.php
因此,因为您的自动加载器例程位于./Module /
__FILE__
从index.php调用时不会返回__DIR__
,而是返回/
,这显然导致找不到完成的类路径Module
。
要么使用另一种在目录之前添加目录的方法,例如使用预定列表,要么使用名称空间的第一部分(因此,请抛开Module/Module/MyClass.php
),或者将类移到相对于包含文件所在目录的位置
答案 1 :(得分:1)
您的自动装带器位于Module目录中,因此当您尝试将“ DIR ”附加到类全名时,它将自动附加一个“ 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');