2015-01-21 5 views
0

У меня есть массив GIANT в устаревший код. например 500k + из записей db. Он получает populatet один раз при входе пользователя. Глобальный массив пользователей, так сказать.PHP Array Refactor to Object

Теперь я получил беспроигрышный квест, чтобы переделать этот мальчик.

массив является 1 мерная assighned массив как

$data['username'] = 'idiots'; (and tons of other values) 

Теперь я хочу refacture это в объекте Wich бы вызвать значение из БД только тогда, когда я действительно в ней нуждается. Моя идея состояла в том, чтобы заменить часть оценки массива на объект.

Откуда: $user = array(); Я хочу пользователя $user = new user();

Есть ли какой-либо известный способ использования функции класса, поэтому я могу использовать его свойства через $user['name'], чтобы он передавался в __get method?

Я знаю, что это высокий порядок, и это, вероятно, невозможно. Но иль спросить в любом случае :)

ответ

2

Один из способов сделать класс, который реализует ArrayAccess и поставить свою ленивую логику загрузки в offsetGet:

class User implements ArrayAccess { 
    private $cache = array(); 

    public function offsetSet($key, $value) { 
     throw new Exception("Read-only!"); 
    } 

    public function offsetUnset($key) { 
     throw new Exception("Read-only!"); 
    } 

    public function offsetExists($key) { 
     // consult the DB schema and return true if the `key` makes sense 
    } 

    public function offsetGet($key) { 
     if(!isset($this->cache[$key])) { 
      // load stuff from the DB 
      $this->cache[$key] = ...; 
     } 
     return $this->cache[$key]; 
    } 
} 

$u = new User(); 
print $u['name']; 
+0

SIR ВЫ ЯВЛЯЕТЕСЬ GEANIUS! Спасибо!!!! Не думал, что это возможно! – Sangoku

+0

Только что выполнил выполнение обработчика. Еще раз спасибо !!!! : D – Sangoku

0
$data['username'] = 'idiots'; 
$data = (object) $data; 
echo $data->username; // prints 'idiots' 
+0

неправильный путь вокруг чувака :) У меня есть унаследованный код в более чем миллионах пользователей через $ data ['username'], это моя проблема. – Sangoku

+0

Это требует, чтобы вы по-прежнему извлекали 500 тыс. Значений. – BadHorsie

1

Есть две альтернативы этим. Первым является традиционным:

<?php 

/** 
* @see http://php.net/manual/en/language.oop5.overloading.php#object.call 
*/ 
class User 
{ 
    protected $data = array(); 

    /** 
    * @see http://php.net/manual/en/language.oop5.overloading.php#object.get 
    */ 
    public function __get($name) 
    { 
     echo "Getting $name " . PHP_EOL; 
     return $this->data[ $name ]; 
    } 

    /** 
    * @see http://php.net/manual/en/language.oop5.overloading.php#object.set 
    */ 
    public function __set($name, $value) 
    { 
     echo "Setting $name to $value " . PHP_EOL; 
     $this->data[ $name ] = $value; 
    } 
} 

$user = new User(); 
$user->a = 'Example'; 

echo $user->a; 

второй использует интерфейс ArrayAccess PHP SPL, который позволяет объект, чтобы получить и установить как массив PHP Assocative:

<?php 

/** 
* @see http://php.net/manual/en/class.arrayaccess.php 
*/ 
class User implements ArrayAccess 
{ 
    protected $data = array(); 

    /** 
    * @see http://php.net/manual/en/arrayaccess.offsetexists.php 
    */ 
    public function offsetSet($key, $value) 
    { 
     echo "Setting $name to $value " . PHP_EOL; 
     if(empty($offset)) 
     { 
      $this->data []= $value; 
     } 
     else 
     { 
      $this->data[ $key ] = $value; 
     } 
    } 

    /** 
    * @see http://php.net/manual/en/arrayaccess.offsetget.php 
    */ 
    public function offsetExists($key) 
    { 
     return isset($this->container[ $key ]); 
    } 

    /** 
    * @see http://php.net/manual/en/arrayaccess.offsetunset.php 
    */ 
    public function offsetUnset($key) 
    { 
     unset($this->data[ $key ]); 
    } 

    /** 
    * @see http://php.net/manual/en/arrayaccess.offsetset.php 
    */ 
    public function offsetGet($offset) 
    { 
     echo "Getting $name " . PHP_EOL; 

     if($this->offsetExists($key)) 
     { 
      return $this->data[ $key ]; 
     } 

     return null; 
    } 
} 

$user = new User(); 
$user->[ 'a' ] = 'Example'; 

echo $user->[ 'a' ];