spi*_*ice 1 php namespaces class
我无法让 class_exists 查看我的类文件。
更烦人的是,如果我真的直接包含类文件,它会抱怨我不能包含它,因为类已经存在!说一记耳光。
这显然有很多部分,所以我将尝试包括相关的部分:
我正在检查的类是Router.php中函数中的 Posts.php
目录结构:
app
|
--->Project
|
|--->Controllers
| |
| --->Posts.php
|
|--->Core
| |
| --->Router.php
Run Code Online (Sandbox Code Playgroud)
类名(控制器)是从查询字符串的一部分中提取出来的,它已经过测试和工作。即 - mysite.com/posts/view 将导致类名作为“帖子”传递,就像它应该用于 psr4 一样。
路由器调度功能出问题的部分。
if (class_exists($controller)) {
$controller_object = new $controller();
} else {
echo "Controller class $controller missing";
}
Run Code Online (Sandbox Code Playgroud)
我试过直接包含类,就像我说的那样,我收到关于包含同一个类两次的警告。
我也试过使用类常量:
if (class_exists($controller::class)) {
Run Code Online (Sandbox Code Playgroud)
但得到:
Fatal error: Dynamic class names are not allowed in compile-time
Run Code Online (Sandbox Code Playgroud)
还尝试使用完整的命名空间 url:
if (class_exists('Project\\Controllers\\' . $controller))
Run Code Online (Sandbox Code Playgroud)
但同样,找不到类。
这是 Posts.php
namespace Project\Controllers;
class Posts
{
public function index()
{
echo 'It Works';
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里遗漏了一些明显的东西吗?
破解了!
需要将命名空间 url 与类连接起来并将其设置为变量,然后才能使用它创建新的 $controller 对象。因此,它在使用命名空间 url 提供时通过了 class_exists 检查,但在新对象上失败,因为它超出了范围。
$controller = 'Project\\Controllers\\' . $controller;
if (class_exists($controller)) {
$controller_object = new $controller();
.......
Run Code Online (Sandbox Code Playgroud)