【问题标题】:PHP Static Array Workaround [closed]PHP静态数组解决方法[关闭]
【发布时间】:2012-12-18 06:04:54
【问题描述】:

我有一个数组结构,其中包含多个维度的键和值对。我想在一个类中使用这个数组,但我不想将它添加到每个实例中,因为它只是该类所需的一个引用。

这是我通过 Google 和 Stack Overflow 搜索提出的解决方法。它可以满足我的需要,但是有经验的 PHP 程序员可以看到任何明显的问题吗?

class Foo {

    public static function bar($key = null) {

        $array = array('key'=>array(1,2,3));

        if ($key && array_key_exists($key, $array)) {
            return $array[$key];
        } else {
            return $array;
        }
    }
}

【问题讨论】:

  • 使用static 类变量有什么问题?您的解决方法解决了什么问题?
  • 实际上,您的初衷是什么?不清楚您要做什么,因此无法正确回答。

标签: php arrays class static


【解决方案1】:

静态变量不适用于此目的。如果你想有一个每个实例的值,只需在 OOP 上下文中使用它:

class Foo {

    protected $myArray = array();

    public function __construct($array = array())
    {
        $this->myArray = $array;
    }

}

$array1 = array('key' => array(1,2,3));
$array2 = array('key' => array(4,5,6));

$foo1 = new Foo($array1);
$foo2 = new Foo($array2);

【讨论】:

  • 他说他想要每个实例的值。
  • 不,他说他不希望每个实例都增加这个价值。对我来说,这意味着它是每个实例的值。
  • 我不知道为什么这被否决了。你是对的,这是最好和正确的方法。以这种方式使用的静态方法毫无意义,您不妨使用 $_GLOBALS,因为它的用途相同并导致相同的问题。
  • 好的,我看到OP的问题模糊到没有意义,这个答案不一定是错误的。取决于你如何理解这个问题。删除反对票。
【解决方案2】:

您可以在类中声明静态变量,然后使用self 访问它们。

class Foo {
  public static $bar = array(...);
  function Foo()
  {
    print_r(self::$bar)
  }
}   
print_r(Foo::$bar); 

您也可以查看the manual

【讨论】:

  • 我喜欢这个,但它需要使用 init 函数,我宁愿避免使用它(以便在类启动之前就可以访问数组)。
  • @RedBassett,那么你可以在变量声明语句中赋值。请查看我的更新答案。
【解决方案3】:

你为什么不通过引用每个实例来传递你的数组。这是通过在变量名前使用& 来完成的,如下所示:

&$SomeArray;

【讨论】:

  • 这与static类变量有什么关系?
  • 没有,但他的问题也没有。他不想将数组作为值传递给类的所有实例。使用静态变量是一种方法,但将数组作为引用传递也可以。
  • 而按引用传递而不是按值传递的优点是......?
  • 您只有 1 个数组实例。因此,如果您有 100 个具有相同数组的对象,您仍然只有 1 个数组,而不是 100 个。如果按值传递,则每次传递时都会复制该数组,因此如果您有 100 个数组100 个对象。
  • 不。 PHP 使用写时复制。仅当您 alter 数组时才会创建副本,而不是仅传递它。按引用传递是一种逻辑操作,而不是内存优化操作。仅当您打算通过引用传递时才通过引用传递,因为您需要更改原始文件。
猜你喜欢
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 2012-06-10
相关资源
最近更新 更多