2010-09-28 26 views
11

Tôi có một số mã PHP 5.3 để xây dựng một mảng được chuyển đến một khung nhìn. Đây là mã tôi có.Chuyển đổi mã với các chức năng Chưa xác định thành PHP 5.2

# Select all this users links. 
$data = $this->link_model->select_user_id($this->user->id); 
if (count($data) > 0) { 
    # Process the data into the table format. 
    $table = array 
    (
     'properties' => array 
     (
      'delete_link_column' => 0, 
     ), 
     'callbacks' => array 
     (
      # Callback for the name link. 
      function($value) { 
       return sprintf('<a href="/links/view/name/%s">%s</a>', $value, $value); 
      }, 
      # Callback for the category link. 
      function($value) { 
       return sprintf('<a href="/category/view/name/%s">%s</a>', $value, $value); 
      }, 
      # Callback for the creation date. 
      function($value) { 
       return date('jS M Y', $value); 
      }, 
      # Callback for the delete link. 
      function($value) { 
       return sprintf('<a href="links/delete/name/%s">delete</a>', $value); 
      }, 
     ), 
     'columns' => array 
     (
      'name', 'category', 'creation date', 
     ), 
     'data' => array 
     (

     ), 
     'sorting' => array 
     (
      'sort' => false, 
     ), 
    ); 

Tuy nhiên vấn đề là tôi không thể sử dụng các chức năng ẩn danh trong PHP 5.2, là máy chủ tôi phải tải lên bài tập ở trường này. Khung nhìn yêu cầu các hàm gọi lại được định nghĩa để nó có thể gọi chúng.

Cách nào gọn gàng nhất để chuyển đổi mã PHP này thành không sử dụng các chức năng ẩn danh? Cảm ơn.

+1

Khi nào và như thế nào và tại sao các cuộc gọi lại được gọi là? – deceze

+0

@deceze Mảng này được chuyển đến một khung nhìn xử lý mảng và tạo một bảng từ dữ liệu. Các callbacks được gọi cho dữ liệu trong mỗi cột để định dạng dữ liệu. Vì vậy, nếu giá trị ô bảng là 'Thuyền' trong cột đầu tiên, chế độ xem sẽ xử lý giá trị 'Boats Tôi thực sự không muốn thay đổi chế độ xem vì tôi có rất nhiều bộ điều khiển sử dụng nó như thế này. – NeedsEducation

Trả lời

8

Bạn có thể gọi là một trong những chức năng như sau:

$func = $callbacks[0]; 
$func(); 

nào cũng làm việc với create_function() và sử dụng dây cho các chức năng được đặt tên như vậy:

function test() { 
    echo "test"; 
} 
$func = 'test'; 
$func(); 

$func = create_function('' , 'echo "test 2"; '); 
$func(); 

Ngoài ra, nếu gọi được thực hiện sử dụng call_user_func bạn có thể sử dụng array($object, 'func_name') để gọi một phương thức công khai trên một đối tượng hoặc một lớp học với array('Class_Name', 'func_name'):

class Test { 
    public static function staticTest() { echo "Static Test"; } 
    public function methodTest() { echo "Test"; } 

    public function runTests() { 
    $test = array('Test', 'staticTest'); 
    call_user_func($test); 

    $test = array($this, 'methodTest'); 
    call_user_func($test); 
    } 
} 

$test = new Test(); 
$test->runTests(); 
+0

Cảm ơn những gì tôi cần. – NeedsEducation

7

Chức năng ẩn danh rất tuyệt vời cho các lần tắt một lần, như trình xử lý sự kiện trong các mẫu như Observer.

Tuy nhiên, vì bạn đã chính thức hóa giao diện (gọi lại tên hiển thị, danh mục, ngày tạo và liên kết xóa), bạn cũng có thể thực hiện thêm bước xác định giao diện 'trình kết xuất' yêu cầu 4 phương thức đó được triển khai. Thay vì chuyển các cuộc gọi lại, bạn sẽ chuyển một lớp con của trình kết xuất đồ họa đến khung nhìn, sau đó có thể được sử dụng để gọi các phương thức thích hợp. Khung nhìn cũng có thể xác nhận nó bằng cách kiểm tra lớp cha. Điều đó sẽ vẫn cho phép bạn trao đổi các trình kết xuất theo tinh thần của OOP di động, có thể tái sử dụng mà không yêu cầu các chức năng ẩn danh.

Có tình huống mà các cuộc gọi lại của bạn sẽ đến từ mã tùy ý (ví dụ: plugin) không? Nếu không, thực sự không có lợi ích gì khi làm cho những người gọi lại vô danh. Nó có vẻ như bạn đang tiết kiệm một chút không gian tên bloat, nhưng bạn cũng làm cho nó khó khăn hơn để gỡ lỗi hoặc tài liệu.

+3

+1 cho đề xuất một phương pháp OOP sạch hơn ... Có thể có thể sử dụng một ví dụ nguồn? – gnarf

+0

Tôi Jeff, cảm ơn câu trả lời, những gì bạn đang nói làm cho rất nhiều ý nghĩa. Xin lỗi tôi đã không đánh dấu câu trả lời của bạn là chính xác, cả hai câu trả lời tôi đã nhận được là chính xác (và lần sau tôi sẽ làm điều đó theo cách bạn đang nói về). – NeedsEducation

+0

Không sao cả! Tôi rất vui vì cả hai chúng tôi có thể giúp đỡ. :) –

Các vấn đề liên quan