gpt4 book ai didi

带有变量名和命名空间的 PHP 类名

转载 作者:可可西里 更新时间:2023-10-31 22:53:10 25 4
gpt4 key购买 nike

我使用 PHP5 构建我自己的 MVC 框架。我有一种情况,我的所有 Controller 都在 Controller 命名空间中,如:

namespace Controllers
{
class Home extends \Framework\Core\Controller
{
...
}
}

在应用程序逻辑中,我需要从调用传递的 URL 中选择要调用的 Controller ,如下所示:

namespace Framework\Core;

class Application
{
protected $controllerName = 'home';
protected $methodName = 'index';
protected $controller;

public function __construct()
{
// Parse the received URL
$url = parseUrl();

// Choose the controller, if file exists
if (file_exists('../app/controllers/' . $url[0] . '.php'))
{
$this->controllerName = $url[0];
unset($url[0]);
}

require_once '../app/controllers/' . $this->controllerName . '.php';

// Call the controller
$objToCall = '\\Controllers\\' . $this->controllerName;
$this->controller = new $objToCall(); <<<======= PROBLEM HERE

... Proceed choosing the method and calling the objects method....

}
}
}

我的问题是:

我的 Controller 文件名为home.php,我的类名为Home(首字母大写)。所以上面的代码找不到/Controllers/home类,因为类是/Controllers/Home

另一方面,如果我从 Controller 中删除 namespace 并调用:

$this->controller = new $this->controllerName;

它工作正常,即使名称是 home....

我的问题:

a) 如果我不涉及命名空间,为什么 home 会被翻译成 Home?

b) 我怎样才能解决从 namespace 调用类而不需要知道其大写/小写条件的问题?

请不要建议将首字母更改为大写,因为我可能有 CustomerReceipt、PersonalCashWithdrawl 等类。

感谢您的帮助。

最佳答案

您可以做的是创建一个将文件与类匹配的数组。

  1. 读取/controllers/ 文件夹中的所有文件
  2. 创建一个关联数组,将文件的小写版本与实际格式相匹配
  3. 使用这个关联数组来获取正确的文件,而不必担心大小写。

例如,如果您的文件夹包含:

  • home.php
  • RecipeForDisaster.php
  • 另一个 Controller .php

关联数组将包含:

Key                   Value
-------------------- ----------------------------
home Home.php
recipefordisaster RecipeForDisaster.php
anothercontroller AnotherController.php

通过构建这种数组,您可以将类(无论大小写)与文件匹配。

灾难的秘诀

这将实现您想要的,但在我看来,这是灾难的根源。为什么 ?因为在某些操作系统(Linux、OSX 等)中,您可以将 home.phpHome.php 放在同一个文件夹中。您如何才能知道要使用哪个文件?提供的解决方案将不起作用,因为您显然不能为同一个键设置 2 个值。

您要考虑的另一件事是PHP 中的类不区分大小写。这就是 namespace 很重要的原因。这意味着以下代码可以完美运行:

class myclass {
public function printme() {
print 'hello world';
}
}

$a = new myclass(); // Correct case
$a->printme();

$b = new MyClass(); // "Incorrect" case... but still working
$b->printme();

建议的解决方案

我确实认为您应该将类​​名大小写与文件相匹配。这样,您将避免潜在的冲突并确保您不会错误地将类映射到错误的文件。

我不是建议你把第一个字母改成大写,我是建议你严格使用类提供的大小写来找到正确的路径。

开发人员应该知道:如果您输入的类名不正确(即不区分大小写),您就不能指望自动加载器能够正常工作。

路由

大多数框架可以进行自动路由,但也提供进行手动路由的可能性。您可以添加一个路由模块,允许开发人员“覆盖”默认路由。通过这样做,您将取悦那些想要尊重您的标准的人以及那些想要按照他们的方式行事的人。

结论

您的问题似乎很简单。但是,实际上,如果您希望它灵活而避免严格,您将不得不考虑很多事情。

您还可以像这样混合此答案中提供的策略:

  1. 检查文件是否与用户输入的完全一样。如果存在,请使用它。如果不是,请执行第 2 步。
  2. 检查类名的小写版本是否存在。如果存在,请使用它。如果不是,请执行第 3 步。
  3. 浏览文件夹并通过查找“看起来像”类名(不考虑大小写)的文件来尝试神奇的映射。

问题仍然存在:您希望它变得那样灵活吗?你的电话...

关于带有变量名和命名空间的 PHP 类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32015751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com