PHP 5.6 - Memcached - 严格标准

3

现在5.4.x已经到了生命周期结束阶段,我们要升级到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 有同样的问题,但他们的“解决”办法是从 Memcached 切换到 Memcache API,这可能有效,但我们选择 Memcached 是有原因的。然而,Memcached 的 PHP 包裹物的维护者似乎不认为修复此问题是高优先级的。然而,随着更多用户因 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);
        }
    }
}

但显然这会很麻烦,因为我需要更新所有调用代码从$cache->set()Hobis_Api_Cache_Package::set()


虽然我喜欢保罗的回答,但另一个选择是拥有两个包含 Hobis_Api_Cache 的文件。每个文件对应一个 PHP 版本,在运行时包含与你扩展的 Memcached 类匹配的那个文件。 - Steve E.
@SteveE。问题是,我将不得不维护多个文件,这些文件相似度达到95%,并更改自动加载程序以确定要使用哪个文件。 - Mike Purcell
1个回答

1
感谢Paul的建议,这是最终结果:
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类时,此方法才有效。如果没有,请考虑添加您自己的类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接