PHP定义包含类的变量

时间:2011-06-21 22:08:06

标签: php variables global

我正在尝试定义一个包含应用程序功能的类的__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似乎很特别,允许您使namespacesfunctionsclasses具有相同的名称。为了简单起见,我试图将我的所有函数组合在一个中心变量下,并且仍然具有__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();

2 个答案:

答案 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);