【问题标题】:Namespacing Functions (PHP)命名空间函数 (PHP)
【发布时间】:2015-11-05 08:42:54
【问题描述】:

我想“命名空间”一组函数并调用它们。原因是我想在多个文件中保持函数名称相同(从而通过名称空间区分它们)。我的以下实现产生 "Call to undefined function..." 错误:

ma​​in.php

//located in /src/main.php 
namespace Roles;
use functions\Form; //doesn't seem to work
use functions\View; //doesn't seem to work
use Silex\Application; //works 
use Silex\ControllerProviderInterface; //works

class mainfct {
//calls respective functions in the namespaces
  Form\a();
  Form\b();

  View\a();
  View\b();
}

form.php

//located in /src/functions/form.php
namespace Form;
function main() { a(); b();};
function a() {...};
function b() {...};

view.php

//located in /src/functions/view.php
namespace View;
function main() { a(); b();};
function a() {...not necessarily same code as above...};
function b() {...not necessarily same code...};

上述方法似乎不起作用。实现这一点的最佳方法是什么?

【问题讨论】:

  • 你能解释一下The above doesn't seem to work.是什么意思吗?我们没有一个玻璃球来发现这一点。你有什么错误吗?
  • “调用未定义函数”错误。理论上它应该工作吗?
  • 你以前用过use {namespace name here};吗?可能是您不再位于全局名称空间中。尝试在命名空间名称前添加反斜杠。
  • 这在 PHP 5.6 php.net/manual/en/language.namespaces.importing.php 中得到了更好的支持。 use function ...。我不确定这是否是您正在寻找的东西。
  • 似乎这些更适合作为一个类或组,然后您可以使用继承并使其保持干燥。 $Form->b()$View->b() 而不是 \Form\b()\View\b() 之间有什么区别。如果您不想要的实例,请将它们设为静态 Form::b() View::b()

标签: php namespaces silex


【解决方案1】:

听起来您没有使用 PHP 5.6——在该语言中导入函数或常量之前(查看 usewas unimplemented

Re:您的更新——与 ruby​​ 或 python 等语言中的标准包含库不同,PHP 命名空间与文件名/路径绑定。您正在尝试导入 functions\Form

use functions\Form; //doesn't seem to work

但是,您没有名为 \functions\Form 的命名空间,您有名为 \Form 的命名空间

namespace Form;

要让它发挥作用,你需要

use Form;

namespace functions\Form;

另外,如果它不明显,出于历史和令人沮丧的原因,PHP 命名空间什么都不做来包含/要求/自动加载 PHP 文件。那是 PHP 中的一个独立系统。

【讨论】:

  • 我的main.php 文件实际上正在为另一个命名空间实现use(为了减少混乱而未显示),并且有效。
  • 我还必须require 文件。
【解决方案2】:

命名空间是一种避免同名函数/类错误的方法。

它没有帮助你做任何包含。

你应该在 main.php 中使用 include,就像: include('form.php'); include('view.php');

或者使用spl_autoload_register函数,见http://php.net/manual/zh/function.spl-autoload-register.php

或者在composer中使用psr0 psr4,见https://getcomposer.org/

【讨论】:

    【解决方案3】:

    原来我需要添加require 语句来加载文件form.phpview.php。此外,我不得不“使用”use Form; 的命名空间。

    我必须警惕在我的命名空间中对类的任何引用。例如,throw new Exception() 必须是 throw new \Exception() 才能位于正确的命名空间中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-23
      • 2017-05-10
      • 2012-11-07
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      相关资源
      最近更新 更多