所以我之前已经在这里问过这个问题,但提供的解决方案对我不起作用。这是我的设置:
/mylib
/Vendor/Module/MyClass.php
/document_root
index.php
这是我的索引.php
<?php
define('CLASSDIR', 'mylib');
define('BASEPATH', @realpath( dirname (__FILE__).'/../').'/'.CLASSDIR);
spl_autoload_register(null, false);
spl_autoload_extensions('.php');
function autoLoader($className){
$className = ltrim($className, '''');
$fileName = '';
$namespace = '';
if ($lastNsPos = strrpos($className, '''')) {
echo 'does it come here? nope.';
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('''', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= BASEPATH.'/'.str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
require $fileName;
}
spl_autoload_register('autoLoader');
//$obj = new MyClass();
$obj = new 'Vendor'Module'MyClass();
$obj::test();
?>
这是我的我的班级.php
<?php
namespace Vendor'Module;
class MyClass{
public function __construct(){
echo 'weird';
}
public function test(){
echo 'strange';
}
}
?>
我的回声都没有显示任何东西。显然我的类也没有加载。相反,我收到此错误。
Fatal error: Call to undefined method MyClass::test() in /<documentroot>/index.php on line 29
请帮忙。我已经坚持了一段时间了,我的其余发展正在遭受痛苦。我尝试搬到spl_autoload_register()
只是因为这是推荐的方式。现在失去的时间让我后悔。
您错误地调用了test()
函数(使用静态方式?
调用函数:
$obj = new MyClass();
$obj->test();
如果你打算使用像 MyClass::test()
这样的静态方法,在你的类中声明你的函数为:
public static function test() {
}
此外,您的自动加载机过于复杂。它可以简化为:
$class_dir = array(
'/mylib/Vendor/Module/',
// Add more paths here ( or you can build your own $class_dir )
);
function class_loader($class_name) {
global $class_dir;
foreach ($class_dir as $directory) {
if (file_exists($directory . $class_name . '.php')) {
require_once($directory . $class_name . '.php');
return;
}
}
}
spl_autoload_register('class_loader');
第3次编辑:
我注意到您设置的路径不正确。
$fileName .= BASEPATH.'/'.str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
它应该是:
$filename = BASEPATH .'/' . $filename . str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
如前所述,可以通过回显$filename
的值轻松调试。
F**k 是的。是的,我可以冒昧地在公共论坛上发誓。
向猛禽@Shivan大喊大叫,感谢他一路上帮助我,没有放弃。
自动加载器功能中存在许多小问题。但是调试花了我这么长时间,原因很简单,我看不到任何回显消息。只有领主和XAMPP知道为什么。似乎 XAMPP 在第一次运行时以某种方式缓存了该类或其他东西,后来没有任何更改显示出任何效果。但是创建一个新的类和类文件突然开始显示我所有的回声,包括自动加载中的回声。任何从下面的链接中获取自动加载器代码的人,请确保您查看所有变量的值。如果您不将所有内容都保留在文档根目录中,它将无法"开箱即用"地工作。如果你对PSR-0和自动加载的概念都是新手,这至少可以杀死你完全有能力的脑细胞的很大一部分。
https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
这是对我有用的最终索引.php。
<?php
define('CLASSDIR', 'mylib');
define('BASEPATH', @realpath( dirname (__FILE__).'/../').'/'.CLASSDIR);
spl_autoload_register(null, false);
spl_autoload_extensions('.php');
function autoLoader($className){
$className = ltrim($className, '''');
$classPath = '';
$namespace = '';
if ($lastNsPos = strrpos($className, '''')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$classPath = str_replace('''', DIRECTORY_SEPARATOR, $namespace).DIRECTORY_SEPARATOR;
}
$fileName = BASEPATH.'/'.$classPath.str_replace('_', DIRECTORY_SEPARATOR, $className).'.php';
require $fileName;
}
spl_autoload_register('autoLoader');
$obj = new 'Vendor'Module'MyClass();
$obj::test();
?>