PHP函数调用了两次,有趣的警告消息

PHP function called twice, funny warning message

提问人: 提问时间:7/22/2009 最后编辑:11 revsJeff 更新时间:7/24/2009 访问量:1759

问:

最终编辑:我已经将这个疯狂的问题总结并简化为一个新问题,因此我们可以关闭此 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...”返回并设置它,然后输出正确的数据。

PHP 的wordpress

评论

0赞 Jeff 7/22/2009
谢谢 Eineki,将 $args 初始化为数组并没有奏效。
0赞 Eineki 7/22/2009
您确定 $str = $post->post_content;计算结果与 Null 不同?
0赞 Jeff 7/22/2009
是的,100% 确定,正如您在上面看到的,$post->post_content包含一个字符串,“hi -- [hw] -- bye <img src=”foobar.png“ />”
0赞 Jeff 7/22/2009
我想知道,任何安装了 WordPress 工作副本的人都能重现这一点吗?我目前已将代码粘贴到主题的标题 .php 中。
0赞 capfu 7/22/2009
我无法重现此警告...但是我有一件小事:$content变量在您的情况下是一个数组,因此 str_replace() 将返回一个数组 - 这是故意的吗?

答:

1赞 Eineki 7/22/2009 #1

我会尝试将$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 );
}

关于双重执行,我不能说什么:你发布的代码对此不负责任。

评论

0赞 Eineki 7/22/2009
不,我测试了,问题仍然存在。您确定 $str = $post->post_content;计算结果与 Null 不同?
1赞 Josh 7/22/2009 #2

如果代替

$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_contenterror_log("done");

评论

0赞 Jeff 7/22/2009
罪魁祸首绝对是$post>post_content因为我完全按照你的建议尝试了——我设置了一个静态$str,其中包含导致警告的文本,当我这样做时,警告就消失了。这就是我如此困惑的原因。我不知道接下来要检查什么。
0赞 Josh 7/22/2009
这对我来说意味着 $post->post_content 必须为 NULL
0赞 Jeff 7/22/2009
嘿 Josh,由于我是 PHP 的新手,您能解释一下即使返回了正确的结果,$post-post_content 也可能是 NULL 吗?这是我的主要问题。
0赞 Josh 7/22/2009
我不确定$post->post_content是从哪里来的......让我们首先确定它是否为 null。查看我编辑的帖子
0赞 Jeff 7/22/2009
嗨,乔希,这正是我所做的——事实上,我在之前和之后添加了 var_dump($post->post_content),它是可用的。因此,我的结论是该函数似乎正在尝试多次运行自己。