我正在尝试定义一个包含应用程序功能的类的__invoke
全局实例。
基本上我正在尝试为我的库创建一个命名空间,因此我试图使用一个类来保存我的所有函数/方法。
我不想在我的所有文件的顶部包含global $class_instance
,因为这很难看。
此外,我不必在任何地方引用像$GLOBALS['myvar']
这样的变量。
我个人认为这是对php的真正疏忽。
似乎我无法定义像$myFunctionsGlobal
这样的超级全局变量
而我无法在PHP中定义变量(实际上是常量),如myvar=$classInstance
。
命名空间
如果命名空间应该解决这个问题,为什么不能更广泛地使用它们?
例如,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();
答案 0 :(得分:1)
这是我给你的新答案
class _bidon {
static function __invoke($arg){
// Function body
echo $arg;
}
}
$b = new _bidon;
$b('eee');
function myFunc(){
// I don't want global $N;
// I don't want $N = $_GLOBALS['N'];
// I don't want $N = get_instance();
_bidon::__invoke('some other value');
}
myFunc();
但该函数将特定于类而不是对象
------上一篇文章:
嗨我没有清楚地理解,但如果你创建了一个类,那就去做:
public static $myFunctionsGlobal;
并且你想要在你的课外使用它:
myclassname::$myFunctionsGlobal
,只要您加入了
,就可以访问它你不需要创建一个对象,因为它是一个静态var你只需要包含这个类
答案 1 :(得分:0)
您可以使用服务容器。
您可以在此处找到示例:Which pattern should I use for my unique instance of the User class?并加深If Singletons are bad then why is a Service Container good?
如果你需要为你的助手对象提供一个单独的实例,那么命名空间也无法帮到你。
使用服务容器,我建议你仍然可以使用__invoke
。
$obj = app('CallableClass');
$obj(5);