2012-05-10 2 views
82

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

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

Fatal error: Class 'Shape\Shape' not found in /Users/shawn/Documents/work/sites/workspace/shape/Circle.php on line 8

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

+0

Я прочитал это и до сих пор не совсем понимаю. Будут ли включены внешние файлы? –

+0

Также по этому вопросу - http: // stackoverflow.com/questions/33341955/does-the-import-or-use-order-effect-functional-in-php – Peter

ответ

124

use operator предназначен для предоставления псевдонимов именам классов, интерфейсов или других пространств имен. Большинство 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 не следует путать с autoloading. Класс автозагружается (отрицая необходимость в include), зарегистрировав автозагрузчик (например, с помощью spl_autoload_register). Вы можете прочитать PSR-4, чтобы увидеть подходящую реализацию автозагрузчика.

+0

Удивительно, проверьте это. Благодаря! –

+0

Итак, если я создаю еще один файл под названием bootstrap.php и поставлю автозагрузчик внутри вместе с $ circle = new Circle(); Он включает в себя Circle.php, но я получаю сообщение об ошибке: Fatal error: Class 'Shape' не найден в .../Circle.php в строке 6. Кажется, загружает Circle.php, но не загружает Shape.php Circle определен as: class Circle extends Shape реализует ShapeInterface –

+0

Если я удалю пространство имен из вышеуказанных классов, автозагрузчик отлично работает. Однако, когда у меня есть пространство имен в интерфейсе класса формы, я получаю приведенную выше ошибку. –

4

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

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

В file1.php namespace foo\bar;

В file2.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

Смежные вопросы