18.07.2012 21:50:26

Поддержка пользовательского пространства имен появилась в php с версии 5.3.0

Как было раньше:
pic 1
Как стало:
pic 2
По сути, теперь в скрипте может быть несколько классов с одинаковыми именами, но в разных пространствах имен!

Новое пространство имен может быть задано одним из двух способов
(Внимание: в обоих случаях ключевое слово namespase должно быть расположено в самом начале файла сразу после <?php )

Способ первый:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
namespace A
{
  class class1
  {
    public static function say()
    {
      echo 'Я пространство имен А<br/>';
    }
  }
}
?>

Способ второй:

1
2
3
4
5
6
7
8
9
10
<?php
namespace A;
  class class1
  {
    public static function say()
    {
      echo 'Я пространство имен А';
    }
  }
?>

Как обратиться к классу расположенному в namespase?

Допустим, у нас есть еще один класс:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
namespace B
{
  class class1
  {
    public static function say()
    {
      echo 'Я пространство имен B<br/>';
    }
  }
}
?>

И файлы называются A.php и B.php, в соответствии с их пространствами имен.

Тогда, после подключения файлов, к классам можно обратиться так:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
// Подключаем файлы
require_once 'A.php';
require_once 'B.php';

// Обращаемся к классу A из пространства имен A
A\class1::say();
// Обращаемся к классу A из пространства имен B
B\class1::say();


// Такой способ выдаст ошибку, т.к. в глобальном пространстве имен нет класса A
# class1::say(); -- Class 'A' not found in ...

//Еще можно использовать зарезервированное слово USE
use A\class1;
// Тогда можно обращается к классам из неймспейса без его явного указания:
class1::say();


// Еще можно создавать алиасы:
use B AS NameSpace2;
NameSpace2\class1::say();
?>

Для того, что бы узнать в каком пространстве имен мы сейчас находимся можно использовать константу __NAMESPACE__, стоит учитывать, что вне namespace она будет пустой.


Тэги: PHP

Яндекс.Метрика