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

У меня небольшая проблема с пространствами имен и операторами 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, я получаю:

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

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

Ответ 1

Оператор 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, чтобы увидеть подходящую реализацию автозагрузчика.

Ответ 2

Самый простой способ поставить

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

В файле file1.php namespace foo\bar;

В файле2.php $obj = new foo\bar\myObj();


Еще немного к этой истории - ключевое слово use.

Если вы скажете в файле2 use foo\bar as mypath, это означает, что вам нужно использовать mypath вместо foo\bar в любом месте файла. '

$obj  = new mypath\myObj();

Если вы сказали use foo\bar, он равен use foo\bar as bar