Требуется ли 'this' при вызове локального метода внутри класса? - PullRequest
2 голосов
/ 14 марта 2012

Когда я вызываю локальный метод из моего класса, как показано в примере ниже, я должен поставить $this-> перед ним?

Пример:

class test{
    public function hello(){
        $this->testing(); // This is what I am using
        testing(); // Does this work?
    }
    private function testing(){
        echo 'hello';
    }
}

Причина, по которой я спрашиваю, заключается в том, что я использую функцию array_map с предопределенной функцией PHP в ней, и теперь я собираюсь использовать функцию, определенную мной. Вот что я имею в виду:

class test{
    public function hello(){
        array_map('nl2br',$array); // Using predefined PHP function
        array_map('mynl2br',$array); // My custom function defined within this class
    }
    private function mynl2br(){
        echo 'hello';
    }
}

Ответы [ 4 ]

7 голосов
/ 14 марта 2012

Да, это необходимо. testing() относится к глобальной функции с таким именем и вызовет ошибку, если функция не существует.

Однако вы можете сделать обратный вызов с помощью переменной $this. Как видно из руководства по PHP , вам нужно создать массив, в котором первый элемент - это объект, а второй - имя метода. Итак, здесь вы можете сделать это:

array_map(array($this, 'mynl2br'), $array);
5 голосов
/ 14 марта 2012

Проверьте сами: P

В результате testing(); не срабатывает, а $this->testing(); срабатывает. testing(); относится только к функциям вне класса.

<?php
class test{
    public function hello(){
        $this->testing(); // This is what I am using
        testing(); // Does this work?
    }
    private function testing(){
        echo 'hello';
    }
}

function testing() {
    echo 'hi';
}

$test = new test();
$test->hello(); // Output: hellohi
?>

См. @ ответ lonesomeday для возможного решения вашей проблемы.

1 голос
/ 14 марта 2012

В качестве альтернативы вы можете использовать замыкания:

array_map(function($el) { ...; return $result; }, $array); 
1 голос
/ 14 марта 2012

Чтобы использовать метод класса в качестве обратного вызова, вам нужно передать массив , содержащий экземпляр объекта и имя метода, вместо просто имя метода:

array_map(array($this, 'mynl2br'), $array);

Вместо

array_map('nl2br', $array);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...