Автозагрузка классов с пространствами имен и каталогами в Linux - PullRequest
0 голосов
/ 01 мая 2018

Эй, я только учусь, как работают пространства имен и автозагрузка. Кажется, не могу заставить его работать, может использовать некоторую помощь. Я использую codeigniter и соответствующая структура каталогов:

root/
    application/
        classes/
            testa/
                TestClass.php
            testb/
                UserClass.php
    html/
        index.php

содержимое TestClass.php равно

namespace application\classes\testa;

class TestClass {
    public $var = 'a default value';
    public function displayVar() {
        echo $this->var;
    }
}

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

// autoload classes based on a 1:1 mapping from namespace to directory 
// structure.
spl_autoload_register(function ($className) {
    # Usually I would just concatenate directly to $file variable 
    # below
    # this is just for easy viewing on Stack Overflow)

    $ds = DIRECTORY_SEPARATOR;
    $dir = __DIR__;

    // replace namespace separator with directory separator (prolly
    // not required)
    $className = str_replace('\\', $ds, $className);

    // get full name of file containing the required class
    $file = "{$dir}{$ds}{$className}.php";

    // get file if it is readable
    if (is_readable($file)) require_once $file;
});

Но когда я пытаюсь создать экземпляр класса в представлении codeigniter с помощью

$obj = new application\classes\testa\TestClass();

Я получаю

An uncaught Exception was encountered
Type: Error
Message: Class 'application\classes\testa\TestClass' not found

Что я делаю не так? Я никогда раньше не использовал пространства имен или классы, так что я немного растерялся. Я думаю, что автозагрузчик написан неправильно (может быть, для машины Windows?), Но я не уверен. Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Спасибо за вашу помощь. Мне удалось это выяснить. Я пошел с этим для автозагрузчика, который дает правильный путь к классам DIR

spl_autoload_register(function ($className) {
    // $ds = '/';
    $ds = DIRECTORY_SEPARATOR;
    // $dir = the path to this file (index.php), it always gives 
    // path to the current file
    $dir = __DIR__ ;
    // replace namespace separator with directory separator (prolly
    // not required)
    $className = str_replace('\\', $ds, $className);
    // get full name of file containing the required class 
    $file = '../' . $className . ".php";
    // get file if it is readable
    if (is_readable($file)) require_once $file;
});

Кстати, я в Linux, а не в Windows

0 голосов
/ 01 мая 2018

Поскольку вы работаете на машине с Windows, я предполагаю, что root находится под C:

В index.php, $file = "{$dir}{$ds}{$className}.php"; будет

C: \ корень \ HTML \ приложения \ Классы \ панцирь \ TestClass.php

Вы не можете найти там свой TestClass.php.

Правильный путь к файлу должен быть

$file = "{$dir}{$ds}..{$ds}{$className}.php";

что будет

C: \ корень \ HTML \ .. \ Application \ Классы \ панцирь \ TestClass.php

..\ означает родительский каталог.

...