PHP 5.6 - Memcached - Strict Stadards

时间:2015-10-01 18:29:31

标签: php memcached

现在5.4.x已经在EOL,我们正在跳转到5.6,所以我们实际上可以回到功能上。但是我们遇到了:

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是有原因的。然而,用于memcached的php包装器的维护者显然不会将this issue视为高优先级。然而,由于5.4 EOL,更多用户被迫更新到5.5+,我认为这个问题需要尽快解决。

所以我的问题是,有没有人想出这个问题的优雅解决方案?

我们的内部中间件(Hobis_Api)保护了我们一点点,因为我可以打破setget函数并将它们放在自己的类中,它不会扩展Memcached,然后将它们视为基于当前php版本ID的包装函数,如下所示:

// 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 b / c我必须将所有调用代码从$cache->set()更新为Hobis_Api_Cache_Package::set()

1 个答案:

答案 0 :(得分:1)

对保罗的建议,这是最终结果:

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类时才有效,如果没有,那么你可能要考虑添加自己的类。