【问题标题】:How can I test for a serialized variable? Without throwing E_NOTICE if string is not serialized如何测试序列化变量?如果字符串未序列化,则不抛出 E_NOTICE
【发布时间】:2011-11-06 12:03:33
【问题描述】:

我正在编写自己的 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。我原以为@on @unserizlize() 会这样做,但是...

如果字符串是序列化的,那么一切都是笨拙的。如果不是,那就不是。

【问题讨论】:

  • 这是函数my_dump 的错误,不是吗? unserialize 似乎在工作,不是吗?否则,第 362 行在哪里,是您调用unserialize 的那一行吗?
  • 对此感到抱歉。是的,unserialzie 在序列化的字符串上可以正常工作,但在未序列化时会发出通知。
  • 它应该可以在没有通知的情况下完美运行,因为您正在使用 @ 消除任何错误。您是否偶然使用了禁用 @ 的扩展程序?
  • 我猜stackoverflow.com/questions/1369936/…的回答会帮助你。
  • 我不知道一个冷禁用@ - 但也许是Xdebug?

标签: php


【解决方案1】:

当你尝试反序列化它时,如果它没有被序列化,它会返回false。它还返回一个 E_NOTICE,这是该输出的来源。

来自手册:

如果传递的字符串不是不可序列化的,则返回 FALSE 并发出 E_NOTICE。

检查反序列化的返回值是否===false

【讨论】:

  • 抱歉,看来我需要更新问题了。这就是它的全部意义。如果字符串未序列化,则会抛出我想要抑制的 E_NOTICE。
  • 是的,部分原因也是我的错,我只是回答了问题的标题和开始摘要,而不是查看所有代码。
  • @mawg 看起来您正在其他地方调用反序列化,并且可能缺少@
  • +1 表示您的答案,+1 表示您的每个 cmets。当然不是你的错。我肯定给问题的标题是错误的:-(这是整个代码中唯一的 unserialize() ...(除此之外,Xdebug 转储堆栈,所以我可以确定)
  • Nvm。我会奖励你答案并继续寻找
猜你喜欢
  • 2011-05-13
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2012-06-19
  • 2011-08-12
  • 2022-11-15
相关资源
最近更新 更多