详细分析PHP 命名空间(namespace)

2020-06-30 19:00:05丽君

<?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
?>

命名空间和动态语言特征

PHP 命名空间的实现受到其语言自身的动态特征的影响。因此,如果要将下面的代码转换到命名空间中,动态访问元素。

example1.php 文件代码:

<?php
class classname
{
  function __construct()
  {
    echo __METHOD__,"n";
  }
}
function funcname()
{
  echo __FUNCTION__,"n";
}
const constname = "global";

$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "n"; // prints global
?>

必须使用完全限定名称(包括命名空间前缀的类名称)。注意因为在动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。

动态访问命名空间的元素

<?php
namespace namespacename;
class classname
{
  function __construct()
  {
    echo __METHOD__,"n";
  }
}
function funcname()
{
  echo __FUNCTION__,"n";
}
const constname = "namespaced";

include 'example1.php';

$a = 'classname';
$obj = new $a; // 输出 classname::__construct
$b = 'funcname';
$b(); // 输出函数名
echo constant('constname'), "n"; // 输出 global

/* 如果使用双引号,使用方法为 "namespacenameclassname"*/
$a = 'namespacenameclassname';
$obj = new $a; // 输出 namespacenameclassname::__construct
$a = 'namespacenameclassname';
$obj = new $a; // 输出 namespacenameclassname::__construct
$b = 'namespacenamefuncname';
$b(); // 输出 namespacenamefuncname
$b = 'namespacenamefuncname';
$b(); // 输出 namespacenamefuncname
echo constant('namespacenameconstname'), "n"; // 输出 namespaced
echo constant('namespacenameconstname'), "n"; // 输出 namespaced
?>

namespace关键字和__NAMESPACE__常量

PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__ 魔术常量和namespace关键字。

常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。

__NAMESPACE__ 示例, 在命名空间中的代码

<?php
namespace MyProject;

echo '"', __NAMESPACE__, '"'; // 输出 "MyProject"
?>

__NAMESPACE__ 示例,全局代码

<?php

echo '"', __NAMESPACE__, '"'; // 输出 ""
?>

常量 __NAMESPACE__ 在动态创建名称时很有用,例如:

使用__NAMESPACE__动态创建名称

<?php
namespace MyProject;

function get($classname)
{
  $a = __NAMESPACE__ . '' . $classname;
  return new $a;
}
?>								 
			 
相关文章 大家在看