Bir arama gerektiren bir PHP işlevini kullanırken, nasıl geri arama için özel bir parametre geçmek?

4 Cevap php

Örneğin,

http://www.php.net/manual/en/function.preg-replace-callback.php

<?php
// this text was used in 2002
// we want to get this up to date for 2003
$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";
// the callback function
function next_year($matches)
{
// as usual: $matches[0] is the complete match
// $matches[1] the match for the first subpattern
// enclosed in '(...)' and so on
return $matches[1].($matches[2]+1);
}
echo preg_replace_callback(
"|(\d{2}/\d{2}/)(\d{4})|",
"next_year",
$text);

?>

Biz NEXT_YEAR geri arama işlevi için özel bir parametre geçmek istiyorsanız, biz) (create_function kullanmadan nasıl yapabilirim?

Hepinize çok teşekkürler.

4 Cevap

Ben S. Gehrigs'in fikrini aldı ve onunla biraz daha ileri gitti, neden sınıf içinde tüm yedek işlevselliği koymak değil?

<?php
class Replacer {

    private $additional = 'X';

    private function next_year($matches)
    {
        // as usual: $matches[0] is the complete match
        // $matches[1] the match for the first subpattern
        // enclosed in '(...)' and so on
        return $this->additional . $matches[1].($matches[2]+1);
    }

    public function replace_years($text)
    {
        return preg_replace_callback( "|(\d{2}/\d{2}/)(\d{4})|", array($this, 'next_year'), $text);
    }
}


$text = "April fools day is 04/01/2002\n";
$text.= "Last christmas was 12/24/2001\n";

$Replacer = new Replacer();
echo $Replacer->replace_years($text);

Ve sonuç:

[~]> php test.php
April fools day is X04/01/2003
Last christmas was X12/24/2002

Bu kolay bir çözüm olmadığını bilmiyorum, ama nesne durumunda gerekli parametreleri taşıyan bir nesne yöntemi geri arama için gitmek istiyorum:

class Callback
{
    public $parameter;

    public function handle($matches)
    {
        return $matches[1] . ($matches[2] + $this->parameter);
    }
}

$instance = new Callback();
$instance->parameter = 99;
echo preg_replace_callback("|(\d{2}/\d{2}/)(\d{4})|", array($instance, 'handle'), $text);

İkinci seçenek global değişkenler için çare olacaktır:

$parameter = 99;

function next_year($matches)
{
    global $parameter;
    return $matches[1] . ($matches[2] + $parameter);
}
echo preg_replace_callback("|(\d{2}/\d{2}/)(\d{4})|", "next_year", $text);

callback pseudo-tipi bir göz atın , you can pass any variant of that to preg_replace_callback.

Burada tip bir bakış vererek, dün verdiği bir cevaptır: Can you store a function in a PHP array?

callback pseudo-tipi is just a string with the name of a function. So you can either declare the function like any other function and use that name just like you did. Or you use the create_function yürütme üzerinde bir işlev bildirmek için. create_function daha sonra yeni oluşturulan işlevin adını döndürür lambda_ x . (Since PHP 5.3 you can also use the anonymouse function syntax.)

callback bir fonksiyonu sadece adıdır beri Ancak, anında bu fonksiyonu oluşturmak için bir işlevi kullanmak ve bu gibi o newley yaratılan işlevin adını döndürmek olabilir:

function shift_years($years) {
    return create_function('$matches', 'return $matches[1].($matches[2]+'.((int)$years).');');
}
$func = shift_years(123);
echo preg_replace_callback("|(\d{2}/\d{2}/)(\d{4})|", $func, $text);

Belirtildiği gibi şimdi shift_years sizin özel callback fonksiyonu oluşturur.