почему массив (className, "privateFunctionName") возвращает приватную функцию? - PullRequest
0 голосов
/ 28 апреля 2020
class someClass
{
    public function truncate($content, $amount = false)
    {

        if (!$amount || preg_match_all("/\s+/", $content, $junk) <= $amount) return $content;

        $content = preg_replace_callback("/(<\/?[^>]+\s+[^>]*>)/", array($this, '_shield'), $content);

        ......

        return $truncate;
    }

    ... 

    private function _shield($matches)
    {
        return preg_replace("/\s/", "\x01", $matches[0]);
    }

    ...

    private function _unshield($strings)
    {
        return preg_replace("/\x01/", " ", $strings);
    }

    ...
}

В соответствии с PHP Manual , 2-й параметр preg_replace_callback должен быть функцией-обработчиком, в приведенном выше коде это array($this, '_shield'), которое, я считаю, возвращает один из классов частные функции "_shield". Может кто-нибудь объяснить мне, почему array(class,privateFunctionName) вернул бы приватную функцию? Есть ли PHP справочная страница по этому поводу?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Если вы посмотрите на примеры для Callbacks / Callables , вы увидите различные способы указать объект и метод класса array($object, 'method') и array('className', 'method').

Если вы хотите чтобы понять, почему это работает с закрытыми методами, это потому, что $this является текущим объектом и, конечно, имеет доступ к своим собственным закрытым методам.

array('someDifferentClass', '_shield') и array($someDifferentObj, '_shield') НЕ будут работать, если _shield() был private в другом классе.

Вы также можете использовать анонимные функции:

$content = preg_replace_callback("/(<\/?[^>]+\s+[^>]*>)/",
                                 function($v) {
                                     return $this->_shield($v);
                                 }, $content);

Что меня здесь заставило array(1,2) вернуло бы массив [1,2], затем почему array($object, 'method') возвращает метод вместо массива с $object его первым элементом, а строка 'method' - вторым?

Возвращает массив с $object его первым элемент и строка 'method' являются вторыми. Но затем preg_replace_callback использует эти фрагменты информации в массиве для вызова метода. Вы можете сделать то же самое в PHP:

    $method = array($this, '_shield');
    $truncate = ${$method[0]}->{$method[1]}($content);
0 голосов
/ 29 апреля 2020

Согласно руководству, вторым параметром должен быть вызываемый (как определено в руководстве ), и array($this, '_shield') прав в том, что: он определяет, что $this->_shield() должен использоваться как функция для обработки замены

...