2011-09-19 22 views
6

Khi tôi cố gắng để làm điều này:Làm thế nào để xác định các hàm cục bộ trong PHP?

function a() 
{ 
    function b() { } 
} 

a(); 
a(); 

tôi nhận được Cannot redeclare b....
Khi tôi cố gắng làm điều này:

function a() 
{ 
    if(!isset(b)) 
     function b() { } 
} 

a(); 
a(); 

tôi nhận được unexpected), expected ....
Làm cách nào để tôi có thể khai báo chức năng dưới dạng địa phương và bị lãng quên khi a trả về? Tôi cần chức năng để chuyển nó đến array_filter.

+3

chức năng làm tổ được yêu cầu cho một thế giới của đau. –

+1

Bạn đang sử dụng phiên bản PHP nào? –

+0

@Mark Elliot: Phiên bản đã tạo ra các lỗi đó là 'PHP Version 5.3.2-1ubuntu4.2', nhưng điều này phải chạy trên' PHP Version 5.3.6' – Dani

Trả lời

7

Bạn có thể sử dụng một anonymous function trong array_filter cuộc gọi của bạn.

+0

+1 Tôi thường sử dụng 'array_filter ($ array, function ($ x) {...});' –

3

Bạn có thể thử chức năng create_function mà PHP có. http://php.net/create_function

$myfunc = create_function(..., ...); 
array_filter(..., $myfunc(...)); 
unset($myfunc); 

Phương pháp này không đòi hỏi PHP 5.3+

5

Ý tưởng về "chức năng địa phương" cũng được đặt tên là "chức năng bên trong chức năng" hoặc "nested function" ... Các đầu mối là trong trang này, anonymous function, trích dẫn bởi @ceejayoz và @Nexerus, nhưng, chúng ta hãy giải thích!

  1. Trong PHP chỉ tồn tại phạm vi toàn cục cho khai báo hàm;
  2. Cách thay thế duy nhất là sử dụng một loại chức năng khác, ẩn danh.

Giải thích bằng các ví dụ:

  1. chức năng b() trong function a(){ function b() {} return b(); } cũng là toàn cầu, vì vậy việc kê khai có tác dụng tương tự như function a(){ return b(); } function b() {}.

  2. Để khai báo một cái gì đó như "hàm b() trong phạm vi a()", cách thay thế duy nhất là sử dụng không b() nhưng tham chiếu $b(). Cú pháp sẽ là một cái gì đó giống như function a(){ $b = function() { }; return $b(); }

PS: là không thể trong PHP để tuyên bố một "tài liệu tham khảo tĩnh", hàm nặc danh sẽ không bao giờ tĩnh.

Xem thêm:

0

Bạn có thể xác định chức năng địa phương trong PHP, nhưng bạn có thể khai báo nó chỉ một lần. Điều này có thể đạt được bằng cách xác định và so sánh biến tĩnh.

Kiểm tra ví dụ sau:

<?php 
function a() 
{ 
    static $init = true; 
    if ($init) { 
    function b() { } 
    $init = FALSE; 
    } 
} 

a(); 
a(); 

Ngoài ra bằng cách kiểm tra nếu chức năng đã tồn tại:

<?php 
function a() 
{ 
    if (!function_exists('b')) { 
    function b() { } 
    } 
} 

a(); 
a(); 
Các vấn đề liên quan