php 5.2中的静态变量变量

时间:2011-10-01 13:55:07

标签: php

我正在尝试定义以下功能:

function set($key, $value, $default = null)
    {
    if ($value)
        static $$key = $value;
    else
        static $$key = $default;
    }

但是当我调用它时,我收到错误“解析错误:语法错误,意外'$',期待T_VARIABLE”。我想定义静态变量变量有问题,但我找不到解决方法。你能?谢谢!

2 个答案:

答案 0 :(得分:1)

如果我真的想做类似的事情,我会使用静态数组:

function set($key, $value, $default = null)
{
    static $values = array();
    $values[$key] = is_null($value) ? $default : $value;
}

如果您还希望能够访问此数据,最好将其封装在一个类中。

class Registry
{
    private static $values = array();

    public static function set($key, $value, $default = null)
    {
        self::$values[$key] = is_null($value) ? $default : $value;
    }

    public static function get($key, $default = null)
    {
        return array_key_exists($key, self::$values) ? self::$values[$key] : $default;
    }
}

然后你可以静态使用这个类:

Registry::set('key', 'value', 'default');
$value = Registry::get('key', 'default');

更好的方法是不要使用static关键字,而是使用普通属性创建普通类,然后创建它的单个实例并使用该实例。

class Registry
{
    private $values = array();

    public function set($key, $value, $default = null)
    {
        $this->values[$key] = is_null($value) ? $default : $value;
    }

    public function get($key, $default = null)
    {
        return array_key_exists($key, $this->values) ? $this->values[$key] : $default;
    }
}

然后,您可以创建该类的实例并将其传递:

$registry = new Registry();
do_something_that_requires_the_registry($registry);

答案 1 :(得分:1)

如果你在课堂上这样做,你可以使用__get__set魔法功能。

我在我的项目中使用它:

class foo
{

    public function __set($key, $value)
    {
        $this->vals[$key] = $value;
    }

    public function __get($key)
    {
        return $this->vals[$key];
    }
}

$foo = new foo();
$foo->bar = "test";
echo $foo->bar;