在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在讨论如何使用命名空间之前,必须了解 PHP 是如何知道要使用哪一个命名空间中的元素的。可以将 PHP 命名空间与文件系统作一个简单的类比。在文件系统中访问一个文件有三种方式:
PHP 命名空间中的元素使用同样的原理。例如,类名可以通过三种方式引用:
下面是一个使用这三种方式的实例: 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 resolves to function Foo\Bar\foo foo::staticmethod(); // 解析为类 Foo\Bar\foo的静态方法staticmethod。resolves to class Foo\Bar\foo, method staticmethod echo FOO; // resolves to constant Foo\Bar\FOO /* 限定名称 */ subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo, // 以及类的方法 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。 在命名空间内部访问全局类、函数和常量
<?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 ?> 转自:http://php.net/manual/zh/language.namespaces.basics.php 说明,php命名空间也可以使用:
} 这种形式定义。
起别名。
use Myproject/School as School1; // 别名
定义多个命名空间,简单组合语法
<?php namespace MyProject; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } namespace AnotherProject; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } ?> 不建议使用这种语法在单个文件中定义多个命名空间。建议使用下面的大括号形式的语法。 <?php namespace MyProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } namespace AnotherProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } ?> 在实际的编程实践中,非常不提倡在同一个文件中定义多个命名空间。这种方式的主要用于将多个 PHP 脚本合并在同一个文件中。 将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法。全局代码必须用一个不带名称的 namespace 语句加上大括号括起来,例如: 定义多个命名空间和不包含在命名空间中的代码
<?php namespace MyProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } namespace { // global code session_start(); $a = MyProject\connect(); echo MyProject\Connection::start(); } ?> 很奇怪的一点。 file1.php <?php namespace Foo\Bar\subnamespace; class foo { static function staticmethod(){ print "file1:staticmethod"."<br/>";} } userFile1.php <?php use Foo\Bar\subnamespace; require("file1.php"); $fooObj=new foo(); $fooObj->staticmethod(); 运行错误: Fatal error: Class 'foo' not found in F:\xampp\htdocs\php\pattern\namespace\userFile1.php 但是改为: <?php use Foo\Bar\subnamespace; require("file1.php"); $fooObj=new Foo\Bar\subnamespace\foo(); $fooObj->staticmethod(); 就正常了。 好像这里的use Foo\Bar\subnamespace;没什么用,我去掉后还是正常。 这里用了use和没有user没什么区别嘛!我换成下面一种形式,不要在类前面加namespace,也可以。 <?php use Foo\Bar\subnamespace\foo; //命名空间后加类名 require("file1.php"); $fooObj=new foo(); $fooObj->staticmethod();
这个和autoload使用: <?php use Library\Controller\FrontController; function __autoload($className) { require_once($className.'.php'); } $frontController=new FrontController(array( "Controller"=>'Test', 'action'=>'show', 'params'=>array(1) )); $frontController->run(); FrontController在当前文件目录下定义,文件名和类名相同。但是报错: Fatal error: require_once(): Failed opening required 'Library\Controller\FrontController.php' (include_path='.;F:\xampp\php\PEAR;F:\xampp\zend\library') inF:\xampp\htdocs\php\pattern\frontController\index.php 在autoload里面require的是 Library\Controller\FrontController
而不是: FrontController .
http://stackoverflow.com/questions/1830917/how-do-i-use-php-namespaces-with-autoload 看到 风雪 之隅的一篇文章: PHP的命名空间, 实现的还真是简单. 当你有如下代码:
其实就相当于, 你声明了一个名字为A\B的类, 当然, 你不能直接这么申明(只是不能在PHP脚本中这么申明). 而在使用过程中, 根据PHP手册中命名空间一节所述, 执行时刻, 无论你是使用use, 还是直接写相对名字, 绝对名字, 最后去class表查询的时候, 都是被转换成了最终的类似上面的类名. 比如:
不能不说, PHP的这种命名空间解决方案 ,是代价最小, 影响最小的解决方案. 对于扩展开发者来说, 这种影响更是微小, 你只需要在INIT_CLASS_ENTRY的时刻, 把原来的形如”Yaf_Application”变为”Yaf\\Application”, 就可以实现自己的命名空间. http://www.laruence.com/2010/10/12/1763.html php manual里有重要的将命名空间是如何解析的: http://www.php.net/manual/zh/language.namespaces.rules.php 名称解析规则在说明名称解析规则之前,我们先看一些重要的定义: 命名空间名称定义
名称解析遵循下列规则:
。。。后面没有理解。
一篇非常好的系列文章; http://www.sitepoint.com/php-53-namespaces-basics/
|
2022-08-17
2022-08-12
2022-11-06
2022-07-18
2022-08-15
请发表评论