2010-04-06 32 views
6

Tôi cần sử dụng phương thức gọi lại lớp trên một mảng bên trong một phương thức khác (hàm gọi lại thuộc về lớp).Cách thực hiện các phương thức gọi lại bên trong các lớp (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"); 
     } 
} 

Đây có phải là cách phù hợp để thực hiện điều đó không? (Tôi có nghĩa là, trong điều kiện của tham số thứ hai truyền cho array_map)

Trả lời

9

Tôi không nghĩ rằng bạn muốn array_filter, nhưng array_map

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

nhưng sau đó một lần nữa, bạn có thể chỉ cần cũng làm

return array_map('mysql_real_escape_string', $array); 
+0

Cảm ơn, tôi đã nhầm lẫn với nhau. – Gal

0

array_filter xóa các phần tử không thỏa mãn biến vị ngữ. Bạn có nghĩa là array_map?

return array_map(array($this, "escape_string_for_db"), $array); 
-1

giải pháp đơn giản nhất sẽ được để vượt qua các phương pháp như gọi lại - xem http://www.php.net/manual/en/language.pseudo-types.php#language.types.callback

Ngoài ra, hãy viết một hàm wrapper:

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

Sau đó:

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

Không có hành vi phạm tội, nhưng điều này là quá phức tạp và sử dụng tĩnh trong các chức năng là phong cách xấu – Gordon

0

Điều này sẽ hoạt động. Bạn có thể kiểm tra trong cùng một chức năng thời tiết tham số của bạn là chuỗi hoặc mảng.

class Database { 

    public function escape_string_for_db($data) 
    { 
    if(!is_array($data)) 
    { 
     $data =mysql_real_escape_string($data); 
    } 
    else 
    { 
     //Self call function 
     $data = array_map(array('Database ', 'escape_string_for_db'), $data); 
    } 
    return $data; 
    } 
Các vấn đề liên quan