PHP geri çağırma işlevleri için Değişken kapsamı

2 Cevap php

Düzenli ifadeler hakkında sorulan başka bir soruya yanıt olarak, benim soruna bir çözüm olarak preg_replace_callback function (PHP regex templating - find all occurrences of {{var}}) kullanmak için söylendi. Bu harika çalışıyor, ama şimdi geri çağırma işlevleri değişken kapsamına ilişkin bir sorum var.

Metnini ayrıştırmak işlevi bir sınıfın bir parçası, ama ben kullanmak istediğiniz veri işlevi yerel olarak saklanır. Ancak, benim geri arama işlevi içinde bu verilere erişemez bulduk. İşte şimdiye kadar denedim yolu vardır:

  • '$this->callback_function' callback parametresi olarak geçen, özel bir sınıf işlevi olarak geri arama uygulamak (çalışmıyor, php önemli bir hata var)
  • (Aşağıdaki örneğe bakınız) kullanır ama $newData callback_function içeride kapsamında değildir çünkü bu da işe yaramadı işlevin içinde geri arama uygulamak

Any ideas as to how I can access $newData inside my callback function, preferably without using globals?
Many thanks.

Ikinci girişimi (I madde noktadan sonra koydum düzgün biçimlendirmek değildir) için aşağıdaki Örnek

public function parseText( $newData ) {
  ...
  function callback_function( $matches ) {
    ...  //something that uses $newData here
  }
  ...
  preg_replace_callback( '...', 'callback_function', $textToReplace );
}

2 Cevap

  • Geçen, özel bir sınıf işlevi olarak geri arama uygulamak * '$ this-> callback_function' * arama parametresi olarak (çalışmıyor, php önemli bir hata var)

preg_replace_callback ('...', 'callback_function', $ textToReplace);

callback_function kendi sınıfındaki özel bir yöntemi ise preg_replace_callback ('...', array($this, 'callback_function'), $textToReplace); olması için çağrı değiştirin.

<?php

class PregMatchTest
{

    private callback_function ($matches)
    {
    	// ......
    }

    public function parseText ($newData)
    {
    	// ....

    	preg_replace_callback( '...', array($this, 'callback_function'), $textToReplace );
    }

}

?>

Ben isterseniz belki sadece * $ GLOBALS dizisi ve then unset it üzerinde ayarlayın, bu küresellerle kullanmadan mümkün olduğunu sanmıyorum.