Пространство имен не работает с магической функцией __autoload в php - PullRequest
0 голосов
/ 06 декабря 2018

Я создал класс с именем class_one с пространством имен MyClassOne, как показано ниже.

class_one.php

namespace MyClassOne;

class class_one
{
    function __construct()
    {
        echo 'I am from Class One Constructor';
    }
}

И я пытаюсь использовать его в index.php файлеas:

namespace MyClassOne;
require_once('class_one.php');
$one = new class_one();

Работает нормально, но когда я пытаюсь включить с __autoload магическую функцию, как:

namespace MyClassOne;
function __autoload($className)
{
    include_once("$className.php");
}

$one = new class_one();

выдает ошибку:

Неустранимая ошибка: необработанная ошибка: класс «MyClassOne \ class_one» не найден в C: \ xampp \ htdocs \ PHP \ autoload \ index.php: 9 Трассировка стека: # 0 {main}, брошенный в C: \ xampp \ htdocs \PHP \ autoload \ index.php в строке 9

Пожалуйста, помогите мне, где я делаю неправильно в этом коде?Есть ли лучший способ сделать это?

Ответы [ 2 ]

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

Вы помещаете объявление пространства имен в программный код, который помещает функцию __autoload() в это пространство имен, делая ее \MyClassOne\__autoload() вместо желаемой \__autoload(), поэтому PHP не запускает ее при попытке загрузитьa класс.

Как правило, вам нужны только объявления пространств имен в файлах определений классов:

namespace MyClassOne;
class class_one
{
}

Затем используйте use в коде вашей программы:

use MyClassOne\class_one;
$one = new class_one();

Или используйте полное имя класса:

$one = new \MyClassOne\class_one();

Подробнее об общепринятой процедуре автозагрузки см. PSR-4 .

0 голосов
/ 06 декабря 2018
spl_autoload_register(function($class) {
    include 'classes/' . str_replace('\\', '/', $class) . '.class.php';
});
...