我正在尝试定义以下功能:
function set($key, $value, $default = null)
{
if ($value)
static $$key = $value;
else
static $$key = $default;
}
但是当我调用它时,我收到错误“解析错误:语法错误,意外'$',期待T_VARIABLE”。我想定义静态变量变量有问题,但我找不到解决方法。你能?谢谢!
答案 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;