Я создал класс с именем 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
Пожалуйста, помогите мне, где я делаю неправильно в этом коде? Есть лучший способ сделать это?
Вы помещаете объявление пространства имен в свой программный код, который помещает __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 подробности об общепринятой процедуре автозагрузки.
spl_autoload_register(function($class) {
include 'classes/' . str_replace('\\', '/', $class) . '.class.php';
});