2015-10-01 5 views
3

Теперь, когда 5.4.x находится в EOL, мы делаем прыжок на 5.6, чтобы мы могли вернуться к работе над функциями. Однако мы работаем с:PHP 5.6 - Memcached - Strict Stadards

Strict standards: Declaration of Hobis_Api_Cache::get() should be compatible with Memcached::get($key, $cache_cb = NULL, &$cas_token = NULL, &$udf_flags = NULL) 

... предупреждение.

Похоже, что основной пакет SF2: LswMemcacheBundle имел ту же проблему, но их «исправление» заключалось в переключении API-интерфейсов из Memcached в Memcache, которые могут работать, но мы выбрали Memcached по какой-то причине. Однако поддерживающие php-обертки для memcached, по-видимому, не считают фиксирование this issue приоритетным. Однако, поскольку все больше пользователей вынуждены обновлять до 5.5+ из-за 5.4 EOL, я думаю, что эту проблему нужно будет решить раньше, чем позже.

Итак, мой вопрос: кто-нибудь придумал элегантное решение этой проблемы?

Наши в доме промежуточного слоя (Hobis_Api) защищает нас немного, что я могу вырваться из set и get функции и поместить их в своем собственном классе, который не распространяется Memcached, то относиться к ним, как на основе функции оболочки на текущей версии PHP ид, что-то вроде этого:

// Now 
class Hobis_Api_Cache extends memcached 
{ 
    public function set($key, $value, $expiry = self::EXPIRY_DEFAULT) {} 
} 

// Proposed 
class Hobis_Api_Cache_Package 
{ 
    public static function set($key, $value, $expiry, $udfs) 
    { 
     $cache = new Memcached; 

     if (PHP_VERSION_ID < 50500) { 

      $cache->set($key, $value, $expiry); 

     } else { 

      $cache->set($key, $value, $expiry, $udfs); 
     } 
    } 
} 

Но, очевидно, это будет PITA б/с я должен обновить весь код вызова от $cache->set() к Hobis_Api_Cache_Package::set()

+0

Хотя мне нравится ответ Pauls - другой альтернативой было бы иметь два файла, содержащие Hobis_Api_Cache. Один для каждой версии PHP и включает тот, который соответствует классу Memcached, который вы распространяете во время выполнения. –

+0

@SteveE. Проблема в том, что мне пришлось бы поддерживать несколько файлов, которые были похожи на 95%, и внести изменения в автозагрузчик, чтобы определить, какой из них использовать. –

+0

@PaulCrovella: Можете ли вы опубликовать ответ, чтобы я мог принять его? –

ответ

0

Thx к предложению Павла, вот Конечный результат:

class Hobis_Api_Cache extends memcached 
{ 
    /** 
    * Magic method override so we can use our version of get/set 
    * Otherwise default get/set will break in php 5.5+ 
    * 
    * @param string 
    * @param array 
    */ 
    public function __call($name, $arguments) 
    { 
     switch ($name) 
     { 
      // Override due to 5.5+ using php-memcache 2.2 
      case 'get': 

       $this->myGet($arguments); 

       break; 

      // Override due to 5.5+ using php-memcache 2.2 
      case 'set': 

       $this->mySet($arguments); 

       break; 
     } 
    } 
} 

Это будет работать, только если вы расширили класс memcached своим собственным классом, если нет, то вы можете захотеть добавить свой собственный класс.