为什么不允许'序列化'SplFileInfo'?

时间:2011-06-05 12:11:24

标签: php

我正在尝试使用SplFileInfo命令将一个serialize实例数组存储在缓存中,但该命令会抛出此异常:

Exception' with message 'Serialization of 'SplFileInfo' is not allowed

为什么不允许?

谢谢!

注意:我只是好奇。问题本身可以解决。

2 个答案:

答案 0 :(得分:9)

无法序列化基于Resources的对象。

我想我不必解释原因(如果你需要解释告诉我,即使这个问题是OT)

附录

对于不相信SplFileInfo不存储/打开新资源的@Charles,我制作了一个小测试脚本。

如果你运行:

new SplFileInfo('index.php');
$link=mysql_connect('localhost','root','');
echo $link;

输出为:资源ID#2

如果你运行:

//new SplFileInfo('index.php');
$link=mysql_connect('localhost','root','');
echo $link;

输出为:资源ID#1。

答案 1 :(得分:4)

SplFileInfo无法序列化,因为PHP团队已将其标记为不可序列化。实际上,这并不奇怪: SplFileInfo对象包含的唯一实际数据是文件名。类中的每个方法实际上都是非OO标准函数的包装器,它执行相同的操作。这些方法调用在调用时解析,而不是在创建对象时解析,因此序列化对象将捕获文件的状态,就像它在序列化时一样。 / p>

如果您正在尝试构建要记住的文件列表,请从文件名构建列表。

如果您尝试在特定时间构建文件及其属性列表,请抓取这些属性并存储那些而不是对象。 * 请记住PHP caches the results of stat-based functions,因此不需要添加另一个缓存层。


Here is the C file containing the underlying mechanisms for SplFileInfo and SplFileObject。 SPL用于打开文件句柄的方法称为spl_filesystem_file_open。如果您搜索该文件,您将看到四个对它的引用。一个是功能定义。一个是SplFileObject的构造函数。一个是SplTempFileObject的构造函数。

当使用文件系统上的实体时,还有一些名为SPL_FS_FILE的定义。将SPL_FS_FILE作为其中一个条件的switch语句是第四个也是最后一个spl_filesystem_file_open调用。它位于一个名为spl_filesystem_object_create_type的函数中,它创建了基于各种基于文件系统的SPL对象工作的实际内部结构。请注意,SPL_FS_FILE案例正上方是SPL_FS_INFO案例,处理SplFileInfo案例,并注意该代码包含文件句柄的情况。

这是SplFileInfo 包含文件句柄资源的具体证明。

该文件还包含阻止SplFileInfo被序列化的代码,将其标记为不可序列化...无需注释。织补。


在PHP交互式提示中进一步揭穿资源问题

[charles@duo ~/splfileinfo_test]$ touch a b c d e
[charles@duo ~/splfileinfo_test]$ php -a
Interactive shell

php > $fh_a = fopen('./a', 'r');
php > echo $fh_a; # should be 1
Resource id #2
php > # WHAT.
php > $fh_b = fopen('./b', 'r');
php > echo $fh_b; # should be ... uh ... 3 now?
Resource id #3
php > $fi_c = new SplFileInfo('./c');
php > $fh_d = fopen('./d', 'r');
php > echo $fh_d; # should be 4 if SplFileInfo has no internal resource
Resource id #4
php > exit
[charles@duo ~/splfileinfo_test]$ php -v
PHP 5.3.6 (cli) (built: Mar 19 2011 07:44:03)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
    with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans