Пространства имен 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