现在 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有同样的问题,但他们的“修复”是将 API 从 Memcached 切换到 Memcache,这可能有效,但我们选择 Memcached 是有原因的。然而,memcached 的 php 包装器的维护者显然没有看到修复 this issue作为高优先级。然而,由于 5.4 停产,越来越多的用户被迫更新到 5.5+,我认为这个问题需要尽快解决。
所以我的问题是,有没有人想出一个优雅的解决方案来解决这个问题?
我们的内部中间件 (Hobis_Api) 稍微保护了我们一下,因为我可以分解 set
和 get
函数并将它们放在它们自己的类中,它不扩展 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()
最佳答案
感谢 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 类时才有效,否则,您可能需要考虑添加自己的类。
关于PHP 5.6 - Memcached - 严格的标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32894456/