1 命名空间
1.1 概述
<?php namespace my\name; class MyClass {} function myfunction() {} const MYCONST = 1; namespace other\name { //... } $a = new MyClass; $c = new \my\name\MyClass; $a = strlen('hi'); $d = namespace\MYCONST; $d = __NAMESPACE__ . '\MYCONST'; echo constant($d); ?>上面展示了命名空间相关的概念,下面详细介绍每个点。
命名空间的定义比较简单,1 种方式为在页面的第一行定义 namespace name。若一页有多个命令空间则推荐使用C++语法的命名空间定义。
层次化命名空间的定义采用路径格式 level1\level2\level3
1.2 命名空间的使用
假定当前的命名空间为A,则当前空间中出现的名称在查找时,都从A\中开始查找,因此若当前命名空间中定义了与全局空间重名的变量,要访问全局空间的内容,需要\开始。除非当前命名空间中未定义,从而可以不需要从/开始。
对于没有定义于全局命名空间的东西,都存在于全局命名空间中。
对于动态使用命名空间的方法如下:
<?php namespace namespacename; class classname { function __construct() { echo __METHOD__,"\n"; } } function funcname() { echo __FUNCTION__,"\n"; } const constname = "namespaced"; include 'global.php'; $a = 'classname'; $obj = new $a; // prints classname::__construct $b = 'funcname'; $b(); // prints funcname echo constant('constname'), "\n"; // prints global /* note that if using double quotes, "\\namespacename\\classname" must be used */ $a = '\namespacename\classname'; $obj = new $a; // prints namespacename\classname::__construct $a = 'namespacename\classname'; $obj = new $a; // also prints namespacename\classname::__construct $b = 'namespacename\funcname'; $b(); // prints namespacename\funcname $b = '\namespacename\funcname'; $b(); // also prints namespacename\funcname echo constant('\namespacename\constname'), "\n"; // prints namespaced echo constant('namespacename\constname'), "\n"; // also prints namespaced ?>
1.3 命名空间的导入
类似于C++,PHP使用use导入命名空间,同时支持以as的方式为长的命名空间起一个别名,为了简化,也支持一行导入多个命名空间。
<?php namespace foo; use My\Full\Classname as Another; // 下面的例子与 use My\Full\NSname as NSname 相同 use My\Full\NSname; // 导入一个全局类 use \ArrayObject; $obj = new namespace\Another; // 实例化 foo\Another 对象 $obj = new Another; // 实例化 My\Full\Classname 对象 NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func $a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象 // 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象 ?>
1.4 命名解析
PHP对于不同的名字有不同的解析查找策略。
对于类而言,仅仅查找当前命名空间中类的命名,若要访问全局命名的类,则需要按完全限定的方式从根\声明。
对于函数和常量而言,如果当前命名空间中不存在该函数或常量,PHP 会退而使用全局空间中的函数或常量。
1.5 名称解析规则
2 异常
PHP中引入了类似JAVA等的异常,使用都大同小异,若用户未捕获异常,代码会产生一个异常未捕获的错误,用户可以定义set_exception_handler()方法来处理这些异常。
用户定义的异常最好能初始化内置异常。
class MyException extends Exception { // 重定义构造器使 message 变为必须被指定的属性 public function __construct($message, $code = 0) { // 自定义的代码 // 确保所有变量都被正确赋值 parent::__construct($message, $code); } // 自定义字符串输出的样式 public function __toString() { return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; } public function customFunction() { echo "A Custom function for this type of exception\n"; } }