MyTetra Share
Делитесь знаниями!
Пространства имен в PHP 5.3 - Использование пространства имен: основы
Время создания: 26.03.2017 19:44
Раздел: Компьютер - Программирование - Язык PHP
Запись: xintrea/mytetra_syncro/master/base/149054668337bgbof31m/text.html на raw.github.com

До обсуждения использования пространств имен важно понять, как PHP узнает какие элементы из пространства имен запрашиваются в вашем коде. Можно провести аналогию между пространствами имен PHP и файловой системой. Есть три способа обратиться к файлу в файловой системе:

  1. Относительное имя файла, такое как foo.txt, преобразуемое в currentdirectory/foo.txt, где currentdirectory текущая директория, в которой мы находимся. Тогда, если текущая директория /home/foo, то имя преобразуется в /home/foo/foo.txt.
  2. Относительное имя пути, такое как subdirectory/foo.txt, преобразуется в currentdirectory/subdirectory/foo.txt.
  3. Абсолютное имя пути, такое как /main/foo.txt, которое остается таким же: /main/foo.txt.

Тот же принцип применим и к элементам из пространств имен PHP. Для примера, имя класса может быть указано тремя способами:

  1. Неполные имена (имена классов без префикса), такие как $a = new foo(); или foo::staticmethod();. Если текущее пространство имен currentnamespace, то эти имена преобразуются в currentnamespace\foo. Если код находится в глобальном пространстве имен, то имена остаются такими же: foo. Предупреждение: неполные имена для функций и констант будут определяться в глобальном пространстве имен, если они не определены в текущем пространстве имен. Подробнее в Использование пространств имен: доступ к глобальным функциям и классам.
  2. Полные имена (имена классов с префиксами), такие как $a = new subnamespace\foo(); или subnamespace\foo::staticmethod();. Если текущее пространство имен currentnamespace, то эти имена преобразуются в currentnamespace\subnamespace\foo. Если код находится в глобальном пространстве имен, то имена преобразуются в subnamespace\foo.
  3. Абсолютные имена или имена с предшествующим префиксом, обозначающим глобальное пространство. $a = new \currentnamespace\foo(); или \currentnamespace\foo::staticmethod();. Имена всегда определяются так же, как и записаны: currentnamespace\foo. Следует обратить внимание, что в начале абсолютного имени всего используется апостроф '\'.

Ниже приведен пример трех вариантов синтаксиса в реальном коде:

file1.php

<?php
namespace Foo\Bar\subnamespace;

const FOO = 1;

function foo() {}

class foo
{
    static function staticmethod() {}
}
?>

file2.php

<?php
namespace Foo\Bar;

include 'file1.php';

const FOO = 2;

function foo() {}

class foo
{
    static function staticmethod() {}
}

/* Неполные имена (другое название - неквалификационные имена)*/
foo(); // определяется как функция Foo\Bar\foo, то есть в текущем пространстве имен
foo::staticmethod(); // определяется как класс Foo\Bar\foo с методом staticmethod
echo FOO; // определяется как константа Foo\Bar\FOO

/* Полные имена (другое название - квалификационные имена)*/
subnamespace\foo(); // определяется как функция Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // определяется как класс Foo\Bar\subnamespace\foo
                                  // c методом staticmethod
echo subnamespace\FOO; // определяется как константа Foo\Bar\subnamespace\FOO
                                  
/* Абсолютные имена (другое название - полные квалификационные имена)*/
\Foo\Bar\foo(); // определяется как функция Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // определяется как класс Foo\Bar\foo с методом staticmethod
echo \Foo\Bar\FOO; // определяется как константа Foo\Bar\FOO
?>

Обратите внимание, что для доступа к любым глобальным классам, функциям или константам, может использоваться абсолютное имя, такое как \strlen(), или \Exception, или \INI_ALL.

Пример #1 Доступ к глобальным классам, функциям и константам из пространства имен

<?php
namespace Foo;

function strlen() {}
const INI_ALL = 3;
class Exception {}

$a = \strlen('hi'); // вызывает глобальную функцию strlen
$b = \INI_ALL; // получает доступ к глобальной константе INI_ALL
$c = new \Exception('error'); // Создает экземпляр глобального класса Exception
?>



Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования