请教一个关于laravel和tp框架中的namespace和use的问题?

发布于 2022-09-11 21:16:48 字数 1140 浏览 17 评论 0

  1. 想请教下tp和laravel框架中命名空间的问题.
  2. 在学框架之前, 对命名空间的了解如下段代码:

    <?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种访问方式有所了解, 但解释不了下面疑惑.
  3. 但是在php框架中
  • 图一

    图片描述

  • 图二
    图片描述
  1. 所以对框架中的namespace和use的用法感到很疑惑, 使用namespace和use时, 到底该从哪一级目录开始写起呢?
  2. 之前觉得是从目录的顶级写起, 像这样 namespace \vendor\laravel\framework\src\Illuminate\Http. (C:UsersJINDesktoplaravel_project这里是复制文件夹路径时, 忘记删了这部分). 但是laravel框架是写成namespace Illuminate\Http.
  3. 所以感到非常纳闷, 有点无所适从, 究竟该怎么正确理解这个问题呢?? 有什么确切的规则吗?? 多谢了
  4. 看的视频课程, 命名空间课程里没讲到psr和自动加载这些. 项目框架视频里讲师 将命名空间当作基础知识, 默认大家都懂, 也没讲到命名空间.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

那请放手 2022-09-18 21:16:48

namespace china;
class Person{}
你这样写,说明china 是你的根目录,下面有个 Person 文件。

图一
是框架里面的写法。
利用composer 定义根路径。你可以看下 http 这个目录下,有个composer.json 文件,里面有
"autoload": {

    "psr-4": {
        "Illuminate\\Http\\": ""
    }
},

这边定义了根路径,会把根目录指向 Illuminate。所以可以这样写。下面的use 类似。

图2
你的项目下 有 composer.json 文件,定义这样:
"autoload": {

    "psr-4": {
        "App\\": "app/"
    }
},
表明你的项目是已app 为根路径的。所以可以那样写。

namespace 可以在项目里面定义多个根路径,相互不会影响。
namespace 是一种逻辑的文件路径写法,不像 这种:
C:UsersJINDesktoplaravel_projectvendorlaravelframeworksrcIlluminateHttp
物理的写法。
现在 namespace 和 composer 会结合使用,composer 都会用到 namespace,你可以看下 composer 的文档。

套路撩心 2022-09-18 21:16:48
  • 命名空间只是限定空间,并不像 Java 那样必须要限定目录与映射, 你可以自己随便创建两个文件,命名空间随便写都行,只要你把文件 require 后,use 一下就能使用,文件不需要与目录映射。
  • 命名空间与目录文件映射是 PSR-4 所规定的之一。
  • 无论是过去与现在,自动载入都是框架的重要部分之一。现在主流框架都是采用 Composer 来进行自动载入,当 composer 生成 autoload 文件时,会去读取包目录下的 composer.json 解析其中的 autoload 字段,并建立映射,在适当的世纪自动载入需要的类。

clipboard.png

春庭雪 2022-09-18 21:16:48

在讨论如何使用命名空间之前,必须了解 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。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文