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

2020-03-30 11:23:44 +08:00
 dongchen

最近在看《深入 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();都是运行错误啊。

3797 次点击
所在节点    PHP
19 条回复
b821025551b
2020-03-30 11:29:01 +08:00
你没 include/require
fancy111
2020-03-30 11:30:48 +08:00
命名空间还 include ? use 啊
littleylv
2020-03-30 11:31:43 +08:00
先 include,或者做 autoload
leo108
2020-03-30 11:32:28 +08:00
@fancy111 基础不牢地动山摇
b821025551b
2020-03-30 11:33:24 +08:00
@fancy111 #2 use 的前提是包中的文件需要提前 require 或者 include 进来。
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
2020-03-30 11:36:51 +08:00
楼主面向对象的基础还没学牢,就《深入 PHP 》了。建议基础先学
bzi
2020-03-30 11:51:32 +08:00
没做自动加载你就得手动引入
dongchen
2020-03-30 11:57:18 +08:00
@littleylv 这本书前面将对象基础的
skyloongltl
2020-03-30 11:58:24 +08:00
自定义的类,不管哪种写法,都需要 include 或者 require 的。use 的话,就不用写前面“\popp\ch05\batch04\util\”这一串了,但是要用到自动加载,你可以百度一下 PHP 自动加载,挺简单的。
Varobjs
2020-03-30 12:01:00 +08:00
spl_autoload_register 了解下
composer 了解下

你这基础,建议看 php.net
JJstyle
2020-03-30 12:04:48 +08:00
这本书我之前看过,这是一本进阶的书,还是先多了解基础在看吧。
yprisoner
2020-03-30 12:27:18 +08:00
spl_autoload_register 了解下,psr-4 自动加载规范了解下
dilu
2020-03-30 12:39:54 +08:00
先 include
然后自己写 spl_autoload_register 自动加载的逻辑
yc8332
2020-03-30 14:08:37 +08:00
要有使用自动加载。
star7th
2020-03-30 14:22:15 +08:00
use 本身只是使用 php 语法逻辑上的命名空间,并不会真正加载那个 php 文件进来。文件是文件,语法解析是语法解析。当然如果做了自动加载文件之类的暗操作就另说。
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
2020-04-14 09:27:14 +08:00
你需要 composer 或者 required 引入进来
gdt
2020-04-17 14:46:11 +08:00
php 这个东西设计的真垃圾。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/657493

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX