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

时间:2009-07-21 19:11:18

标签: php wordpress

最终编辑:我已将这个疯狂的问题总结并简化为一个新问题,因此我们可以关闭此Q或其他任何必要的标记以解决它。再次感谢!

您能否告诉我您对此的看法,并可能看看您是否可以重新创建它:

目前,$ post-> post_content变量包含:

"before <img src="/path/to/valid_img.gif" /> after"

此代码位于主题header.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
--------------------

为什么第4行会正确地回显$ str,如果断言()失败两次,当我知道100%它应该成功时?

破坏的图像src与设置或取消设置变量$ str有什么关系? WordPress的bug /古怪?

现在是疯狂的部分......

当第5-7行被注释掉,从而消除了nonexistant.gif时,不会出现assert()警告,并且输出STILL正确地产生了这个......

------ Output ------
before <img src="/path/to/valid_img.gif" /> after
--------------------

你有机会重现这个并告诉我你的想法吗?我是PHP的新手,但我很确定这是疯狂的。 :)

OLD:

我是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-&gt; post_content的方式有关。

编辑1(Weds,7月22日上午8:55)

我按照你的指示添加了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(Weds,7月22日上午9:18)

然后我尝试了这个断言:

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-&gt; post-content,然后它运行core-wp('foo-shortcode',$ str)并对自己说“哦!我真的需要设置$ str = $ post-&gt; post-content ...“返回并设置它,然后输出正确的数据。

2 个答案:

答案 0 :(得分: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 );
}

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

答案 1 :(得分:1)

如果不是

$str = $post->post_content;

你临时放了:

$str = 'some string you believe to trigger the error';

错误是否仍然存在?如果是这样,那导致我们肯定地看core_wp()。如果没有,$post->post_content可能是罪魁祸首。

编辑:要确定$post->post_content是否为NULL,请添加以下行:

echo "post_content:";
var_dump($post->post_content);
$str = $post->post_content;

发生错误时,请告知我们是否为NULL。

EDIT2:由于您确定$post->post_content 为NULL,因此请在代码发布后立即尝试error_log("done");。警告是在“完成”之前还是之后出现的?另外,将error_log()语句添加到有问题的所有函数的顶部,表示“被叫 functionname ”,这将帮助您确定它们是否被调用两次。