简体   繁体   中英

Using spl_autoload() not able to load class

I'm playing around with the SPL autoload functionality and seem to be missing something important as I am currently unable to get it to work. Here is the snippet I am currently using:

// ROOT_DIRECTORY translates to /home/someuser/public_html/subdomains/test
define('ROOT_DIRECTORY', realpath(dirname(__FILE__)));
define('INCLUDE_DIRECTORY', ROOT_DIRECTORY . '/includes/classes/');
set_include_path(get_include_path() . PATH_SEPARATOR . INCLUDE_DIRECTORY);
spl_autoload_extensions('.class.php, .interface.php, .abstract.php');
spl_autoload_register();

When I echo get_include_path() I do get the path I expected:

// Output echo get_include_path();
.:/usr/lib/php:/usr/local/lib/php:/home/someuser/public_html/subdomains/test/includes/classes/

However when I run the code I get this error message:

Fatal error: spl_autoload() [function.spl-autoload]: Class Request could not be loaded in /home/someuser/public_html/subdomains/test/contact.php on line 5

Request.class.php is definitely in the /home/someuser/public_html/subdomains/test/includes/classes/ directory.

What am I missing?

http://www.php.net/manual/en/function.spl-autoload-register.php#96804上有一条评论(匿名)可能适用于您的问题:spl_autoload_register()似乎不是很好玩使用camelcase,在你的情况下可能试图找到request.class.php而不是Request ...

I got a similar error message but my issue was different. My error message looked like

PHP Fatal error:  spl_autoload(): Class Lib\Lib\Regex could not be loaded in /dir1/dir2/lib/regex.php on line 49

It turned out I forgot to remove the Lib\\ from Lib\\Regex inside the Regex class definition itself. I had something like the following:

namespace Lib;

class Regex {

...

   public static function match($pattern, $str) {

      $regex = new Lib\Regex($pattern);

      ...
   }
}

The path where the class is supposed to be seems not to match the path were you expect them. Compare

.:/usr/lib/php:/usr/local/lib/php:/home/someuser/public_html/subdomains/test/includes/classes/

with

/home/someuser/public_html/subdomains/test/

The difference is, that your class is not in includes/classes/ as your SPL requires it but a few directories above.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM