2

あなたに質問があります!

通常、OOP コンテキスト内でコールバック関数を呼び出す場合は、使用する必要がありますarray(&$this, 'callback_function')

それが私が理解したものです。

しかし、コールバック関数が多すぎるため、外部クラスでコールバックを呼び出したいと思っています。構造上の理由から、独自のクラスを提供したいと考えています。

「わかりました、このクラスのインスタンスを作成し、$this の代わりに渡します。」

array($cb, 'callback_function')だから私はandで試しましたarray($this->cb, 'callback_function')が、うまくいきません。

私は何を間違っていますか?

ご協力いただきありがとうございます!


編集:

私の基本クラスには次のものがあります。

    function __construct()
    {
        // some other vars here

        $this->cb = new Callback();
    }

そしてそれを呼び出す:

$newline = preg_replace_callback("/(^#+) (.*)/", array(&$this->cb, 'callback_heading'), $newline);

そして、私のコールバッククラスには次のものがあります:

class Callback
{
    function __construct()
    {
        $this->list = array("num" => 0, "dot" => 0, "normal" => 0);
        $this->td = array("strike" => false, "bold" => false, "italic" => false, "underline" => false, "code" => false);
    }

    public function callback_heading($parameter)
    {
        $hashs = strlen($parameter[1]);
        $hashs++;
        if($hashs > 6)
            $hashs = 6;

        return "<h".$hashs."><span class=\'indented\'>".$parameter[1]."</span><strong>".$parameter[2]."</strong></h".$hashs.">";
    }
4

2 に答える 2

7

最初のコメント:

通常、OOPコンテキスト内でコールバック関数を呼び出す場合は、を使用する必要がありますarray(&$this, 'callback_function')

いいえ、通常(最近)はarray($this, 'callback_function')-なし&です。

次に、代わりに$this、オブジェクトを表す任意の変数を配置できます。

$obj = $this;
$callback = array($obj, 'method');

また

class That
{
   function method() {...}
}

$obj = new That;
$callback = array($obj, 'method');

これは正しく機能します。PHPマニュアルのコールバック疑似型のドキュメントを参照してください。


あなたの質問のコードフラグメントにもっと似ています:

class Callback
{
    function __construct()
    {
        $this->list = array("num" => 0, "dot" => 0, "normal" => 0);
        $this->td = array("strike" => false, "bold" => false, "italic" => false, "underline" => false, "code" => false);
    }

    public function callback_heading($parameter)
    {
        $hashs = min(6, 1+strlen($parameter[1]));

        return sprintf("<h%d><span class=\'indented\'>%s</span><strong>%s</strong></h%d>", $hashs, parameter[1], $parameter[2], $hashs);
    }
}

class Basic 
{
    /** @var Callback */
    private $cb;
    function __construct()
    {
        // some other vars here
        $obj = new Callback();
        $this->cb = array($obj, 'callback_heading');
    }
    function replace($subject)
    {
        ...
        $result = preg_replace_callback($pattern, $this->cb, $subject);
    }
}

$basic = new Basic;
$string = '123, test.';
$replaced = $basic->replace($string);
于 2011-10-25T19:23:36.230 に答える
1

外部クラスが次のようになっているとしましょう

<?php
class ExternalClass {
    function callback() {
        // do something here
    }
}

コールバック関数が$thisを参照しない場合は、次のように静的に呼び出すことができます。

preg_replace_callback($pattern, 'ExternalClass::callback', $subject);

そうでなければ、あなたの方法は理論的にはうまくいくはずです。

preg_replace_callback($pattern, array(new ExternalClass, 'callback'), $subject);

コールバックについてもっと読む

于 2011-10-25T19:23:18.007 に答える