首页 / PHP / 带有变量名和命名空间的PHP类名
带有变量名和命名空间的PHP类名
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了带有变量名和命名空间的PHP类名,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3283字,纯文字阅读大概需要5分钟。
内容图文
![带有变量名和命名空间的PHP类名](/upload/InfoBanner/zyjiaocheng/809/520bcc017d0d47ba9ab2bcff2f8e459c.jpg)
我使用PHP5来构建自己的MVC框架.我的情况是我的所有控制器都在Controller命名空间中,如下所示:
namespace Controllers
{
class Home extends \Framework\Core\Controller
{
...
}
}
在应用程序逻辑中,我需要选择从调用传递的URL调用控制器,如下所示:
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....
}
}
}
我的问题是:
我的控制器文件名为home.php,我的类名为Home(首字母大写).所以上面的代码找不到/ Controllers / home类,因为类是/ Controllers / Home
另一方面,如果我从控制器中删除命名空间并调用:
$this->controller = new $this->controllerName;
它工作正常,甚至名字在家….
我的问题:
a)如果我没有涉及名称空间,为什么将主页翻译为Home?
b)如何解决该问题从命名空间调用类而不需要知道它的大写/小写条件?
请不要建议将第一个字母更改为大写,因为我可能有CustomerReceipt,PersonalCashWithdrawl等类.
谢谢你的帮助.
解决方法:
你可以做的是创建一个与类匹配的数组.
>读取/ controllers /文件夹中的所有文件
>创建一个关联数组,您可以在其中将文件的小写版本与实际格式相匹配
>使用此关联数组来获取正确的文件,而不必担心这种情况.
例如,如果您的文件夹包含:
> home.php
> RecipeForDisaster.php
> AnotherController.php
关联数组将包含:
Key Value
-------------------- ----------------------------
home Home.php
recipefordisaster RecipeForDisaster.php
anothercontroller AnotherController.php
通过构建这种类型的数组,您可以将类(无论其大小写)与文件匹配.
灾难食谱
这将实现你想要的,但在我看来,这是一个灾难的秘诀.为什么?因为在某些操作系统(Linux,OSX,…)中,您可以将home.php和Home.php放在同一个文件夹中.您将如何知道要使用的文件?提供的解决方案不起作用,因为显然,您不能为同一个键提供2个值.
您要考虑的另一件事是PHP中的类不区分大小写.这就是命名空间很重要的原因.这意味着以下代码完美地运行:
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();
建议的解决方案
我确实认为你应该将类名称与文件匹配.这样,您将避免潜在的冲突,并确保您没有错误地将类映射到错误的文件.
我不是建议你把第一个字母改成大写,我建议你严格使用类提供的情况来找到正确的路径.
开发人员应该知道:如果您输入的类名不正确(意味着不考虑案例),您不能指望自动装带器正常工作.
路由
大多数框架都可以进行自动路由,但也提供了手动路由的可能性.您可以添加一个允许开发人员“覆盖”默认路由的路由模块.通过这样做,你会取悦那些想要尊重你的标准和那些想要按照自己的方式去做的人.
结论
你的问题似乎很简单.但是,事实上,如果你希望它具有灵活性并避免严格,你必须考虑很多事情.
你也可以混合这个答案中提供的策略,如下所示:
>检查文件是否与用户输入的完全一致.如果存在,请使用它.如果没有,请执行第2步.
>检查类名的小写版本是否存在.如果存在,请使用它.如果没有,请执行第3步.
>浏览文件夹并通过查找“看起来像”类名的文件(不考虑大小写)来尝试神奇的映射.
问题仍然存在:你想让它变得那么灵活吗?你的来电…
内容总结
以上是互联网集市为您收集整理的带有变量名和命名空间的PHP类名全部内容,希望文章能够帮你解决带有变量名和命名空间的PHP类名所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。