PHP fonksiyon komik uyarı mesajı, iki kez çağrıldı

2 Cevap php

FINAL EDIT: I've summarized and simplified this crazy question into a new question, so we can close this Q or whatever is necessary to mark it resolved. Thanks again!

NEW:

Bana bu senin görüşünü söyle, ve bunu yeniden eğer belki görebilirsiniz:

Şu anda, $ post-> post_content değişken içerir:

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

Bu kod tema header.php üstüne yerleştirilen ...

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

Çıkışlar bu ...

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

Bu uyarılar ...

--- 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
--------------------

Neden% 100 başarılı gerektiğini BİLİYOR zaman assert () iki kez başarısız olursa 4. düzgün $ str yankı çizgi olur?

Kırık bir görüntü src değişkeni $ str kurma veya unsetting ile yapmak ne var? WordPress bug / gariplik?

Now the crazy part...

Çizgiler 5-7 böylece nonexistant.gif ortadan kaldırarak, dışarı yorumladı zaman, assert () uyarısı görünmüyor ve çıkış HALA doğru bu üretir ...

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

Herhangi bir şans bu yeniden ve ne düşündüğünüzü bana söyleyebilir? Ben PHP için yeni değilim, ama bu çılgınlık eminim. :)

OLD:

Ben PHP nispeten yeni ve ben bu kodu vardır:

$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" />".

Ben Yukarıdaki kodu çalıştırdığınızda, bu (foo-kusur bu kadar iş yapıyor) çalışıyor. Çıktısı:

hi -- Hello World -- bye <img src="foobar.png" />

Ancak ben her zaman foo-kusur etrafında ikinci kez hariç, kendisini ikinci kez çalıştırmak için çalışıyor gibi görünüyor bana, bu uyarı mesajı almak, $ str yok.

Ve yakalamak ... $ str var olmayan src işaret eden bir HTML img etiketi içerdiğinde Ben sadece bu uyarı mesajı almak.

PHP Warning:  Missing argument 1 for foo_shortcode() in ...

Ve burada çekirdek-wp () ve foo-kusur olduğunu ():

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

Birincisi, neden sonra kod çalışma ince ve aynı anda kendini ikinci kez çalıştırmak için denemek gibi görünüyor?

Ve geçersiz img içeren $ str ilgili, ben bu WordPress $ post-> post_content üretir yolu ile ilgisi vardır sanıyorum.

EDIT 1 (EvlendiİSTANBUL 22 Temmuz 08:55 @)

Ben bu gibi talimatlara göre hata günlüğü () eklendi:

error_log( 'done1' );
$str = $post->post_content;
error_log( 'done2' );
$str = core_wp( 'foo_shortcode', $str );
error_log( 'done3' );

... Ve bu benim hata günlüğünde bu üretilen:

[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

... Ve (doğru) tarayıcıya gönderilen çıkış oldu:

hi -- Hello World -- bye <img src="foobar.png" />

... Ama uyarı mesajı hala üretildi.

EDIT 2 (EvlendiİSTANBUL 22 Temmuz 09:18 @)

Ben o zaman bu iddiayı çalıştı:

59: $str = $post->post_content;
60: assert( isset( $str ) );
61: $str = core_wp( 'foo_shortcode', $str );
62: assert( isset( $str ) );

... Ve PHP Kayıtta:

[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

... Ama yine çıktı doğru, henüz uyarı hala verilir.

PHP başlangıçta ayar değil gibi geliyor bana $ str = $ post-> post-içerik, o çekirdek-wp ('foo-kusur', $ str) çalışır ve oh! Ben gerçekten $ ayarlamanız gerekir "kendisi diyor str = $ post-> post-içerik ... "geri gider ve bu ayarlar ve sonra doğru verileri verir.

2 Cevap

Eğer yerine

$str = $post->post_content;

Sen temporarilly koydu:

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

Hata hala mı oluşuyor? Eğer öyleyse, o kesin core_wp() bakmak götürür bizi. Değilse, $post->post_content suçlu olabilir.

EDIT: $post->post_content NULL ise, aşağıdaki satırları ekleyin belirlemek için:

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

Hata oluştuğunda NULL olmadığını bilelim.

EDIT2: eminsin beri $post->post_content olup not NULL, deneyin bir error_log("done");, hemen bunu gönderdiniz gibi kodundan sonra. Uyarısı "done" önce veya sonra gösterir mi? Ayrıca, "functionname sözde" belirterek, söz konusu tüm fonksiyonların üstüne hatalar.log () ifadeleri ekleyin ve onlar iki kere çağrıldığını konum olmadığını belirlemenize yardımcı olur.

I would try to initialize $args to array() just like you do with wrap. This shoud solve your issue.

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

Eğer göndermeden kod bunun için sorumlu değildir: Ben çift yürütülmesi ile ilgili bir şey söyleyemem.