Класс PHP не найден при использовании пространства имен

Я новичок в этом пространстве имен.

У меня есть 2 класса (отдельные файлы) в моей базовой директории, скажем class1.php а также class2.php внутри каталога src/,

class1.php

namespace \src\utility\Timer;

class Timer{
public static function somefunction(){

}
}

class2.php

namespace \src\utility\Verification;
use Timer;

class Verification{
Timer::somefunction();
}

Когда я выполню class2.phpя получаю фатальную ошибку,

Неустранимая ошибка PHP: класс «Таймер» не найден в пути / к / class2.php в
линия ***

Я где-то читал на SO, что мне нужно для этого создать автозагрузчики. Если да, то как я подхожу к его созданию, а если нет, то в чем еще проблема?

ОБНОВИТЬ

Я создал автозагрузчик, который будет require все необходимые файлы поверх моего php-скрипта.
Итак, теперь class2.php закончится так.

namespace \src\utility\Verification;
require '/path/to/class1.php'
use Timer;
//or use src\utility\Timer ... both doesn't work.

class Verification{
Timer::somefunction();
}

Это также не работает, и это показывает, что класс не найден. Но если я уберу все namespaces, а также use«S. Все отлично работает

4

Решение

Мы можем решить проблему пространства имен двумя способами

1) Мы можем просто использовать пространство имен и требовать

2) Мы можем использовать Composer и работать с автозагрузкой!

Первый путь (пространство имен и требуемый)

Class1.php (класс таймера)

namespace Utility;

class Timer
{
public static function {}
}

Class2.php (Проверочный класс)

namespace Utility;
require "Class1.php";

//Some interesting points to note down!
//We are not using the keyword "use"//We need to use the same namespace which is "Utility"//Therefore, both Class1.php and Class2.php has "namespace Utility"
//Require is usually the file path!
//We do not mention the class name in the require " ";
//What if the Class1.php file is in another folder?
//Ex:"src/utility/Stopwatch/Class1.php"
//Then the require will be "Stopwatch/Class1.php"//Your namespace would be still "namespace Utility;" for Class1.php

class Verification
{
Timer::somefunction();
}

Второй путь (Использование Composer и способ автозагрузки)

Делать composer.json файл. В соответствии с вашим примером «src / Utility» нам нужно создать файл composer.json перед папкой src. Пример: в папке myApp у вас будет файл composer.json и папка src.

   {
"autoload": {
"psr-4": {
"Utility\\":"src/utility/"}
}
}

Теперь перейдите в эту папку, откройте свой терминал в той папке, где находится файл composer.json. Теперь введите в терминале!

   composer dump-autoload

Это создаст папку продавца. Поэтому, если у вас есть папка с именем «MyApp», вы увидите папку vendor, папку src и файл composer.json.

Timer.php (Класс таймера)

namespace Utility;

class Timer
{
public static function somefunction(){}
}

Verification.php (Класс верификации)

namespace Utility;
require "../../vendor/autoload.php";
use Utility\Timer;

class Verification
{
Timer::somefunction();
}

Этот метод более эффективен, если у вас сложная структура папок !!

9

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

Вам нужно будет реализовать автозагрузчик, как вы уже читали об этом в SO.

Вы можете проверить стандарт автозагрузки PSR-4 на http://www.php-fig.org/psr/psr-4/ и вы можете увидеть пример реализации автозагрузки PSR-4 и пример реализации класса для обработки нескольких пространств имен здесь https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md.

1

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