2012-01-05 35 views
5

Hãy hàm sau ví dụ:PHP chức năng như thông số mặc định

private function connect($method, $target = $this->_config->db()) { 
    try { 
     if (!($this->_pointer = @fopen($target, $method))) 
      throw new Exception("Unable to connect to database"); 
    } catch (Exception $e) { 
      echo $e->getMessage(); 
    } 
} 

Như bạn có thể thấy tôi chèn chức năng $this->_config->db() vào tham số $target vì nó là giá trị mặc định. Tôi hiểu đây không phải là cú pháp chính xác và tôi chỉ đang cố gắng giải thích mục tiêu của mình.

$this->_config->db() là hàm getter.

Bây giờ tôi biết tôi có thể sử dụng chức năng ẩn danh và gọi nó qua $target sau, nhưng tôi muốn $target cũng chấp nhận giá trị chuỗi trực tiếp.

Làm cách nào tôi có thể đặt giá trị mặc định cho bất kỳ giá trị nào được trả về bởi $this->_config->db() và vẫn có thể ghi đè lên bằng giá trị chuỗi?

Trả lời

7

Tại sao không chấp nhận giá trị NULL theo mặc định (kiểm tra với is_null()) và nếu như vậy gọi hàm mặc định của bạn?

+0

Đây là những gì tôi đã sử dụng và phương pháp ít gây khó chịu nhất, cảm ơn. 'if (is_null ($ target)) $ target = $ this -> _ config-> db();' –

1

tôi sẽ thực hiện một kiểm tra để xem nếu một giá trị đã được thông qua và gọi chức năng của tôi trong một kiểm tra đơn giản bên trong phương pháp:

private function connect($method, $target = '') { 
    try { 
     if ($target === '') { 
      $target = $this->_config->db() 
     } 

     if (!($this->_pointer = @fopen($target, $method))) { 
      throw new Exception("Unable to connect to database"); 
     } 
    } catch (Exception $e) { 
     echo $e->getMessage(); 
    } 
} 
+0

Ở mọi nơi khác, tôi tìm "null" làm giá trị mặc định và bạn đã sử dụng chuỗi rỗng. Tôi có thể hỏi tại sao không? Có phải vì bạn muốn nó ở cùng một loại (chuỗi) vì giá trị tùy chỉnh có thể là? Có lý do nào trong PHP để làm điều đó không? Tôi chỉ tò mò thôi. – TheFrost

2

Bạn có thể sử dụng is_callable()is_string().

private function connect($method, $target = NULL) { 
    if (is_callable($target)) { 
     // We were passed a function 
     $stringToUse = $target(); 
    } else if (is_string($target)) { 
     // We were passed a string 
     $stringToUse = $target; 
    } else if ($target === NULL) { 
     // We were passed nothing 
     $stringToUse = $this->_config->db(); 
    } else { 
     // We were passed something that cannot be used 
     echo "Invalid database target argument"; 
     return; 
    } 
    try { 
     if (!($this->_pointer = @fopen($stringToUse, $method))) 
      throw new Exception("Unable to connect to database"); 
    } catch (Exception $e) { 
      echo $e->getMessage(); 
    } 
} 
+0

Nhưng OP muốn gọi một phương thức cụ thể theo mặc định hơn là chấp nhận tùy ý của người gọi? – user268396

+1

Vâng, bạn chỉ có thể loại bỏ phần đầu tiên của cây 'elseif' sau đó. Phiên bản này vẫn làm điều đó, nó chỉ cung cấp thêm tùy chọn để truyền một hàm. – DaveRandom

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