2016-04-22 10 views
1

Я новичок в этой области пространства имен.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 Fatal error: Class 'Timer' not found in path/to/class2.php at line ***

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

UPDATE

Я создал автозагрузчик, который будет require всех необходимых файлов на вершине моего PHP скрипта. Итак, теперь класс2.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. Все работает нормально.

+0

Попробуйте использовать ur class2.php с помощью \ src \ Timer \ Timer как Timer; –

+0

@ManinderpreetSingh Пробовал. Тот же вопрос. –

+0

Я думаю, вы должны проверить [Композитор] (http://getcomposer.org). Пространство имен является просто уникальным идентификатором для класса. Автозагрузка PHP перегружается при создании экземпляра класса, пока он не существует, но до того, как препроцессор выдает ошибку T_FATAL. Обычная практика заключается в том, чтобы затем заменить '\' на '/' и загрузить ее из структуры папок (почему пространство имен обычно соответствует структуре каталогов. – ash

ответ

1

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

+0

Я вижу. Я действительно читал их прямо сейчас. Это означает, что ключевые слова 'namespace' и' use' являются бесполезными без Autoloader? –

+1

Пространства имен - это всего лишь способ инкапсуляции элементов в виде говорят документы – Andreas

5

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

1) We can just use namespace and require

2) We can use Composer and work with the autoloading!

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

Class1.php (Timer Class)

namespace Utility; 

class Timer 
    { 
    public static function {} 
    } 

Class2.php (Verification Class)

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 и автозагрузку путь)

Make composer.json file. According to your example "src/Utility" We need to create a composer.json file before the src folder. Example: In a folder called myApp you will have composer.json file and a src folder.

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

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

composer dump-autoload 

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

Timer.php(Timer Class)

namespace Utility; 

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

Verification.php (Verification Class)

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

class Verification 
    { 
    Timer::somefunction(); 
    } 

Этот метод является более мощным, когда у вас есть сложная структура папок !!