Добрый день,
Я не могу использовать структуру libphonenumber с помощью autoloader.php с spl_autoload_register.
Я не использую композитор, но хочу использовать автозагрузчик PSR4.
Я попробовал несколько примеров, найденных здесь и в других местах, но безуспешно.
Например:
Мой путь к сценарию: /opt/lampp/htdocs/project/incl/register.php
Путь к платформе: / opt / lampp / htdocs / project / incl / libphonenumber
в autoloader.php
<?php
spl_autoload_register(function($class) {
$prefix = 'libphonenumber'; // namespace prefix
$base_dir = __DIR__.DIRECTORY_SEPARATOR.$prefix.DIRECTORY_SEPARATOR; // base directory for the namespace prefix
echo 'base-dir: ', var_dump($base_dir), '<br>';
echo 'class: ', var_dump($class), '<br>';
// does the class use the namespace prefix?
$len = strlen($prefix);
echo 'strncmp: ', var_dump(strncmp($prefix, $class, strlen($prefix))), '<br>';
echo 'relative class: ', var_dump(substr($class, strlen($prefix))), '<br>';
if (strncmp($prefix, $class, $len) !== 0) { // using this on "PhoneNumberUtil" doesn't make sense
return; // no, move to the next registered autoloader
}
// get the relative class name
$relative_class = substr($class, $len); // using this on "PhoneNumberUtil" doesn't make sense
// replace the namespace prefix with the base directory, replace namespace separators with directory separators in the relative class name, append with .php
// $file = $base_dir.str_replace('\\', '/', $relative_class).'.php';
echo 'file with relative-class: ', var_dump($base_dir.str_replace('\\', '/', $relative_class).'.php'), '<br>';
$file = $base_dir.str_replace('\\', '/', $class).'.php';
echo 'file: ', var_dump($file), '<br>';
// if the file exists, require it
if (file_exists($file)) { require_once $file; }
});
Результат:
base-dir: string (46) «/ opt / lampp / htdocs / project / incl / libphonenumber /»
класс: string (15) «PhoneNumberUtil»
strncmp: int (1)
относительный класс: string (1) «l»
файл с относительным классом: string (51) «/opt/lampp/htdocs/project/incl/libphonenumber/l.php»
file: string (65) «/opt/lampp/htdocs/project/incl/libphonenumber/PhoneNumberUtil.php»
PhoneNumberUtil.php загружается последней строкой.
Код в register.php:
include_once 'autoloader.php';
$phone_util = PhoneNumberUtil::getInstance();
Результат:
Неустранимая ошибка: класс «PhoneNumberUtil» не найден в /opt/lampp/htdocs/project/incl/register.php
Пробовал с другим autoloader.php:
<?php
spl_autoload_register(function($className) {
include __DIR__.'/libphonenumber/'.str_replace('\\', DIRECTORY_SEPARATOR, $className).'.php';
});
Тот же результат:
Неустранимая ошибка: класс «PhoneNumberUtil» не найден в /opt/lampp/htdocs/project/incl/register.php
Может кто-нибудь сказать, пожалуйста, что я делаю не так?
РЕДАКТИРОВАТЬ
Еще немного информации:
Я хочу использовать пакет libphonenumber из https://github.com/giggsey/libphonenumber-for-php
Я попытался следовать примеру для autoloader.php, как показано там, но безуспешно.
Следуя примерам, которые я нашел, мой код должен работать, но это не так.
Я пытался найти больше объяснений, но не помогло.
К сожалению, я до сих пор не могу понять, почему мой код не работает.
Заранее спасибо.
Не берите в голову.
Я нашел решение сам, методом проб и ошибок.
Изменяя это:
$phone_util = PhoneNumberUtil::getInstance();
в register.php к этому:
$phone_util = libphonenumber\PhoneNumberUtil::getInstance();
это работало нормально.
Однако я не могу логически объяснить, зачем нужен этот дополнительный код.
Для меня это выглядит как ошибка в PHP.
На мой взгляд, об этом нужно позаботиться в autoloader.php.
Других решений пока нет …