【问题标题】:PHP Define Variable containing a ClassPHP 定义包含类的变量
【发布时间】: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 似乎特别允许您拥有相同名称的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();

【问题讨论】:

  • 您的问题是什么?它只是关于命名空间吗?
  • 命名空间在 PHP 中没有被广泛使用,因为 (a) 它们是最近才引入的,并且 (b) 它们很丑陋。 (无论如何,我不太确定它们如何适合您描述的场景。)
  • 您能否展示一些您实际使用的代码,或者这是您开始编码之前的理论问题?
  • __invoke 需要什么?所以你有一个类的行为就像一个单一的功能? PHP 支持全局函数(它可能对你的对象实例有一个静态变量),我真的很难理解你的目标。请添加一些代码。
  • 我只是想减少我的全局变量,并为我的全局变量提供最通用的功能。例如,我还可以在上面的类中添加__set__get__call 等,以添加其他潜在功能。

标签: php variables global


【解决方案1】:

您可以使用服务容器。

您可以在此处找到一个示例: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);

【讨论】:

  • 我只是想防止全局变量冲突,同时保持我的全局变量__invokeable。通过使用方法创建类实例$classInstacce,我可以成功避免全局冲突。类实例也可以是可调用的invokable
  • @Lime:您应该将 __invoke 部分添加到您的问题中。我认为这很重要。
  • @hakre:他在......之后添加了那部分......我讨厌有人这样做
  • “添加”在顶部,是的,很容易覆盖然后......不是很有建设性。
  • @lime: 我添加了关于你的可调用问题的信息
【解决方案2】:

这是我给你的新答案

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

一旦你加入你的班级,它就会被访问

你不需要创建一个对象,因为它是一个静态变量,你只需要包含类

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2015-08-29
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    相关资源
    最近更新 更多