Использование preg_replace_callback с внешним классом - PullRequest
2 голосов
/ 25 октября 2011

У меня к вам вопрос!

Обычно, если вы вызываете функцию обратного вызова в контексте ООП, вы должны использовать array(&$this, 'callback_function')

Это то, что я понял.

Но теперь я хочу вызвать обратный вызов во внешнем классе из-за большого количества callback_functions.Я хочу дать им собственный класс по структурным соображениям.

Я подумал: «Хорошо, создайте экземпляр этого класса и передайте его вместо $ this».

Поэтому я попробовал его сarray($cb, 'callback_function') и 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.">";
    }

Ответы [ 2 ]

7 голосов
/ 25 октября 2011

Первый комментарий:

Обычно, если вы вызываете функцию обратного вызова в контексте ООП, вы должны использовать 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);
1 голос
/ 25 октября 2011

Скажем, ваш внешний класс выглядит следующим образом

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

Подробнее о обратных вызовах

...