请教一个关于laravel和tp框架中的namespace和use的问题?
- 想请教下tp和laravel框架中命名空间的问题.
在学框架之前, 对命名空间的了解如下段代码:
<?php namespace china; class Person{} function show(){ echo "你好"; } const NAME = "zhangsan"; namespace usa; use china\Person; use function china\show; use const china\NAME; var_dump(new Person()); //object(china\Person)#1 (0) { } show(); //你好 echo NAME; //zhangsan //像命名空间的作用, 空间元素的3种访问方式有所了解, 但解释不了下面疑惑.
- 但是在php框架中
- 图一
- 图二
- 所以对框架中的namespace和use的用法感到很疑惑, 使用namespace和use时, 到底该从哪一级目录开始写起呢?
- 之前觉得是从目录的顶级写起, 像这样
namespace \vendor\laravel\framework\src\Illuminate\Http
. (C:UsersJINDesktoplaravel_project这里是复制文件夹路径时, 忘记删了这部分). 但是laravel框架是写成namespace Illuminate\Http
.- 所以感到非常纳闷, 有点无所适从, 究竟该怎么正确理解这个问题呢?? 有什么确切的规则吗?? 多谢了
- 看的视频课程, 命名空间课程里没讲到psr和自动加载这些. 项目框架视频里讲师 将命名空间当作基础知识, 默认大家都懂, 也没讲到命名空间.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
namespace china;
class Person{}
你这样写,说明china 是你的根目录,下面有个 Person 文件。
图一
是框架里面的写法。
利用composer 定义根路径。你可以看下 http 这个目录下,有个composer.json 文件,里面有
"autoload": {
这边定义了根路径,会把根目录指向 Illuminate。所以可以这样写。下面的use 类似。
图2
你的项目下 有 composer.json 文件,定义这样:
"autoload": {
namespace 可以在项目里面定义多个根路径,相互不会影响。
namespace 是一种逻辑的文件路径写法,不像 这种:
C:UsersJINDesktoplaravel_projectvendorlaravelframeworksrcIlluminateHttp
物理的写法。
现在 namespace 和 composer 会结合使用,composer 都会用到 namespace,你可以看下 composer 的文档。
在讨论如何使用命名空间之前,必须了解 PHP 是如何知道要使用哪一个命名空间中的元素的。可以将 PHP 命名空间与文件系统作一个简单的类比。在文件系统中访问一个文件有三种方式:
1、相对文件名形式如foo.txt。它会被解析为 currentdirectory/foo.txt,其中 currentdirectory 表示当前目录。因此如果当前目录是 /home/foo,则该文件名被解析为/home/foo/foo.txt。
2、相对路径名形式如subdirectory/foo.txt。它会被解析为 currentdirectory/subdirectory/foo.txt。
3、绝对路径名形式如/main/foo.txt。它会被解析为/main/foo.txt。
PHP 命名空间中的元素使用同样的原理。例如,类名可以通过三种方式引用:
1、非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。详情参见 使用命名空间:后备全局函数名称/常量名称。
2、限定名称,或包含前缀的名称,例如 $a = new subnamespacefoo(); 或 subnamespacefoo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespacesubnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespacefoo。
3、完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new currentnamespacefoo(); 或 currentnamespacefoo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespacefoo。
https://www.baidu.com/s?ie=UT...