Пространства имен 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
заявления я получаю:
Неустранимая ошибка: класс 'Shape\Shape' не найден в /Users/shawn/Documents/work/sites/workspace/shape/Circle.php в строке 8
Может ли кто-нибудь дать мне небольшое руководство по этому вопросу?
2 ответа
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, чтобы увидеть подходящую реализацию автозагрузчика.
Если вам нужно упорядочить код в пространствах имен, просто используйте ключевое слово 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;
,