V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dongchen
V2EX  ›  PHP

关于 PHP 命名空间的一个疑问

  •  
  •   dongchen · 2020-03-30 11:23:44 +08:00 · 3763 次点击
    这是一个创建于 1701 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在看《深入 PHP·面向对象、模式与实践这本书》,在第五章关于命名空间的文章中有如下一段代码

    <?php
    namespace popp\ch05\batch04\util;
    
    class Debug
    {
        public static function helloWorld()
        {
            print "hello from Debug";
        }
    }
    

    然后要在命名空间之外访问这个类

    <?php
    namespace main;
    
    \popp\ch05\batch04\util\Debug::helloWorld();
    popp\ch05\batch04\util\Debug::helloWorld();
    

    可是,不管是\popp\ch05\batch04\util\Debug::helloWorld();还是\popp\ch05\batch04\util\Debug::helloWorld();都是运行错误啊。

    第 1 条附言  ·  2020-03-30 12:17:25 +08:00

    多谢大家的指点,感觉还是基本不太牢靠,补点基础去了。

    19 条回复    2020-04-17 14:46:11 +08:00
    b821025551b
        1
    b821025551b  
       2020-03-30 11:29:01 +08:00   ❤️ 2
    你没 include/require
    fancy111
        2
    fancy111  
       2020-03-30 11:30:48 +08:00
    命名空间还 include ? use 啊
    littleylv
        3
    littleylv  
       2020-03-30 11:31:43 +08:00
    先 include,或者做 autoload
    leo108
        4
    leo108  
       2020-03-30 11:32:28 +08:00
    @fancy111 基础不牢地动山摇
    b821025551b
        5
    b821025551b  
       2020-03-30 11:33:24 +08:00
    @fancy111 #2 use 的前提是包中的文件需要提前 require 或者 include 进来。
    littleylv
        6
    littleylv  
       2020-03-30 11:35:31 +08:00
    @fancy111 #2 哥,没 include 你怎么 use ?
    而且可以不用 use,直接 \popp\ch05\batch04\util\Debug::helloWorld(); 就行
    和 use popp\ch05\batch04\util\Debug 然后 Debug::helloWorld(); 效果一样的

    基础不牢地动山摇+1
    littleylv
        7
    littleylv  
       2020-03-30 11:36:51 +08:00
    楼主面向对象的基础还没学牢,就《深入 PHP 》了。建议基础先学
    bzi
        8
    bzi  
       2020-03-30 11:51:32 +08:00
    没做自动加载你就得手动引入
    dongchen
        9
    dongchen  
    OP
       2020-03-30 11:57:18 +08:00
    @littleylv 这本书前面将对象基础的
    skyloongltl
        10
    skyloongltl  
       2020-03-30 11:58:24 +08:00
    自定义的类,不管哪种写法,都需要 include 或者 require 的。use 的话,就不用写前面“\popp\ch05\batch04\util\”这一串了,但是要用到自动加载,你可以百度一下 PHP 自动加载,挺简单的。
    Varobjs
        11
    Varobjs  
       2020-03-30 12:01:00 +08:00
    spl_autoload_register 了解下
    composer 了解下

    你这基础,建议看 php.net
    JJstyle
        12
    JJstyle  
       2020-03-30 12:04:48 +08:00
    这本书我之前看过,这是一本进阶的书,还是先多了解基础在看吧。
    yprisoner
        13
    yprisoner  
       2020-03-30 12:27:18 +08:00
    spl_autoload_register 了解下,psr-4 自动加载规范了解下
    dilu
        14
    dilu  
       2020-03-30 12:39:54 +08:00
    先 include
    然后自己写 spl_autoload_register 自动加载的逻辑
    yc8332
        15
    yc8332  
       2020-03-30 14:08:37 +08:00
    要有使用自动加载。
    star7th
        16
    star7th  
       2020-03-30 14:22:15 +08:00
    use 本身只是使用 php 语法逻辑上的命名空间,并不会真正加载那个 php 文件进来。文件是文件,语法解析是语法解析。当然如果做了自动加载文件之类的暗操作就另说。
    gidot
        17
    gidot  
       2020-03-31 17:56:32 +08:00
    需要使用 spl 做选择性加载。include 还是要 include 的。

    举一个简单的例子

    ```php

    function autoload_modules($class){
    $class = str_replace('\\', '\', $class);

    $file = APPLICATION_PATH . '/application/' . $class . '.php';
    if (file_exists($file)) {
    include_once($file);
    }
    }
    spl_autoload_register('autoload_modules');
    ```
    handsomehaitao
        18
    handsomehaitao  
       2020-04-14 09:27:14 +08:00
    你需要 composer 或者 required 引入进来
    gdt
        19
    gdt  
       2020-04-17 14:46:11 +08:00
    php 这个东西设计的真垃圾。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4548 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 04:07 · PVG 12:07 · LAX 20:07 · JFK 23:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.