2011-01-20 88 views
15

Tôi đã tự hỏi tại sao php xử lý phạm vi của hàm được khai báo trong một hàm khác khi hàm được khai báo bên trong một hàm lớp.Phạm vi hàm được khai báo trong hàm

Ví dụ:

function test() // global function 
{ 
    function myTest() // global function. Why? 
    { 
    print("Hello world"); 
    } 
} 

class CMyTestClass 
{ 
    public function test() // method of CMyTestClass 
    { 
    function myTest() // This declaration will be global! Why? 
    { 
     print("Hello world"); 
    } 
    } 
} 

} 

Ai có thể giải thích điều này với tôi tại sao điều này xảy ra? Cảm ơn câu trả lời của bạn.

Greetz.

+0

Vì lợi ích của sự tò mò của tôi, lợi thế của việc khai báo hàm trong phương thức là gì? –

+0

@Gordon Bạn phải gọi hàm ở đầu tiên để nó được xác định. – Wiseguy

+0

@MikeB - Có lẽ có những lý do khác, nhưng cách tiếp cận này có thể là một nỗ lực ở một loại "chức năng ẩn danh". Định dạng đúng để làm như vậy là ở đây: http://php.net/manual/en/functions.anonymous.php – rinogo

Trả lời

10

Trong PHP, tất cả các hàm luôn là toàn cục, bất kể bạn định nghĩa chúng như thế nào hoặc khi nào. (Các hàm ẩn danh là một phần ngoại lệ cho điều này.) Cả hai định nghĩa hàm của bạn do đó sẽ là toàn cục.

From the documentation:

Tất cả các chức năng và các lớp trong PHP có phạm vi toàn cầu - chúng có thể được gọi là bên ngoài một hàm thậm chí nếu họ được xác định bên trong và ngược lại.

+4

Để thêm vào câu trả lời này, tài liệu được liên kết cũng cho biết: "Hàm không cần phải được xác định trước khi chúng được tham chiếu , ngoại trừ khi một hàm được định nghĩa theo điều kiện ... Định nghĩa của nó phải được xử lý trước khi được gọi. " Do đó, hàm mà định nghĩa bên trong phải được gọi đầu tiên để định nghĩa nó. – Wiseguy

2

Khi bạn định nghĩa một hàm trong chức năng khác nó không tồn tại cho đến khi chức năng cha mẹ được thực thi. Khi hàm cha đã được thực thi, hàm lồng nhau được xác định và giống như với bất kỳ hàm nào, có thể truy cập từ bất kỳ đâu trong tài liệu hiện tại. Nếu bạn có chức năng lồng nhau trong mã của bạn, bạn chỉ có thể thực hiện chức năng bên ngoài một lần. Các cuộc gọi lặp lại sẽ cố gắng redeclare các hàm bên trong , điều này sẽ tạo ra lỗi.

Hiện tại, tất cả hàm php là toàn cầu theo mặc định. Vì vậy, hàm lồng nhau của bạn trở thành toàn cầu thứ hai bạn gọi hàm bên ngoài

+2

"Theo mặc định" có nghĩa là gì? Làm thế nào tôi có thể tạo ra một chức năng phi toàn cầu (ngoài một hàm ẩn danh, một giao dịch rất khác.) – NikiC

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