Будет ли загружаться автозагрузчик PHP при вызове константы класса?

У меня есть класс, который определяет некоторые константы класса. Для простоты это выглядит как этот фальшивый класс.

class MyThing {
const BORIS = 'Yeltsin';
}

Я регистрирую каталог, в котором находится класс.

AutoLoader::registerDirectory('lib');

Я использую автозагрузчик PHP, и он работает как положено, за исключением случаев, когда я пытаюсь вызвать этот класс const.

Если я сделаю это.

MyThing::BORIS

Я понял это.

Undefined class constant 'BORIS'

Я думаю, что так должен работать автозагрузчик, но я хотел знать, прав ли я.

Я использую этот класс AutoLoader, который был выбран до того, как я начал работать в этой компании, но, похоже, он работает.

<?php

/**
* Autoloading class.
* From http://jes.st/2011/phpunit-bootstrap-and-autoloading-classes/
* as per the author comment:
* Jess Telford says:
*   December 21, 2013 at 4:01 am
*   Public Domain – do with it whatever you want :)
*
* This class will compare classnames to the filename without extensions (.class.php or .php) registered
*
* This means that only a class per file can be loaded and only if the class name is identical (case sensitive) to the file name
*
*/

class AutoLoader {

static private $classNames = array();

/**
* Recursively store all .class.php and .php files found under $dirName in the autoloader
*
* @param String $dirName has to be a valid path
*/
public static function registerDirectory($dirName) {

$di = new DirectoryIterator($dirName);
foreach ($di as $file) {

if ($file->isDir() && !$file->isLink() && !$file->isDot()) {
self::registerDirectory($file->getPathname());
} elseif (substr(strtolower ($file->getFilename()), -10) === '.class.php') {
$className = substr($file->getFilename(), 0, -10);
AutoLoader::registerClass($className, $file->getPathname());
}elseif (substr(strtolower ($file->getFilename()), -4) === '.php') {
$className = substr($file->getFilename(), 0, -4);
AutoLoader::registerClass($className, $file->getPathname());
}
}
}

public static function registerClass($className, $fileName) {
AutoLoader::$classNames[$className] = $fileName;
}

public static function loadClass($className) {
if (isset(AutoLoader::$classNames[$className])) {
require_once(AutoLoader::$classNames[$className]);
}
}

}

spl_autoload_register(array('AutoLoader', 'loadClass'));
?>

Обновление: мой первоначальный вопрос гласил, что вызов spl_autoload (‘MyThing’) решил мою проблему, но это не так.

4

Решение

Короче да, автозагрузчик нужен для статики.

Вы можете проверить это самостоятельно:

/index.php

<?php

class Init {
function __construct() {
spl_autoload_register(array($this, 'loadClass'));
echo MyThing::BORIS;
}
function loadClass($className) {
$possible_file = 'classes/' . strtolower($className) . '.php';
echo 'Autoloader called for ' . $className . '<br />';
if(file_exists($possible_file)) {
require_once($possible_file);
return true;
}
return false;
}
}

new Init();

/classes/mything.php

<?php

class MyThing {
const BORIS = 'Yeltsin';
}

Выход

Autoloader called for MyThing
Yeltsin
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector