Проблема с получением libphonenumber для работы с autoloader.php - PullRequest
0 голосов
/ 18 декабря 2018

Добрый день,

Я не могу использовать инфраструктуру libphonenumber с использованием autoloader.php с spl_autoload_register.Я не использую composer, но хочу использовать автозагрузчик 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, как показано там, но безуспешно.

После найденных примеров мой код должен работать, но он не работает.

Я попытался найти более подробное объяснение, но не помогло.

К сожалению, я до сих пор не могу понять, почему мой код не работает.

Заранее спасибо.

1 Ответ

0 голосов
/ 21 декабря 2018

Не бери в голову.

Я сам нашел решение методом проб и ошибок.

Изменив это:

$phone_util = PhoneNumberUtil::getInstance();

в register.php на это:

$phone_util = libphonenumber\PhoneNumberUtil::getInstance();

все работало нормально.

Однако я не могу логически объяснить, зачем нужен этот дополнительный код.

Для меня это выглядит как ошибка в PHP.

На мой взгляд, об этом нужно позаботиться в autoloader.php.

...