Пространства имён
The keyword ‘use’ has two different applications, but the reserved word table links to here.
It can apply to namespace constucts:
file1:
class Cat <
static function says () > ?>
file2:
class Dog static function says () > ?>
file3:
class Animal static function breathes () > ?>
file4:
include ‘file1.php’ ;
include ‘file2.php’ ;
include ‘file3.php’ ;
use foo as feline ;
use bar as canine ;
use animate ;
echo \feline\Cat :: says (), «
\n» ;
echo \canine\Dog :: says (), «
\n» ;
echo \animate\Animal :: breathes (), «
\n» ; ?>
Note that
felineCat::says()
should be
\feline\Cat::says()
(and similar for the others)
but this comment form deletes the backslash (why. )
The ‘use’ keyword also applies to closure constructs:
$callback =
function ( $pricePerItem ) use ( $tax , & $total )
$total += $pricePerItem * ( $tax + 1.0 );
>;
array_walk ( $products_costs , $callback );
return round ( $total , 2 );
>
?>
7 years ago
Tested on PHP 7.0.5, Windows
The line «use animate;» equals the line «use animate as animate;»
but the «use other\animate;» equals «use other\animate as animate;»
file1:
class Cat <
static function says () > ?>
file2:
class Dog static function says () > ?>
file3:
class Animal static function breathes () > ?>
file4:
include ‘file1.php’ ;
include ‘file2.php’ ;
include ‘file3.php’ ;
use foo as feline ;
use bar as canine ;
use other\animate ; //use other\animate as animate;
echo feline\Cat :: says (), «
\n» ;
echo canine\Dog :: says (), «
\n» ;
echo \animate\Animal :: breathes (), «
\n» ; ?>
8 years ago
In addition to using namespaces and closures, the use keyword has another new meaning as of PHP 5.4 — using traits:
trait Hello public function sayHello () echo ‘Hello ‘ ;
>
>
trait World public function sayWorld () echo ‘World’ ;
>
>
class MyHelloWorld use Hello , World ;
public function sayExclamationMark () echo ‘!’ ;
>
>
Что такое namespace php
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
PHP поддерживает два способа доступа к абстрактным элементам в текущем пространстве имён таким, как магическая константа __NAMESPACE__ и ключевое слово namespace .
Значение константы __NAMESPACE__ — это строка, которая содержит имя текущего пространства имён. В глобальном пространстве, вне пространства имён, она содержит пустую строку.
Пример #1 Пример использование константы __NAMESPACE__ в коде с пространством имён
echo ‘»‘ , __NAMESPACE__ , ‘»‘ ; // выводит «MyProject»
?>
Пример #2 Пример использование константы __NAMESPACE__ в глобальном пространстве
echo ‘»‘ , __NAMESPACE__ , ‘»‘ ; // выводит «»
?>
Константа __NAMESPACE__ полезна для динамически конструируемых имён, например:
Пример #3 использование константы __NAMESPACE__ для динамического конструирования имени
function get ( $classname )
$a = __NAMESPACE__ . ‘\\’ . $classname ;
return new $a ;
>
?>
Ключевое слово namespace может быть использовано для явного запроса элемента из текущего пространства имён или из подпространства. Это эквивалент оператора self для классов в пространстве имён.
Пример #4 Оператор namespace, внутри пространства имён
use blah\blah as mine ; // смотрите «Использование пространств имён: импорт/создание псевдонима имени»
blah\mine (); // вызывает функцию MyProject\blah\mine()
namespace\blah\mine (); // вызывает функцию MyProject\blah\mine()
namespace\func (); // вызывает функцию MyProject\func()
namespace\sub\func (); // вызывает функцию MyProject\sub\func()
namespace\cname :: method (); // вызывает статический метод «method» класса MyProject\cname
$a = new namespace\sub\cname (); // Создаёт экземпляр класса MyProject\sub\cname
$b = namespace\CONSTANT ; // присваивает значение константы MyProject\CONSTANT переменной $b
?>
Пример #5 Оператор namespace в глобальном коде
namespace\func (); // вызывает функцию func()
namespace\sub\func (); // вызывает функцию sub\func()
namespace\cname :: method (); // вызывает статический метод «method» класса cname
$a = new namespace\sub\cname (); // Создаёт экземпляр класса sub\cname
$b = namespace\CONSTANT ; // присваивает значение константы CONSTANT переменной $b
?>
Что такое namespace php
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Что такое пространства имён? В широком смысле — это один из способов инкапсуляции элементов. Такое абстрактное понятие можно увидеть во многих местах. Например, в любой операционной системе директории служат для группировки связанных файлов и выступают в качестве пространства имён для находящихся в них файлов. В качестве конкретного примера файл foo.txt может находиться сразу в обеих директориях: /home/greg и /home/other , но две копии foo.txt не могут существовать в одной директории. Кроме того, для доступа к foo.txt извне директории /home/greg , мы должны добавить имя директории перед именем файла используя разделитель, чтобы получить /home/greg/foo.txt . Этот же принцип распространяется и на пространства имён в программировании.
В PHP пространства имён используются для решения двух проблем, с которыми сталкиваются авторы библиотек и приложений при создании повторно используемых элементов кода, таких как классы и функции:
- Конфликт имён между вашим кодом и внутренними классами/функциями/константами PHP или сторонними.
- Возможность создавать псевдонимы (или сокращения) для Ну_Очень_Длинных_Имён, чтобы облегчить первую проблему и улучшить читаемость исходного кода.
Пространства имён в PHP предоставляют возможность группировать логически связанные классы, интерфейсы, функции и константы.
Пример #1 Пример синтаксиса, использующего пространство имён
namespace my\name ; // смотрите раздел «Определение пространств имён»
class MyClass <>
function myfunction () <>
const MYCONST = 1 ;
?php
$a = new MyClass ;
$c = new \my\name\MyClass ; // смотрите раздел «Глобальная область видимости»
$a = strlen ( ‘hi’ ); // смотрите раздел «Использование пространств имён: возврат
// к глобальной функции/константе»
$d = namespace\MYCONST ; // смотрите раздел «оператор пространства имён и
// константа __NAMESPACE__»
$d = __NAMESPACE__ . ‘\MYCONST’ ;
echo constant ( $d ); // смотрите раздел «Пространства имён и динамические особенности языка»
?>
Замечание: Имена пространств имён регистронезависимы.
Замечание:
Пространства имён PHP или составные имена, начинающиеся с этого слова (например, такие как PHP\Classes ), зарезервированы для нужд языка, их не следует использовать в пользовательском коде.
User Contributed Notes 7 notes
12 years ago
Thought this might help other newbies like me.
Name collisions means:
you create a function named db_connect, and somebody elses code that you use in your file (i.e. an include) has the same function with the same name.
To get around that problem, you rename your function SteveWa_db_connect which makes your code longer and harder to read.
Now you can use namespaces to keep your function name separate from anyone else’s function name, and you won’t have to make extra_long_named functions to get around the name collision problem.
So a namespace is like a pointer to a file path where you can find the source of the function you are working with
12 years ago
Just a note: namespace (even nested or sub-namespace) cannot be just a number, it must start with a letter.
For example, lets say you want to use namespace for versioning of your packages or versioning of your API:
namespace Mynamespace\1; // Illegal
Instead use this:
namespace Mynamespace\v1; // OK
8 years ago
To people coming here by searching about namespaces, know that a consortium has studied about best practices in PHP, in order to allow developers to have common coding standards.
These best practices are called «PHP Standard Recommendations» , also known as PSR.
They are visible on this link : http://www.php-fig.org/psr
Actually there are 5 coding standards categories :
PSR-0 : Autoloading Standard , which goal is to make the use of Namespaces easier, in order to convert a namespace into a file path.
PSR-1 : Basic Coding Standard , basically, standards 🙂
PSR-2 : Coding Style Guide, where to put braces, how to write a class, etc.
PSR-3 : Logger Interface , how to write a standard logger
PSR-4 : Improved Autoloading , to resolve more Namespaces into paths.
The ones I want to point are PSR-0 and PSR-4 : they use namespaces to resolve a FQCN (Fully qualified class name = full namespace + class name) into a file path.
Basic example, you have this directory structure :
./src/Pierstoval/Tools/MyTool.php
The namespacing PSR-0 or PSR-4 standard tells that you can transform this path into a FQCN.
Read the principles of autoload if you need to know what it means, because it’s almost mandatory 😉 .
// /index.php
include ‘autoloader.php’ ;
$tool = new Pierstoval / Tools / MyTool ();
?>
// /src/Pierstoval/Tools/MyTool.php
namespace Pierstoval\Tools ;
class MyTool <>
?>
// /autoloader.php
function loadClass ( $className ) $fileName = » ;
$namespace = » ;
// Sets the include path as the «src» directory
$includePath = dirname ( __FILE__ ). DIRECTORY_SEPARATOR . ‘src’ ;
if ( false !== ( $lastNsPos = strripos ( $className , ‘\\’ ))) $namespace = substr ( $className , 0 , $lastNsPos );
$className = substr ( $className , $lastNsPos + 1 );
$fileName = str_replace ( ‘\\’ , DIRECTORY_SEPARATOR , $namespace ) . DIRECTORY_SEPARATOR ;
>
$fileName .= str_replace ( ‘_’ , DIRECTORY_SEPARATOR , $className ) . ‘.php’ ;
$fullFileName = $includePath . DIRECTORY_SEPARATOR . $fileName ;
if ( file_exists ( $fullFileName )) require $fullFileName ;
> else echo ‘Class «‘ . $className . ‘» does not exist.’ ;
>
>
spl_autoload_register ( ‘loadClass’ ); // Registers the autoloader
?>
A standardized autoloader will get the class you want to instanciate (MyTool) and get the FQCN, transform it into a file path, and check if the file exists. If it does, it will it, and if you wrote your class correctly, the class will be available within its correct namespace.
Then, if you have the following code :
The autoloader will transform the FQCN into this path :
/src/Pierstoval/Tools/MyTool.php
This might be the best practices ever in PHP framework developments, such as Symfony or others.
Что такое namespace php
Пространства имен позволяют избежать конфликта имен и сгруппировать функционал. Внутри пространства имен могут быть размещены классы, интерфейсы, функции и константы.
Если какая-та конструкция (например, класс или функция) определена вне любого пространства имен, то считается, что она расположена в глобальном пространстве имен.
Определение пространства имен
Для создания пространства имен применяется директива namespace , после которой идет название пространства имен:
namespace base; class Person < private $name; function __construct($name) < $this->name = $name; > >
В данном случае определено пространство имен «base». Обычно названия пространств указываются в нижнем регистре. Все, что расположено ниже этой директивы, относится к пространству имен «base». То есть класс Person принадлежит пространству имен base.
Стоит учитывать, что определение пространства имен должно быть расположено выше любого другого кода или разметки html. Например:
name = $name; > > ?>METANIT.COM name; ?>
Обращение к пространству имен
Для обращения к конструкциям из пространства имен перед названием конструкции через слеш указывается ее пространство имен. Например, у нас есть файл Person.php :
name = $name; > > ?>
Теперь в другом файле подключим этот файл и обратимся к классу Person:
name; ?>
Здесь определено другое пространство имен — «work». Сначала в нем подключается файл «Person.php». Затем создаем объект класса Person.
Если конструкции одного пространства имен используются в другом пространстве имен (в том числе в глобальном пространстве имен), то перед названием конструкции указывается название ее пространства имен. Так, поскольку класс Person расположен в другом пространстве имен — «base», то перед названием класса указываем его полное имя с учетом его пространства имен:
$tom = new \base\Person("Tom");
Обратите внимание, что сначала идет слеш, потом название пространства имен и потом через слеш название класса ( \base\Person ).
Без указания пространства имен мы можем использовать конструкцию только в том же пространстве имен, в котором она определена.
Вложенные пространства имен
Одни пространства имен могут содержать другие. Например:
name = $name; > > ?>
Здесь класс Person определен в пространстве имен base\classes\ . То есть теперь для обращения к классу Person в другом пространстве имен надо указывать \base\classes\Person :
name; ?>
Псевдонимы
Если в одном пространстве имен используется какой-то класс из другого пространства имен, то писать каждый раз полное имя класса с учетом его пространства имен может быть утомительно, кроме того, перегружает код. Например:
name . "
"; $bob = new \base\classes\Person("Bob"); echo $bob->name; ?>
В этом случае мы можем использовать псевдонимы, которые задаются в виде
use полное_имя_класса as псевдоним;
Конструкция use импортирует класс из другого пространства имен, а оператор as устанавливает для него псевдоним.
Так, сократим предыдущий код с помощью псевдонимов:
name . "
"; $bob = new User("Bob"); echo $bob->name; ?>
В данном случае для класса \base\classes\Person установлен псевдоним User , соответственно теперь для обращения к классу Person мы можем использовать его псевдоним User. Результат тот же, но кода меньше.
Можно использовать только конструкцию use без указания псевдонима. Тогда класс можно будет исользовать по его непосредственному имени:
name . "
"; $bob = new Person("Bob"); echo $bob->name; ?>
Подключение множества классов
Подобным образом можно подключать сразу несколько классов. Например, пусть в файле Person.php имеются следующие классы:
name = $name; > > class Employee extends Person < >?>
Подключение классов Person и Employee:
name . "
"; $sam = new Employee("Sam"); echo $sam->name; ?>
Определение псевдонимов можно сократить:
use \base\classes\;
Подключение констант и функций
Для подключения констант применяется инструкция use const , а для подключения функций — use function .
Например, определение файла Person.php :
name . "
"; > class Person < public $name; function __construct($name) < $this->name = $name; > > ?>
Подключим класс Person вместе с константой adminName и функцией printPerson:
