2013-03-12 34 views
8
function convert($currencyType) 
{ 
    $that = $this; 
    return $result = function() use ($that) 
    { 
     if (!in_array($currencyType, $this->ratio)) 
       return false; 

     return ($this->ratio[$currencyType] * $this->money); //a float number 
    }; 
} 

$currency = new Currency(); 
echo $currency->convert('EURO'); 

Có vấn đề gì?Đối tượng của lớp Đóng cửa không thể được chuyển đổi thành chuỗi trong: tên tệp.

Tôi nhận được thông báo lỗi:

Catchable fatal error: Object of class Closure could not be converted to string 
+5

Hàm 'convert()' trả về một hàm. Sau đó, bạn đang cố gắng ép nó vào một chuỗi bằng cách 'echo()' ing nó. – landons

+0

Nhưng đóng cửa trả về một float/false cho $ result? –

+0

Và tham chiếu '$ this' của bạn bên trong Closure phải là' $ that'. Họ có thể đã thay đổi điều đó trong 5.4 suy nghĩ; không chắc. – landons

Trả lời

1

Chỉ cần xóa return ở đó và làm:

$result = function() use ($that) 
{ 
    if (!in_array($currencyType, $this->ratio)) 
      return false; 

    return ($this->ratio[$currencyType] * $this->money); //a float number 
}; 
return $result(); 

Ngoài ra, bạn nhận ra bạn không sử dụng $that bên trong hàm?

Nhân tiện, tại sao bạn cần một chức năng ẩn danh ở đó? Chỉ cần làm:

function convert($currencyType) 
{ 
    if (!in_array($currencyType, $this->ratio)) 
     return false; 

    return ($this->ratio[$currencyType] * $this->money); //a float number 
} 
+0

Tôi đang cố gắng làm điều đó với các bao đóng. Tôi biết nó không cần thiết vì tôi có thể tự làm mà không cần đóng cửa. Tôi chỉ muốn sử dụng bao đóng cho mục đích học tập. –

+0

@LisaMiskovsky, đóng cửa có thể được lưu trữ trong các biến. Do đó '$ var = function() {...}' sẽ lưu trữ hàm đó trong một biến. Đây không chỉ là nơi sử dụng các chức năng ẩn danh. Đừng học những điều xấu ngay từ đầu. Khi bạn cần đóng cửa, bạn sẽ biết cách sử dụng chúng. – Shoe

+0

Bạn có thể cho tôi một ví dụ về nơi mà nó là nơi tốt để sử dụng các bao đóng không? –

0
class Currency { 
    function convert($currencyType) 
    { 
     if (!in_array($currencyType, $this->ratio)) 
      return false; 
     return ($this->ratio[$currencyType] * $this->money); //a float number 
    } 
} 

$currency = new Currency(); 
echo $currency->convert('EURO'); 

Bạn đang định nghĩa một hàm lambda. Bạn không cần nó. Ngoài ra, bạn nên sử dụng bcmul() nếu điều này là để có bất kỳ loại chính xác nào; nổi trong PHP sẽ cung cấp cho bạn kết quả sôi nổi.

5

Couple của vấn đề:

  1. Bởi vì bạn đang trả lại một đóng cửa, trước tiên bạn phải gán việc đóng cửa cho một biến, và sau đó gọi hàm
  2. tài liệu tham khảo $this của bạn sẽ không hoạt động bên trong một đóng cửa (đó là lý do tại sao bạn use ing $that thay)
  3. bạn cũng cần phải sử dụng $currencyType để truy cập nó trong phạm vi của việc đóng cửa

function convert($currencyType) 
{ 
    $that =& $this; // Assign by reference here! 
    return $result = function() use ($that, $currencyType) // Don't forget to actually use $that 
    { 
     if (!in_array($currencyType, $that->ratio)) 
       return false; 

     return ($that->ratio[$currencyType] * $that->money); //a float number 
    }; 
} 

$currency = new Currency(); 
$convert = $currency->convert('EURO'); 
echo $convert(); // You're not actually calling the closure until here! 
+0

Một câu hỏi , Tuy nhiên. Tại sao if (! In_array ($ currencyType, $ that-> ratio)) trả về false; luôn luôn trả về sai? $ currencyType = 'EURO' và print_r ($ that-> ratio) xuất ra một cách chính xác mảng. –

2

Bạn phải thực hiện chức năng giữa dấu ngoặc đơn và thêm dấu ngoặc đơn khi đóng chức năng.

function convert($currencyType) 
{ 
    $that = $this; 
    return $result = (function() use ($that) 
    { 
     if (!in_array($currencyType, $this->ratio)) 
       return false; 

     return ($this->ratio[$currencyType] * $this->money); //a float number 
    })(); 
} 

$currency = new Currency(); 
echo $currency->convert('EURO'); 
Các vấn đề liên quan