Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP类:ArrayAccess接口-是否可以在类中直接使用数组接口?_Php_Class_Static Methods_Static Members_Arrayaccess - Fatal编程技术网

PHP类:ArrayAccess接口-是否可以在类中直接使用数组接口?

PHP类:ArrayAccess接口-是否可以在类中直接使用数组接口?,php,class,static-methods,static-members,arrayaccess,Php,Class,Static Methods,Static Members,Arrayaccess,在PHP中,我尝试使用ArrayAccess接口直接访问类成员,而无需创建新实例 例如: class my_class implements ArrayAccess { private static $d=array(); function offsetGet($o){return self::$d[$o];} function offsetSet($o,$v){self::$d[$o]=$v;} } my_class['foo']='bar';//Syntax erro

在PHP中,我尝试使用ArrayAccess接口直接访问类成员,而无需创建新实例

例如:

class my_class implements ArrayAccess {
    private static $d=array();
    function offsetGet($o){return self::$d[$o];}
    function offsetSet($o,$v){self::$d[$o]=$v;}
}
my_class['foo']='bar';//Syntax error
echo my_class['foo'];
我想知道的是,是否有任何方法可以在不必使用$var=newmyu类的情况下实现这一点

我不想这样做,除非这是非常必要的,而且没有办法避免语法错误

如果可能的话,我想消除这个语法错误

我不能百分之百确定这是否可能,也许不可能,但比在怀疑中死去,从不尝试更好的任务


我在Windows 8 Pro x64上使用PHP 5.4.7,运行在intel core2quad i586 2.63ghz上以防万一。

我认为这是不可能的,所以我真的不得不使用新实例

结果如下:

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"
我知道这看起来很糟糕,但它的工作原理是一样的

所有数据在所有新实例中共享,并且按照预期执行常规上下文中的所有setter

如果要为您使用此代码,请记住:

会话::[sg]etter'test',null;与会话不同::[sg]etter'test'

setter有2个参数值和偏移量,getter只有1个参数值

setter和getter都必须返回一个值

我在一篇评论中说:

我有一个setter方法,我相信不可能实现$class=newmyu类$class->setter$param;还有我的_类::setter$param


嗯,这不是不可能的,只是它不是标准的,这就是为什么第一行是错误报告;。如果没有这一行,当您尝试执行session::setter'test';时,PHP会变得疯狂

为什么不能只使用数组呢?因为我想执行其他任务,比如运行函数和添加getter和setter。此外,我希望保持所有内容都是静态的,而不是简单地获取或设置父静态类的值的实例。然后我必须在同一个类中使用相同的名称创建静态和非静态成员,这是不可能的,也是荒谬的。然后我必须在同一个类中使用相同的名称创建静态和非静态成员。通常的做法是创建基于“包”的方法。基本上,您有一个可以实例化的类,它可以从存储或其他方式表示对象,然后您有一个能够操作多个对象的类。在条令中,这些被称为表类,在推进中,这些被称为对等类。使用这种方法,您可以通过将成员变量附加到实际对象或“Package”类来分离它们。我不希望这样。我想将类作为变量和数组来使用。就像你如何做$foo['bar'],我想做我的_类['foo']。此外,我有一个setter方法,我相信不可能实现$class=newmyu类$class->setter$param;还有我的_类::setter$param;你有没有研究过神奇的接球手/二传手?《第一侏罗纪公园》中有一句名言:你忙着担心自己是否可以,却没有停下来思考自己是否应该这样做。你必须放松严格的标准以避免php发疯,这一事实应该是一个危险信号,表明这不是正确的方法。从可维护性的角度来看,该代码不仅是一个火车失事,您甚至还分析过它吗?我很好奇这些匿名函数调用是否都比调用具体函数更快、相同或更慢。我不担心超快速或任何事情。我只是希望它简单易用,而不是简单的制作和运行。在我看来,它们尽可能地优化了,除了到处抑制@指令的错误,而不是使用isset。我已经提到,严格的警告是当我访问session:[gs]etter而不是session->[gs]etter时。