oop — пространство имен не работает с магической функцией __autoload в переполнении стека

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

class_one.php

namespace MyClassOne;

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

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

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

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

0

Решение

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

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

namespace MyClassOne;
class class_one
{
}

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

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

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

$one = new \MyClassOne\class_one();

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

2

Другие решения

spl_autoload_register(function($class) {
include 'classes/' . str_replace('\\', '/', $class) . '.class.php';
});
1

По вопросам рекламы [email protected]