2015-08-18 1 views
2

Я разрабатываю систему в php, которая использует пространства имен.Ошибка «class not found» в PHP с двойными слэшами (\)

У меня есть следующий код (обобщенный, очевидно) .... класса в одном месте с каталогом Foo \ Bar \ fubar.php

<?php 
namespace Foo\Bar; 
class fubar 
{... 

И у меня в другой .php .. .

<?php 
use Foo\Bar; 
use Foo\Bar\fubar; 

class adventurer{ 
    $doomChickens = new fubar(); 
} 

Теперь, когда я просматриваю журнал ошибок, я получаю ...

PHP Fatal Error: Class 'Foo\\Bar\\fubar' not found. 

Я был воспитан в этот код (я не оригинал автора), но в общем, я использую тип, который требует &, а не пространства имен. Какая ошибка может вызвать двойную косую черту? Возможно, это источник моей проблемы?

ответ

2

Это не ошибка, это именно то, как PHP печатает ее. Как вы, наверное, знаете, существуют escape-последовательности для строк, таких как \n для новой строки и \t для вкладки. Ну, \\ - это escape-последовательность для \.

PHP также интерпретирует недействительные escape-последовательности буквально, поэтому Foo\Bar будет просто потому, что \B не является допустимой escape-последовательностью.

Для справки, escape-последовательности обрабатываются только в двойных кавычках, а не в одинарных кавычках.


Что касается решения вашей актуальной проблемы, вам необходимо либо явно include или require файл с классом или использовать an autoloader. Наиболее распространенными являются автопогрузчики PSR-0 и PSR-4.

Кстати, линия use Foo\Bar; не нужна.

Первое решение будет выглядеть следующим образом:

<?php 
require 'path/to/other/class.php'; 

use Foo\Bar\fubar; 

class adventurer{ 
    $doomChickens = new fubar(); 
} 
+0

Спасибо! Я не ожидал, что в фактическом выводе будет отображаться escape-слэши. Я основывал этот код на существующих параллелях ... полагаю, они, вероятно, используют маршрут автозагрузчика, а это значит, что мне теперь нужно выследить его местоположение. Ты спас меня от наготы! Благодаря! – liljoshu

+0

Если вы не в окнах, следите за чувствительностью к регистру. Если вы используете класс как 'Foo \ bar \ Baz', PHP будет искать именно это и пропустить' Foo \ Bar \ Baz'. – Anonymous

 Смежные вопросы

  • Нет связанных вопросов^_^