2010-11-15 26 views
6

Tại sao PHP cho phép các hàm lồng nhau?Làm tổ chức năng PHP: với mục đích gì?

<?php 
function foo() { 
    function bar() { 
     return "bar"; 
    } 
    return "foo"; 
} 
print foo(); 
print bar(); 

.. là hợp lệ PHP.

Nhưng:

  1. Tại sao làm tổ sẽ là cần thiết bao giờ?
  2. Và ngay cả khi vậy, tại sao tôi có thể gọi thanh từ bất kỳ đâu (và không, ví dụ: chỉ với foo() hoặc máng foo.bar() hoặc như vậy).

Tôi đã tham gia vào ngày hôm nay, vì tôi đã quên một khung đóng ở đâu đó và đã có quá nhiều điểm tiếp theo. Mã đã hợp lệ và không có lỗi nào bị ném; nhưng tất cả bắt đầu diễn xuất thực sự kỳ lạ. Chức năng không được khai báo, callbacks sẽ bối rối và như vậy. Đây có phải là một tính năng, và nếu có, với mục đích gì? Hoặc một số phong cách riêng?

ĐÁP: commentor chỉ ra rằng đây là một trùng lặp của What are php nested functions for.

+1

Đáng yêu. Như thể PHP cần một lý do khác để thu hút hận thù ... –

+1

Đã được bảo vệ rất tốt rồi: có thể trùng lặp [Chức năng lồng nhau của php là gì?] (Http://stackoverflow.com/questions/415969/what-are- php-lồng nhau-chức năng-cho) – meagar

+3

Ngoài ra, chỉ vì bạn không hiểu một cái gì đó không làm cho nó "độc tài", mà không phải là một từ bằng cách này. – meagar

Trả lời

7

Lưu ý rằng thứ tự quan trọng ở đây; bạn không thể gọi bar() trước khi gọi foo() trong ví dụ của bạn. Logic ở đây dường như là việc thực hiện hàm foo() định nghĩa thanh() và đặt nó trong phạm vi toàn cục, nhưng nó không được định nghĩa trước khi thực hiện foo(), do phạm vi.

Việc sử dụng ở đây sẽ là một dạng nguyên thủy của quá tải hàm; bạn có thể có hàm bar() của bạn thực hiện các hoạt động khác nhau tùy thuộc vào phiên bản nào của foo() khai báo nó, giả sử tất nhiên mỗi phiên bản khác nhau của foo() thực sự định nghĩa một hàm bar().

+2

Tôi tự hỏi điều gì sẽ xảy ra khi 'foo()' được gọi là lần thứ hai. Người ta sẽ nghĩ rằng một lỗi sẽ được ném bởi vì 'bar()' đã được định nghĩa. – dnagirl

+2

@dnagirl: nó: Lỗi nghiêm trọng: func.đã được xác định. – berkes

6

Trong PHP, bạn có thể xác định hàm, hằng số thời gian chạy và thậm chí cả các lớp có điều kiện. Điều này cho phép bạn xác định các hàm/hằng số/lớp khác nhau tùy thuộc vào hoàn cảnh.

Chỉ cần ví dụ: Xác định chức năng String\Length tùy thuộc vào việc hỗ trợ nhiều byte được bật hay tắt trong ứng dụng của bạn.

namespace String; 

if (\MULTIBYTE_MODE) { 
    function Length($string) { 
     return strlen($string); 
    } 
} else { 
    function Length($string) { 
     return mb_strlen($string); 
    } 
} 

Hàm lồng nhau chỉ là trường hợp đặc biệt của định nghĩa hàm có điều kiện.

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