Intereting Posts
почему str_replace заменяет мой символ точкой с запятой? Вложенный JSON из массива PHP Преобразование многомерного массива в один массив Почему я получаю сообщение об ошибке «4020: информация, полученная с неверного IP-адреса». От SagePay? Идентификация пользователя Yii2 после перенаправления страницы странное поведение на php Неустранимая ошибка при расширении включенного класса Создание PDF-файлов с использованием TCPDF, поддерживающих все языки, в особенности CJK Чтобы быть похожим на Codeigniter и получить этот вид частично с ванильным PHP? Как преобразовать PHP-приложение на основе страниц в MVC? Методы событий плагина в Virtuemart для статуса заказа Как использовать функцию загрузки javascript дважды? (загрузка нагрузки) PHP и MySQL: mysqli_num_rows () ожидает, что параметр 1 будет mysqli_result, boolean given Ошибка анализа: синтаксическая ошибка, неожиданное «else» (T_ELSE) PHP htmlentities позволяют только <b> и <i>

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

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

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

 use My\Full\Namespace; 

эквивалентно:

 use My\Full\Namespace as Namespace; // Namespace\Foo is now shorthand for My\Full\Namespace\Foo 

Если оператор использования используется с именем класса или интерфейса, он имеет следующие функции:

 // 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 ключевых слов.

В namespace foo\bar; file1.php namespace foo\bar;

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


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

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

 $obj = new mypath\myObj(); 

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