PHP: Могу ли я получить функциональность массива при перегрузке метода (__get)? - PullRequest
0 голосов
/ 05 октября 2011

То, чего я хотел бы достичь, это когда я вызываю $ obj-> CAT [15];$ obj проверит, существует ли свойство CAT, если нет, получит значение на лету

public function __get($var){
if($var == "CAT") return $this->cats->get_cat($cat_id);
}

, поэтому мой вопрос ... как получить значение 15 массива из моего примера?передать его моему методу get_cat?

Ответы [ 3 ]

6 голосов
/ 05 октября 2011

Пусть __get возвращает экземпляр ArrayAccess, который делегирует get_cat в его методе offsetGet.

Примерно так:

class CachedCategories implements ArrayAccess
{
  private $memcachedClient;

  public function __construct($memcachedClient)
  {
    $this->memcachedClient = $memcachedClient;
  }

  // Called when using `$cats[18] = "foo"`
  public function offsetSet($key, $value)
  {
    $this->memcachedClient->set($key, $value);
  }

  // Called when using `$cat = $cats[18]`
  public function offsetGet($key)
  {
    return $this->memcachedClient->get($key);
  }

  // Called when using `isset($cats[18])`
  public function offsetExists($key)
  {
    return $this->memcachedClient->get($key) !== false;
  }

  // Called when using `unset($cats)`
  public function offsetUnset($key)
  {
    $this->memcachedClient->delete($key);
  }
}

$cats = new CachedCategories($someMemcachedClient);
$cats[18];
0 голосов
/ 05 октября 2011

Если я правильно понял, чего вы хотите достичь, вы можете использовать замыкание:

class kittengarten
{
   var $cats;
   function __construct()
   {
      $this->cats[0]='Jerry';
      $this->cats[1]='John';
      $this->cats[2]='Barack';
   }
   public function __get($var)
   {
      if($var == "CAT")
      {
         $array_of_cats=$this->cats;
         return function($num) use ($array_of_cats)
         {
            return $array_of_cats[$num];
         };
      }
   }

}
$kittengarten=new kittengarten();
echo 'The third directly accessed cat is '.$kittengarten->cats[2];
$cat=$kittengarten->CAT;
if (is_string($cat)) echo $kittengarten->CAT; 
else echo 'The third cat accessed using closure is '.$cat(2);

Выход:

Третья кошка прямого доступа - Барак

Третья кошка, доступ к которой осуществляется с помощью закрытия, - Барак

0 голосов
/ 05 октября 2011
class Test
{
    protected $cats;
    function __construct()
    {
        $this->cats = new ArrayObject(); // or your own implementation
        $this->cats[33] = "hey";
    }
    public function __get($name)
    {
        if($name == "CAT") return $this->cats;
    }
}

$a = new Test();
echo $a->CAT[33];

см. http://www.php.net/ArrayAccess для реализации собственного списка / карты

надеюсь, это поможет!

...