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

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

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

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

<code>namespace Shape; 
</code>

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

<code>namespace Shape;
//use Shape;
//use ShapeInterface;

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

class Circle extends Shape implements ShapeInterface{ ....
</code>

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

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

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

 Peter26 окт. 2015 г., 12:39
Также по этой теме - / Stackoverflow.com вопросы / 33341955 / ...

Ответы на вопрос(2)

просто используйте ключевое словоnamespace:

File1.php

namespace foo\bar;

В файле2.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;.

Решение Вопроса

Theuse оператор предназначен для присвоения псевдонимов именам классов, интерфейсов или других пространств имен. Наиболее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;

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

 Shawn Northrop11 мая 2012 г., 03:05
Так что, если я создам еще один файл с именем bootstrap.php и поместу в него автозагрузчик вместе с $ circle = new Circle (); Он включает в себя Circle.php, но я получаю сообщение об ошибке: Неустранимая ошибка: класс "Shape" не найден в ... / Circle.php в строке 6. Он загружает Circle.php, но не загружает Shape.php Определен круг как: класс Circle расширяет Shape реализует ShapeInterface
 Shawn Northrop11 мая 2012 г., 03:34
Если я удаляю пространство имен из вышеперечисленных классов, автозагрузчик работает нормально. Однако, когда у меня есть пространство имен в интерфейсе класса shape, я получаю вышеуказанную ошибку
 cmbuckley11 мая 2012 г., 10:21
Создал суть чтобы привести пример. К сожалению, у гистограмм не может быть подпапок. Поместите файл bootstrap.php в папку, а остальные классы - в подпапку «Shape».
 Anthony Rutledge10 янв. 2017 г., 02:52
PSR-4 - это то, что нужно. Я обновил ссылку.

Ваш ответ на вопрос