Как реализовать методы обратного вызова в классах (PHP)

Я должен использовать метод обратного вызова класса для массива в другом методе (функция обратного вызова принадлежит классу).

class Database {

      public function escape_string_for_db($string){
             return mysql_real_escape_string($string);
      }

      public function escape_all_array($array){
             return array_map($array,"$this->escape_string_for_db");
      }
}

Действительно ли это - правильный способ пойти об этом? (Я имею в виду, с точки зрения второго параметра, переданного array_map)

6
задан Gal 6 April 2010 в 11:35
поделиться

3 ответа

Я не думаю, что вы хотите array_filter , но array_map

return array_map(array($this, 'escape_string_for_db'), $array);

, но опять же, вы можете так же хорошо

return array_map('mysql_real_escape_string', $array);
9
ответ дан 16 December 2019 в 21:37
поделиться

Самым простым решением было бы передать метод в качестве обратного вызова - см. http://www.php.net/manual/en/language.pseudo-types.php#language.types.callback

Или напишите функцию-оболочку:

function wrap_callback($target, $use_obj=false)
{
  static $obj;
  if ($use_obj) {
     if (method_exists($target, 'callback')) {
        $obj=$target;
        return true;
     } else {
        trigger_error("callback declared for something with no callback method");
        return false;
     }
  }
  return $obj->callback($target);
}

Затем:

class Database {

  public callback($string){
         return mysql_real_escape_string($string);
  }

  public function escape_all_array($array){
         wrap_callback($this, true); // register callback
         return array_filter($array,"wrap_calback");
  }
}

C.

-1
ответ дан 16 December 2019 в 21:37
поделиться

array_filter удаляет элементы, которые не удовлетворяют предикату. Вы имеете в виду array_map ?

return array_map(array($this, "escape_string_for_db"), $array);
0
ответ дан 16 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: