3
回答
php使用命名空间:导入导出之疑问

PHP从5.3开始引入了命名空间的概念,估计大多数开发同学都是不太熟悉,甚至绝大多数人没听说过。今天我把这个前卫的概念带给大家,哈哈。大家可以看官网的文档http://www.php.net/manual/zh/language.namespaces.php,多多了解。好了,我的问题了来了,我没看懂这个用法,详见http://php.net/manual/zh/language.namespaces.importing.php,我把代码也贴下,如下代码.我认为他这里的 new namespace\Another就是在我根目录下有个foo的文件夹,然后foo文件夹下有个Another.php的文件,文件里面就是一个Another的类,但是按照我的设想是错误的,运行报错提示: PHP Fatal error:  Class 'foo\Another' not found....

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




PHP
举报
pyruby
发帖于5年前 3回/7K+阅
共有3个答案 最后回答: 5年前

题主看来真是现学的,好吧那咱就说说吧

首先题主要搞清楚一个概念,PHP命名空间中的  foo\Another 并不一定是指:当前目录下有个foo目录,里面有个Another 文件,文件内有个 Another Class 这个概念是完全错误的!(或者说这是一种习惯或规范)

!!PHP命名空间的注册仅仅是一个字符符号注册而已,和任何目录、文件没有关系!!

所以命名空间的操作 一般会借助于 autoload 来自动加载文件,说白了还是需要 require 文件的。

只不过这个过程被 autoload 消化掉了,至于 autoload 怎么去引入文件 那要看你怎么编写 autoload 函数了。

例如:当autoload接收到参数为 foo\Another 时,把 foo 替换成 fooPlugin 然后去目录找文件 fooPlugin/Another.php 也很正常。

然后进行 require 文件,当 require 成功时(Another.php 内肯定要声明自己的命名空间,达到注册的目的), 此时你使用 foo\Another 系统会在已注册的命名空间符号内搜索(上面已经注册了):foo\Another直接实例化。

总结:

1、namespace 仅仅是符号注册! 和目录,文件没关系,具体引入文件需要依赖于 autoload。

2、补充autoload知识:当用户去实例化一个不存在的类/命名空间时,会触发用户已经注册的 autoload 函数,在此函数内可以进行字符串目录、文件拼接,最后require进来相应文件。此时 这个类就堂而皇之的存在了。So... 你 new 成功了。

autoload注册详见:http://cn2.php.net/manual/zh/function.spl-autoload-register.php

顶部