命名空间函数(PHP)

时间:2015-08-12 16:05:02

标签: php namespaces silex

我想"命名空间"一组函数并调用它们。原因是我希望在多个文件中保持功能名称相同(从而通过命名空间区分它们)。我的以下实现产生"调用未定义的函数..." 错误:

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...};

上述情况似乎无效。实现这个目标的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

听起来你没有使用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命名空间 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.phpview.php。此外,我必须通过use Form;“使用”命名空间。

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