提问人: 提问时间:7/22/2009 最后编辑:11 revsJeff 更新时间:7/24/2009 访问量:1759
PHP函数调用了两次,有趣的警告消息
PHP function called twice, funny warning message
问:
最终编辑:我已经将这个疯狂的问题总结并简化为一个新问题,因此我们可以关闭此 Q 或任何必要的内容来标记它已解决。再次感谢!
新增功能:
你能告诉我你对此的看法吗,并可能看看你是否可以重新创建它:
目前,$post->post_content 变量包含:
"before <img src="/path/to/valid_img.gif" /> after"
此代码放置在主题标题 .php 的顶部...
------ Code --------
1: $str = $post->post_content;
2: assert( isset( $str ) );
3: assert( is_string( $str ) );
4: echo $str;
5: $str = 'before <img src="/path/to/nonexistant.gif" /> after';
6: assert( isset( $str ) );
7: echo $str;
--------------------
输出这个...
------ Output ------
before <img src="/path/to/valid_img.gif" /> after
before <img src="/path/to/nonexistant.gif" /> after
--------------------
有了这些警告......
--- PHP Warnings ---
PHP Warning: assert() [<a href='function.assert'>function.assert</a>]: Assertion
failed in /path/to/header.php on line 2
PHP Warning: assert() [<a href='function.assert'>function.assert</a>]: Assertion
failed in /path/to/header.php on line 3
--------------------
如果 assert() 失败两次,为什么第 100 行会正确回显$str,而我知道它应该 100% 成功?
损坏的图像 src 与设置或取消设置变量 $str 有什么关系?WordPress错误/奇怪?
现在疯狂的部分......
当第 5-7 行被注释掉,从而消除不存在的 .gif 时,assert() 警告不会出现,输出仍然正确产生这个......
------ Output ------
before <img src="/path/to/valid_img.gif" /> after
--------------------
你有没有机会重现这个并告诉我你的想法?我是PHP的新手,但我很确定这是疯狂的。:)
老:
我对PHP比较陌生,我有以下代码:
$str = $post->post_content; // hi -- [hw] -- bye <img src="foobar.png" />
$str = core_wp( 'foo_shortcode', $str );
echo $str; // return $str; produces the same warning message
// If there is no echo or return, the warning message is not produced.
// The warning disappears when I statically set (as object) the initial $str to
// "hi -- [hw] -- bye <img src="foobar.png" />".
当我运行上面的代码时,它工作正常(foo-shortcode 正在做它的工作)。输出为:
hi -- Hello World -- bye <img src="foobar.png" />
但是,我总是收到此警告消息,告诉我 foo-shortcode 似乎正在尝试第二次运行自己,除了第二次,$str不存在。
还有问题......只有当$str包含指向不存在的 src 的 HTML img 标记时,我才会收到此警告消息。
PHP Warning: Missing argument 1 for foo_shortcode() in ...
这里是 core-wp() 和 foo-shortcode():
function core_wp( $function, $a = NULL, $b = NULL )
{
$wrap = array
(
'foo_shortcode' => 'foo_shortcode',
);
$args = array();
if ( isset( $a ) ) $args[] = $a;
if ( isset( $b ) ) $args[] = $b;
return call_user_func_array( $wrap[ $function ], $args );
}
function foo_shortcode( $content ) {
return str_replace( '[hw]', 'Hello World', $content );
}
首先,为什么代码可以正常工作,然后同时似乎又尝试第二次运行?
关于包含无效 img 的$str,我怀疑这与 WordPress 生成 $post->post_content 的方式有关。
编辑 1(7 月 22 日星期三 @ 8:55am)
我按照您的指示添加了 error-log():
error_log( 'done1' );
$str = $post->post_content;
error_log( 'done2' );
$str = core_wp( 'foo_shortcode', $str );
error_log( 'done3' );
...它在我的错误日志中产生了这个:
[22-Jul-2009 08:52:49] done1
[22-Jul-2009 08:52:49] done2
[22-Jul-2009 08:52:49] PHP Warning: Missing argument 1 for foo_shortcode() in
/home/path/to/header.php on line 23
[22-Jul-2009 08:52:49] done3
...发送到浏览器的输出(正确)为:
hi -- Hello World -- bye <img src="foobar.png" />
...但仍然发出了警告信息。
编辑 2(星期三,7 月 22 日 @ 9:18am)
然后我尝试了这个断言:
59: $str = $post->post_content;
60: assert( isset( $str ) );
61: $str = core_wp( 'foo_shortcode', $str );
62: assert( isset( $str ) );
...PHP日志显示:
[22-Jul-2009 09:16:55] PHP Warning: assert() [<a
href='function.assert'>function.assert</a>]: Assertion failed in
/home/path/to/header.php on line 60
[22-Jul-2009 09:16:55] PHP Warning: Missing argument 1 for foo_shortcode() in
/home/path/to/header.php on line 23
...但同样,输出是正确的,但仍然发出警告。
在我看来,PHP 最初没有设置 $str = $post->post-content,然后它运行 core-wp( 'foo-shortcode', $str ) 并对自己说“哦!我真的需要设置 $str = $post->post-content...”返回并设置它,然后输出正确的数据。
答:
我会尝试将$args初始化为 array(),就像您使用 wrap 一样。 这应该可以解决您的问题。
function core_wp( $function, $a = NULL, $b = NULL )
{
$wrap = array
(
'do_shortcode' => 'do_shortcode',
);
$args=array();
if ( isset( $a ) ) $args[] = $a;
if ( isset( $b ) ) $args[] = $b;
return call_user_func_array( $wrap[ $function ], $args );
}
关于双重执行,我不能说什么:你发布的代码对此不负责任。
评论
如果代替
$str = $post->post_content;
你暂时把:
$str = 'some string you believe to trigger the error';
错误是否仍然发生?如果是这样,那让我们肯定地看。如果不是,可能是罪魁祸首。core_wp()
$post->post_content
编辑:若要确定是否为 NULL,请添加以下行:$post->post_content
echo "post_content:";
var_dump($post->post_content);
$str = $post->post_content;
发生错误时,请告诉我们它是否为 NULL。
EDIT2:由于您确定不是 NULL,因此请在发布代码后立即尝试。警告是在“完成”之前还是之后显示?此外,将 error_log() 语句添加到所有有问题的函数的顶部,说明“called functionname”,这将帮助您确定它们是否被调用了两次。$post->post_content
error_log("done");
评论