好吧,我知道这是不可能的,所以,我真的不得不使用新的实例。
结果如下:
error_reporting(E_ALL^E_STRICT);//removes the "Strict Standards" warning, don't do this
final class session implements ArrayAccess {
//session data
private static $s=null;
//function (setters and getters)
private static $f=array('s'=>array(),'g'=>array());//general setter/getter
private $c=array('s'=>array(),'g'=>array());//private setter/getter
function setter($k,$f=null)
{
if(($a=func_num_args())<=1)return!$a?false:((@$this)?(@$this->c['s'][$k]):(@self::$f['s'][$k]));
else if($f==null){if(@$this)unset($this->c['s'][$k]);else unset(self::$f['s'][$k]);return true;}
else return is_callable($f)&&(@$this?$this->c['s'][$k]=$f:self::$f['s'][$k]=$f);
}
function getter($k,$f=null)
{
if(($a=func_num_args())<=1)return!$a?false:((@$this)?(@$this->c['g'][$k]):(@self::$f['g'][$k]));
else if($f==null){if(@$this)unset($this->c['g'][$k]);else unset(self::$f['g'][$k]);return true;}
else return is_callable($f)&&(@$this?$this->c['g'][$k]=$f:self::$f['g'][$k]=$f);
}
//==== arrayaccess ====
//extra: setters and getters implemented when accessing $session['offset']
// setter: gives the value, expects a value in return
// getter: gives the value, returns the value returned by the getter
function offsetSet($o,$v){@self::$s[$o]=(@$this->c['s'][$o])?$this->c['s'][$o]($v,$o):(@self::$f['s'][$o]?call_user_func(self::$f['s'][$o],$v,$o):@self::$s[$o]);}
function offsetExists($o){return isset(self::$s[$o]);}
function offsetUnset($o){unset(self::$s[$o]);}
function offsetGet($o){return(@$this->c['g'][$o])?$this->c['g'][$o](@self::$s[$o]):(@self::$f['g'][$o]?call_user_func(self::$f['g'][$o],@self::$s[$o]):@self::$s[$o]);}
//==== arrayaccess ====
}
$s=new session();
$s->setter('test',function($ob){return$ob>6?'bigger than 6':'lower than 6';});
session::setter('test',function($st){return$st<5?'lower than 5':'bigger than 5';});
session::setter('test',null);//*deletes the setter,*/ session::setter('test');//return setter
$s['test']=5;
var_dump($s->setter('test'),session::setter('test'),$s['test']);
//expected output (php 5.3.0): object(Closure)#2 (1) { ["parameter"]=> array(1) { ["$ob"]=> string(10) "" } } NULL string(12) "lower than 6"
我知道它看起来很糟糕,但按预期工作!
所有数据都在所有新实例之间共享,一般上下文中的所有设置器都按预期执行。
如果您想为自己使用此代码,请记住:
session::[sg]etter('test',null); 与 session::[sg]etter('test'); 不同!
setter有2个参数(value和offset),而getter只有1个(value);
setter 和 getter 都必须返回一个值!
在其中一个 cmets 中我是这样说的:
我有一个setter方法,我相信不可能做到 $class=new my_class(); $class->setter($param);和 my_class::setter($param);
嗯,这不是不可能的,它只是不标准(这就是为什么第一行是error_reporting(E_ALL^E_STRICT);)。如果没有这一行,当您尝试执行 session::setter('test'); 时,PHP 会发疯。