Spl_autoload_register не работает с внешними библиотеками - PullRequest
0 голосов
/ 15 декабря 2018

У меня очень простая функция spl_autoload_register:

spl_autoload_register(function($file) {
    require_once str_replace('\\', '/', $file) . '.php';
});

С моими уроками все работает нормально.Я использую пространство имен в начале каждого класса и использую его как $class = new \system\controller\Front();.

Но теперь я хотел бы использовать эту внешнюю библиотеку / класс https://github.com/leafo/lessphp/blob/master/lessc.inc.php. Я также добавил пространство имен в началеnamespace system\lib\less; и пытался использовать метод compileFile(), но я получаю ошибку Warning: require_once(lessc.php): failed to open stream: No such file or directory in.

Я обнаружил, что первая инициализация класса lessc() прошла успешно, но ошибка в строке no. 2442 - $commentSingle = lessc::preg_quote(self::$commentSingle);, где используется lessc::.

Моя spl_autoload_register функция не может обработать это, потому что не добавлено пространство имен перед именем класса, и попробуйте загрузить только lessc.php file.

Мой вопрос заключается в том, как глобально исправить это для всех других классов / библиотек, которые я хотел бы добавить в свой проект, не редактируя их (путем добавления пространств имен).Есть ли какое-нибудь решение, как это исправить?

Единственное решение, которое я обнаружил, это изменить мою функцию spl_autoload_register на что-то подобное, что, кажется, работает, но я не знаю, если это такправильное и лучшее решение, и я не знаю, будет ли это работать для всех внешних библиотек, которые я хотел бы использовать.

spl_autoload_register(function($file) {
    // external libraries
    if ($file === 'lessc') $file = 'system/lib/less/lessc';

    require_once str_replace('\\', '/', $file) . '.php';
  });

1 Ответ

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

Думаю, я склонен создать файл json, который будет создавать запись обработки местоположения, аналогично тому, как работает композитор.Вы можете сделать так, чтобы он обрабатывал разные сценарии, основываясь на том, что у конкретной библиотеки есть для именования, но, вероятно, не будет огромного диапазона имен.В наши дни авторитетные библиотеки довольно хорошо соблюдают передовые практики в отношении имен и пространств имен:

/ vendor.pref

[
    {
        "name": "lessc",
        "include": "/system/lib/less/lessc.php"
    },
    {
        "name": "other",
        "root": "/system/lib/other",
        "type": "psr0"
    }
]

Авторегистратор

spl_autoload_register(function($class) {
    # If there is a standard namespace
    $file = str_replace('//','/',__DIR__.'/'.str_replace('\\', '/', $class)) . '.php';
    # Check is file and include
    if(is_file($file)) {
        include_once($file);
        return false;
    }
    # See if there is a vendor file and iterate through it to see if something is set up.
    $json = __DIR__.'/vendor.json';
    if(!is_file($json)) {
        return false;
    }
    # Get the contents and convert to array
    $vendors = json_decode(file_get_contents($json), true);
    # Loop through it
    foreach($vendors as $vendor) {
        # See if the name in the json matches anything in the class
        if(stripos($class, $vendor['name']) !== false) {
            # If there is an include file, try and include it
            if(isset($vendor['include']) && is_file($inc = __DIR__.$vendor['include'])) {
                include_once($inc);
                return false;
            }
            # You can do other autoload options as well that would be 
            # indicated in your json file. You can use other psr types
            # so that you can try replacing _ (instead of \) with /
        }
    }
});
...