【发布时间】:2011-09-19 22:18:29
【问题描述】:
我正在尝试定义一个包含我的应用程序函数的类的__invokeable 全局实例。
基本上我正在尝试为我的库创建一个命名空间,因此我正在尝试使用一个类来保存我的所有函数/方法。
我不想在我所有文件的顶部包含global $class_instance,因为这很难看。
我也不必到处引用$GLOBALS['myvar'] 之类的变量。
我个人认为这是 php 中真正的疏忽。
看来我无法定义像 $myFunctionsGlobal 这样的超级全局变量
而且我不能像myvar=$classInstance这样在php中定义变量(实际上是常量)。
命名空间
如果命名空间应该解决这个问题,为什么不更广泛地使用它们?
例如,Kohana 不使用命名空间以及许多其他 php 库。
我追求的一个:
class _namespace{
public $_function;
function __invoke($arg){
// Function body
echo $arg;
}
function method(){
;
}
}
$N = new _namespace;
$N('someValue');
$N->method();
function myFunc(){
// I don't want global $N;
// I don't want $N = $_GLOBALS['N'];
// I don't want $N = get_instance();
$N('some other value');
}
解决方案:
在大多数其他语言(如 c 和 js)中,每个变量名只能有一个对象/函数。 PHP 似乎特别允许您拥有相同名称的namespaces、functions 和classes。为了简单起见,我试图将我的所有函数分组在一个中心变量下,并且仍然具有 __invokable 的功能。事实上,同名的类和函数会提供这种功能。
<?
class R{
static function static_method(){
;
}
function method(){
;
}
}
function R(){;}
R();
R::static_method();
$instance = new R();
$instance->method();
在 php5.3 中,您可以通过定义与命名空间同名的函数来模拟可调用的常量。
namespace.php
<? namespace Z;
function init($arg=''){
echo $arg;
}
function method(){
echo 'method';
}
function method(){
echo 'method2';
}
othefile.php
include('namespace.php');
function Z($a=null,$b=null){
return Z\init($a,$b);
}
Z('test');
Z\method();
Z\method2();
【问题讨论】:
-
您的问题是什么?它只是关于命名空间吗?
-
命名空间在 PHP 中没有被广泛使用,因为 (a) 它们是最近才引入的,并且 (b) 它们很丑陋。 (无论如何,我不太确定它们如何适合您描述的场景。)
-
您能否展示一些您实际使用的代码,或者这是您开始编码之前的理论问题?
-
__invoke需要什么?所以你有一个类的行为就像一个单一的功能? PHP 支持全局函数(它可能对你的对象实例有一个静态变量),我真的很难理解你的目标。请添加一些代码。 -
我只是想减少我的全局变量,并为我的全局变量提供最通用的功能。例如,我还可以在上面的类中添加
__set、__get、__call等,以添加其他潜在功能。