我想"命名空间"一组函数并调用它们。原因是我希望在多个文件中保持功能名称相同(从而通过命名空间区分它们)。我的以下实现产生"调用未定义的函数..." 错误:
main.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...};
上述情况似乎无效。实现这个目标的最佳方法是什么?
答案 0 :(得分:3)
听起来你没有使用PHP 5.6 - 在导入语言中的函数或常量(查看use
)was 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命名空间 nothing 包含/ require / autoload PHP文件。这是PHP中的一个单独系统。
答案 1 :(得分:1)
命名空间是一种避免同名函数/类错误的方法。
它没有帮助你做任何包括。
你应该在main.php中使用include,就像:
include('form.php');
include('view.php');
或使用spl_autoload_register函数,请参阅http://php.net/manual/zh/function.spl-autoload-register.php;
或者将psr0 psr4与作曲家一起使用,请参阅https://getcomposer.org/
答案 2 :(得分:0)
原来我需要添加require
语句来加载文件form.php
和view.php
。此外,我必须通过use Form;
“使用”命名空间。
我必须警惕我的命名空间中对类的任何引用。例如,throw new Exception()
必须是throw new \Exception()
才能位于正确的命名空间中。