PHP: __autoload function doesn't ever called

2019-07-03 06:17发布

问题:

So, I have xampp. I tested this code on ZendServer, result the same.

<?php
error_reporting(E_ALL);

define ("ABS_PATH", 'C:\xampp\htdocs\oopHotLine\\');

function __autoload($class_name) {
    echo 'gg';
    require_once (ABS_PATH.'classes\\'.$class_name.'.php');
}

$process=new Main('1');
?>

after php.exe -a index.php i have this:

Interactive mode enabled
Fatal error: Class 'Main' not found in C:\xampp\htdocs\oopHotLine\index.php on line 10
[Finished]

so, it doesn shows 'gg' output. If i manually do __autoload('Main'); - all OK. The same for the manual require_once or include. All permissions in windows folder set to full access. Php version - PHP Version => 5.3.8;

Please, help.

回答1:

As DaveRandom pointed:

Autoloading is not available if using PHP in CLI interactive mode.

So, instead of using php.exe -a index.php, cut the -a off and try running the script with php.exe index.php instead.



回答2:

Notes from the PHP Manual on this subject, that may be relevant:

Judging by the first message logged, this is probably the answer:

Autoloading is not available if using PHP in CLI interactive mode.

...but also:

spl_autoload_register() provides a more flexible alternative for autoloading classes. For this reason, using __autoload() is discouraged and may be deprecated or removed in the future.

Aside from this, here is how I would write your autoload function:

function __autoload($class_name) {
  if (file_exists(ABS_PATH."classes/$class_name.php")) { // At least check the file exists before you require it!
    // Forward slashes work on Windows too (in PHP at least)... and they make it more portable
    require_once (ABS_PATH."classes/$class_name.php");
  }
}


回答3:

http://www.php.net/manual/en/function.spl-autoload-register.php

If your code has an existing __autoload function then this function must be explicitly registered on the __autoload stack. This is because spl_autoload_register() will effectively replace the engine cache for the __autoload function by either spl_autoload() or spl_autoload_call().