簡體   English   中英

PHP類:ArrayAccess接口-是否可以在類中直接使用數組接口?

[英]PHP classes: ArrayAccess interface - Is it possible to use the array interface directly in a class?

在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=new my_class();

我不想這樣做,除非非常必要並且沒有解決該語法錯誤的方法。

如果可能,我想擺脫該語法錯誤。

我不是100%不確定是否有可能(可能不是),但是比死於懷疑和永不嘗試更好的任務。

我在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"

我知道它看起來很糟糕,但可以正常工作!

所有數據在所有新實例之間共享,並且一般情況下的所有設置器均按預期執行。

如果要為您使用此代碼,請記住以下幾點:

  • session::[sg]etter('test',null); session::[sg]etter('test');

  • setter有2個參數(值和偏移量),而getter只有1個(值);

  • 設置者和獲取者都必須返回一個值!

在其中一項評論中,我這樣說:

我有一個setter方法,並且我相信不可能做$ class = new my_class(); $類 - >設定部($ PARAM); 和my_class :: setter($ param);

好吧,這不是不可能,只是不標准(這就是第一行是error_reporting(E_ALL^E_STRICT); )。 如果沒有這一行,當您嘗試執行session::setter('test');時,PHP就會發瘋session::setter('test');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM