Класс 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: класс «Таймер» не найден в path/to/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. Все работает нормально.


person Parthapratim Neog    schedule 22.04.2016    source источник
comment
Попробуйте в ur class2.php использовать \src\Timer\Timer как таймер;   -  person Maninderpreet Singh    schedule 22.04.2016
comment
@ManinderpreetSingh пытался. Та же проблема.   -  person Parthapratim Neog    schedule 22.04.2016
comment
Я думаю, вам следует проверить Composer. Пространство имен — это просто уникальный идентификатор класса. Автозагрузка PHP перегружается, когда создается экземпляр класса, пока он не существует, но до того, как препроцессор выдаст ошибку T_FATAL. Обычной практикой является замена \ на / и загрузка из структуры папок (почему пространство имен обычно соответствует структуре каталогов.   -  person ash    schedule 22.04.2016
comment
@ash Можете ли вы вкратце рассказать мне, как Composer будет полезен в моем проекте? Мне нужно использовать пространства имен. Надеюсь, вы прочитали мое обновление в вопросе.   -  person Parthapratim Neog    schedule 22.04.2016
comment
Он не исправляет ваши пространства имен, он помогает вам загружать ваши классы, когда нужно создавать их экземпляры в вашем коде. оформить заказ Правильный путь PHP   -  person ash    schedule 22.04.2016


Ответы (2)


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

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», вы увидите папку поставщика, папку 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(); 
  }

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

person Photon Khan    schedule 20.11.2016

Вам понадобится реализовать автозагрузчик, поскольку вы уже читали об этом в 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.

person Andreas    schedule 22.04.2016
comment
Понимаю. Я действительно читал их прямо сейчас. Значит, ключевые слова namespace и use без автозагрузчика бесполезны? - person Parthapratim Neog; 22.04.2016
comment
Пространства имен - это просто способ инкапсуляции элементов, как говорится в документах. - person Andreas; 22.04.2016