Функция PHP вызывается дважды, забавное предупреждающее сообщение - PullRequest
1 голос
/ 21 июля 2009

ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: я суммировал и упростил этот сумасшедший вопрос в новый вопрос, поэтому мы можем закрыть этот вопрос или все, что необходимо, чтобы отметить его разрешение Еще раз спасибо!

NEW

Можете ли вы сказать мне свое мнение об этом, и, возможно, посмотреть, если вы можете воссоздать его:

В настоящее время переменная $ 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, если assert () дважды завершается ошибкой, когда я ЗНАЮ 100%, что это должно быть успешно?

Какое отношение имеет поврежденное изображение к src при установке или снятии переменной $ str? Ошибка / странность в WordPress?

Теперь сумасшедшая часть ...

Когда строки 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 содержит HTML-тег img, указывающий на несуществующий src.

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 );
}

Во-первых, почему код работает нормально, а затем, кажется, одновременно пытается запустить себя второй раз?

А что касается $ str, содержащего недопустимый img, я подозреваю, что это как-то связано с тем, как WordPress генерирует $ post-> post_content.

РЕДАКТИРОВАТЬ 1 (Weds, 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, 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-> post-content, затем он запускает core-wp ('foo-shortcode', $ str) и говорит себе: "О! Мне действительно нужно для установки $ str = $ post-> post-content ... "возвращается и устанавливает его, а затем выводит правильные данные.

Ответы [ 2 ]

1 голос
/ 22 июля 2009

Если вместо

$str = $post->post_content;

Вы временно положили:

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

Ошибка все еще происходит? Если так, то это заставляет нас взглянуть на core_wp() наверняка. Если нет, то $post->post_content может быть виновником.

РЕДАКТИРОВАТЬ: Чтобы определить, если $post->post_content НЕДЕЙСТВИТЕЛЕН, добавьте следующие строки:

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

Дайте нам знать, если при возникновении ошибки он равен NULL.

EDIT2: Поскольку вы уверены, что $post->post_content - это , а не NULL, попробуйте error_log("done"); сразу после кода, который вы опубликовали. Предупреждение появляется до или после «Готово»? Кроме того, добавьте операторы error_log () вверху всех рассматриваемых функций с указанием «вызываемый имя-функции », и это поможет вам определить, вызывались ли они дважды.

1 голос
/ 21 июля 2009

Я бы попытался инициализировать $ 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 );
}

Я ничего не могу сказать о двойном исполнении: код, который вы публикуете, не несет за это ответственности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...