如何修复这些非法的字符串偏移警告?

时间:2017-09-14 18:22:53

标签: php wordpress

上下文:在我安装WordPress插件的其中一个网站上,我看到了一系列的PHP警告,但我不完全确定为什么会这样。我希望有人能帮助我弄清楚如何解决这个警告。

代码示例:

function my_function( $array ) {

   if ( ! isset( $array['where'] ) ) { $array['where'] = 'after'; }
   if ( ! isset( $array['echo'] ) ) { $array['echo'] = false; }
   if ( ! isset( $array['content'] ) ) { $array['content'] = false; }

   $array['shortcode'] = true;
   $array['devs'] = true;
   return social_warfare( $array );
}

add_shortcode( 'my_shortcode', 'my_function' );

警告:

  

警告:非法字符串偏移'where'in   /home/playitda/public_html/domain.com/wp-content/plugins/my_plugin/functions/frontend-output/shortcodes.php   第14行

     

警告:非法字符串偏移'echo'   /home/playitda/public_html/domain.com/wp-content/plugins/my_plugin/functions/frontend-output/shortcodes.php   在第15行

     

警告:无法将空字符串分配给字符串偏移量   /home/playitda/public_html/domain.com/wp-content/plugins/my_plugin/functions/frontend-output/shortcodes.php   在第15行

     

警告:非法字符串偏移'内容'   /home/playitda/public_html/domain.com/wp-content/plugins/my_plugin/functions/frontend-output/shortcodes.php   第16行

     

警告:无法将空字符串分配给字符串偏移量   /home/playitda/public_html/domain.com/wp-content/plugins/my_plugin/functions/frontend-output/shortcodes.php   第16行

     

警告:非法字符串偏移'短代码'   /home/playitda/public_html/domain.com/wp-content/plugins/my_plugin/functions/frontend-output/shortcodes.php   第18行

     

警告:非法字符串偏移'devs'   /home/playitda/public_html/domain.com/wp-content/plugins/my_plugin/functions/frontend-output/shortcodes.php   第19行

出于某种原因,它每次遇到数组中的一个索引时都会发出警告。我该如何解决?谢谢!

2 个答案:

答案 0 :(得分:2)

看起来该函数正在期待一个数组并且正在获取一个字符串。

您可以在函数定义中需要一个数组。

function my_function(array $array) { ...

然后,如果你用数组以外的东西调用它,你将得到一个TypeError。

不幸的是,代码中的其他地方仍然存在问题,您认为某个数组实际上是一个字符串。

像这样设置你的函数会先生成一个错误,这是好的,因为它会使问题显而易见。如果你修改你的函数来忽略问题,它可能只会产生更混乱的行为和可能不同的错误。

答案 1 :(得分:1)

在函数开头使用函数is_array()可以为您提供保险,如果有人传递的不是数组,则将变量重新初始化为空数组。

在执行此操作之前取消设置或将其置零是没用的,因为从PHP 5.3开始,PHP确实具有garbage collector机制。

/**
 * @params array $array
 */
function my_function( $array ) {
   if ( ! is_array ( $array ) ) { $array = [] };
   /**
    * Or, if you don't like the short array notation:
    * if ( ! is_array ( $array ) ) { $array = array(); };
    */

   if ( ! isset( $array['where'] ) ) { $array['where'] = 'after'; }
   if ( ! isset( $array['echo'] ) ) { $array['echo'] = false; }
   if ( ! isset( $array['content'] ) ) { $array['content'] = false; }

   $array['shortcode'] = true;
   $array['devs'] = true;
   return social_warfare( $array );
}

add_shortcode( 'my_shortcode', 'my_function' );