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 对象 ?>
还是看<arel="nofollow">http://www.php.net/manual/zh/language.namespaces.php下面的
题主看来真是现学的,好吧那咱就说说吧
首先题主要搞清楚一个概念,PHP命名空间中的 foo\Another并不一定是指:当前目录下有个foo目录,里面有个Another文件,文件内有个 AnotherClass这个概念是完全错误的!<spanstyle="line-height:1.5;font-size:10pt;">(或者说这是一种习惯或规范)<spanstyle="line-height:1.5;font-size:10pt;">。
<spanstyle="color:#E53333;">!!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注册详见:<atarget="_blank"rel="nofollow">http://cn2.php.net/manual/zh/function.spl-autoload-register.php
<spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:14px;line-height:22px;background-color:#FFFFFF;">newnamespace\Another
<spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:14px;line-height:22px;background-color:#FFFFFF;">即在当前NS(foo)下,与newfoo\Another是相同的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。