【问题标题】:Caching Reflection Object缓存反射对象
【发布时间】:2012-08-24 07:09:19
【问题描述】:

我正在尝试缓存反射对象。看代码:

class A {

        public function __construct() {
        }

}

$memcache = new Memcache();

$memcache->addServer('127.0.0.1', 11211);

$r = new ReflectionClass('A');

$memcache->set('a', $r);

$r = $memcache->get('a');

$a = $r->newInstanceArgs(array()); //here occurred the error

当我运行它产生的脚本时:

PHP Fatal error:  ReflectionClass::newInstanceArgs(): 
Internal error: Failed to retrieve the reflection object

我也尝试过使用 APC 以及序列化和反序列化,但没有任何改变。

【问题讨论】:

  • $r 保存到内存缓存之前是什么? ($memcache->set('a', $r);) 您的错误消息也缺少行号(在您的代码示例中,哪个消息与哪一行相关?)。另外你说你尝试了一些东西但没有提供任何代码,所以我们只能说:你做错了。无论你试图做什么。请记住,阅读问题的人需要理解它;)
  • Serialized PHP Reflection 的可能重复项
  • @Evert,你是对的:$r = new ReflectionClass('A'); $r = 反序列化(序列化($r)); $a = $r->newInstanceArgs(array());产生同样的错误

标签: php memcached apc


【解决方案1】:

反射对象依赖于实例引用和虚拟属性;其中,是 PHP 内部的,无法序列化。

// Stores only serialized reference to ReflectionClass
$memcache->set('a', $r);
//=> O:15:"ReflectionClass":1:{s:4:"name";s:1:"A";}

// Retrieves only a class instance & 1 attribute
$r = $memcache->get('a');
//=> ReflectionClass { public $name = "A"; }

要从未序列化的类重建 ReflectionClass,请使用给定名称重新初始化该类;

$r = $memcache->get('a');
$r = new ReflectionClass($r->name);
$a = $r->newInstanceArgs(array());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2011-01-21
    • 2012-02-05
    • 1970-01-01
    • 2012-07-05
    • 2015-03-25
    • 2010-11-15
    相关资源
    最近更新 更多