上下文:在我安装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行
出于某种原因,它每次遇到数组中的一个索引时都会发出警告。我该如何解决?谢谢!
答案 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' );