Простіри імен PHP та "використання"


120

У мене виникають невеликі проблеми з просторами імен та 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твердження:

Фатальна помилка: Клас "Форма \ Форма" не знайдено в /Users/shawn/Documents/work/sites/workspace/shape/Circle.php у рядку 8

Невже хтось, будь ласка, дасть мені трохи рекомендацій щодо цього питання?


Також щодо цієї теми - stackoverflow.com/questions/33341955/…
Пітер

Відповіді:


169

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, щоб побачити відповідну реалізацію автозавантажувача.


Отже, якщо я створю інший файл під назвою bootstrap.php і розміщую автозавантажувач всередині разом з $ circle = new Circle (); Він включає Circle.php, але я отримую помилку: Фатальна помилка: Клас "Форма" не знайдено в ... / Circle.php у рядку 6. Здається, він завантажує Circle.php, але не завантажує Shape.php. як: клас Circle розширюється. ShapeInterface
Shawn Northrop,

Якщо я видаляю простір імен з вищевказаних класів, автозавантажувач справно працює. Однак, коли у мене є інтерфейс класу форм, я отримую вищезгадану помилку
Шон Нортроп

1
Створив суть, щоб навести приклад. На жаль, у списках не може бути підпапок. Помістіть bootstrap.php у папку та покладіть інші класи у підпапку під назвою "Shape".
cmbuckley

13

Якщо вам потрібно замовити свій код у просторах імен, просто використовуйте ключове слово 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;.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.