【问题标题】:Using static variables in PHP在 PHP 中使用静态变量
【发布时间】:2011-12-05 02:46:47
【问题描述】:

php中是否可以使用另一个静态变量来初始化另一个静态变量?

public static $conf_siteroot = "http://mysite.com/";
 public static $conf_docroot = "C:/Users/Mp/Documents/Projects/nana/webroot/";

 public static $conf_doclib = $conf_docroot."library/";
 public static $conf_sitelib = $conf_siteroot."library/";

这段代码根本不起作用,但我需要重用静态变量,所以我不会写太多。谢谢

【问题讨论】:

  • 我不这么认为,但我想你可以试试——只要使用正确的语法:public static $conf_doclib = self::$conf_docroot."library/";
  • 用常量代替static变量怎么样?
  • 是的,这应该工作 - 使用 self:: 正如 Pekka 所说。这仅不适用于类常量,但公共静态变量应该可以做到。
  • 你也可以看看这个link和这个link,..希望对你有帮助..
  • @azat - 你是对的,它不起作用。我刚刚学到了一些东西:-)。 OP,你可以在构造函数中初始化动态值($conf_doclib,$conf_sitelib)。

标签: php


【解决方案1】:

您不能在运行时动态地为静态属性赋值。

但是,您可以编写返回所需值的静态 getter 函数:

class Foo 
{
    public static $conf_siteroot = "http://mysite.com/";
    public static $conf_docroot = "C:/Users/Mp/Documents/Projects/nana/webroot/";

    /**
     * exemplary getter function for the ConfDocLib value
     */
    public static function getConfDocLib()
    {
        return self::$conf_docroot."library/";
    }
    ...
}

Foo::getConfDocLib(); # your dynamic value, statically accessible globally.

或者您将它们分配给超全局数组$_GLOBALS,这可能与您的公共静态属性几乎相同。只是另一个想法。

【讨论】:

  • 没有办法声明静态getter函数stackoverflow.com/questions/1279382/…
  • @azat:你误读了我的答案,我不是在谈论超载。我明确地忽略了这一点,请阅读第一句“您不能在运行时为静态属性动态分配值。”(其中包括 PHP 的重载魔术方法)。如果您不知道什么是 getter 函数,请阅读 Why getter and setter methods are evil
  • @azat:还添加了一个示例以防万一。
  • @harke,你能用$GLOBALS 发布示例吗?
  • @azat:查看您自己的答案,// Bootstrapping 之后的行 - 基本上就是这样,但只是带有 $GLOBALS 前缀。这只是一个想法,并不是我想用一个例子来传播的东西,因为这在很大程度上取决于特定的程序工作流程。
【解决方案2】:

你不能这样做。

与任何其他 PHP 静态变量一样,静态属性只能是 使用文字或常量初始化;不允许表达。 因此,虽然您可以将静态属性初始化为整数或数组 (例如),你不能将它初始化为另一个变量, 函数的返回值,或者一个对象。

【讨论】:

    【解决方案3】:

    简短的回答是 - 不

    但您可以在_clone_construct 中重新初始化静态变量
    但这并不是你所需要的

    你可以这样写:

    <?
    // file Foo.php
    
    class Foo {
        public static $prefix = 'foo';
        public static $bar;
    }
    
    // Bootstrapping
    foo::$bar = foo::$prefix . '/bar';
    

    【讨论】:

    • 好的...还有其他代码建议吗?我真的想让这个配置变量在我的函数中可用而不使用全局
    猜你喜欢
    • 1970-01-01
    • 2017-02-08
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多