如何测试序列化变量?如果字符串未序列化,则不抛出E_NOTICE

时间:2011-08-30 04:04:42

标签: php

我正在编写自己的var_dump来满足某些要求,这些要求可能只适用于我并且有问题。

代码检查对象,数组等,最后进入一个阶段,它认为它留有数字,字符串或布尔值。

当然,一个字符串实际上可以是一个序列化的变量,所以我想要哎...

if (is_string($variable))
{
   // check if it is serialzed; if so, unserialize & dump as an array, \
   // with a suitable header indicating that it was serialized
   try
   {
      $old_error_level= error_reporting(E_ALL ^ E_NOTICE);
      $unserialized_varaible = @unserialize($variable);
      $result .= my_dump($unserialized_varaible, ... <some params>); // recursive call
      $old_error_level= error_reporting($old_error_level);
   }

   catch(Exception $e)    // Treat it as a string
   {
       $old_error_level= error_reporting($old_error_level);
       $result .= GetHtmlForSimpleVariable($variable, ... <some params>);
   }
}

但是,当我尝试转储一个简单的,非序列化的字符串时,我得到的是

Problem type Notice "unserialize() 
  [<a href='function.unserialize'>function.unserialize</a>]:
  Error at offset 0 of 14 bytes" at line 362 in file my_dump.php<br><br>

更新:当字符串不是序列化字符串时,我想要抑制E_NOTICE。我原以为@ @unserizlize()会这样做,但是......

如果字符串是序列化的,那么一切都是hunky dory。如果没有,那就没有。

1 个答案:

答案 0 :(得分:3)

当您尝试反序列化它时,如果未序列化,则返回false。它还返回一个E_NOTICE,它是输出的来源。

从手册:

  

如果传递的字符串不可反序列化,则返回FALSE   并且发布了E_NOTICE。

检查反序列化===false

的返回值