开发者社区> 问答> 正文

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




展开
收起
爱吃鱼的程序员 2020-06-22 13:43:58 479 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    还是看<arel="nofollow">http://www.php.net/manual/zh/language.namespaces.php下面的

    UserContributedNotes吧,就能看懂了

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

    首先题主要搞清楚一个概念,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是相同的。


    2020-06-22 13:44:17
    赞同 展开评论 打赏
问答分类:
PHP
问答地址:
问答排行榜
最热
最新

相关电子书

更多
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
PHP安全开发:从白帽角度做安全 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载