Пространства имен PHP и «использование»

120

У меня небольшие проблемы с пространствами имен и useоператорами.

У меня есть три файла: ShapeInterface.php, Shape.phpи Circle.php.

Я пытаюсь сделать это, используя относительные пути, поэтому я поместил это во все классы:

namespace Shape; 

В моем кружковом классе у меня есть следующее:

namespace Shape;
//use Shape;
//use ShapeInterface;

include 'Shape.php';
include 'ShapeInterface.php';    

class Circle extends Shape implements ShapeInterface{ ....

Если я использую includeутверждения, я не получаю ошибок. Если я попробую эти useутверждения, то получу:

Неустранимая ошибка: класс Shape \ Shape не найден в /Users/shawn/Documents/work/sites/workspace/shape/Circle.php в строке 8

Может кто-нибудь дать мне небольшое руководство по этому вопросу?

Шон Нортроп
источник
Также по этой теме - stackoverflow.com/questions/33341955/…
Питер,

Ответы:

169

useОператор для предоставления псевдонимов имен классов, интерфейсов и других пространств имен. Большинство useоператоров относятся к пространству имен или классу, который вы хотите сократить:

use My\Full\Namespace;

эквивалентно:

use My\Full\Namespace as Namespace;
// Namespace\Foo is now shorthand for My\Full\Namespace\Foo

Если useоператор используется с именем класса или интерфейса, он имеет следующие применения:

// after this, "new DifferentName();" would instantiate a My\Full\Classname
use My\Full\Classname as DifferentName;

// global class - making "new ArrayObject()" and "new \ArrayObject()" equivalent
use ArrayObject;

useОператор не следует путать с самозарядными . Класс загружается автоматически (что исключает необходимость include) путем регистрации автозагрузчика (например, с помощью spl_autoload_register). Вы можете прочитать PSR-4, чтобы увидеть подходящую реализацию автозагрузчика.

cmbuckley
источник
Итак, если я создам другой файл с именем bootstrap.php и помещу внутрь автозагрузчик вместе с $ circle = new Circle (); Он включает Circle.php, но я получаю сообщение об ошибке: Неустранимая ошибка: класс «Shape» не найден в ... / Circle.php в строке 6. Кажется, загружается Circle.php, но не загружается Shape.php. Круг определен как: class Circle extends Shape реализует ShapeInterface
Шон Нортроп
Если я удалю пространство имен из вышеуказанных классов, автозагрузчик будет работать нормально. Однако, когда у меня есть пространство имен в интерфейсе класса формы, я получаю указанную выше ошибку
Шон Нортроп
1
Создал суть, чтобы дать пример. К сожалению, у gists не может быть вложенных папок. Поместите bootstrap.php в папку, а остальные классы поместите в подпапку с именем «Shape».
cmbuckley
13

Если вам нужно упорядочить код в пространствах имен, просто используйте ключевое слово namespace:

file1.php

namespace foo\bar;

В file2.php

$obj = new \foo\bar\myObj();

Вы также можете использовать use. Если в file2 поставить

use foo\bar as mypath;

вам нужно использовать mypathвместо barлюбого места в файле:

$obj  = new mypath\myObj();

Использование use foo\bar;равно use foo\bar as bar;.

Чарли
источник