2008-11-17 43 views

Trả lời

45

Để vượt qua bằng cách tham khảo sử dụng call_user_func_array(), tham số trong mảng phải là một tài liệu tham khảo - nó không phụ thuộc vào định nghĩa hàm có hay không nó được thông qua tham khảo. Ví dụ: thao tác này sẽ hoạt động:

function toBeCalled(&$parameter) { 
    //...Do Something... 
} 

$changingVar = 'passThis'; 
$parameters = array(&$changingVar); 
call_user_func_array('toBeCalled', $parameters); 

Xem ghi chú trên call_user_func_array() function documentation để biết thêm thông tin.

+7

Giải pháp này ném cảnh báo với NGHIÊM NGẶT kích hoạt ... "được tán thành: Gọi thời gian pass-by-reference đã bị phản đối" – Archenoth

+3

Tôi không biết về phiên bản mới hơn của php nhưng trên máy chủ 5.3.3 của tôi khi tôi sử dụng 'call_user_func (" function ", & $ parameter)' Tôi nhận được thông điệp không được chấp nhận. Khi tôi chuyển sang 'call_user_func_array' nó đã sửa lỗi. Vì vậy, sau đó tôi kiểm tra với STRICT kích hoạt và vẫn không nhận được tin nhắn vì vậy tôi nghĩ rằng đây là một cách chấp nhận được để làm điều đó. – Lightbulb1

-2

Ngoại trừ bạn đang sử dụng chức năng không dùng nữa tại đây. Bạn sẽ tạo ra một cảnh báo trong PHP5 làm cho nó ít hơn hoàn hảo.

Cảnh báo: Không cho phép tham chiếu theo thời gian gọi; Nếu bạn muốn chuyển nó theo tham chiếu, hãy sửa đổi khai báo tên hàm thời gian chạy. Nếu bạn muốn bật tính năng gọi theo thời gian, bạn có thể đặt allow_call_time_pass_reference thành true trong tệp INI của bạn trong ...

Thật không may, dường như không có bất kỳ tùy chọn nào khác Tôi có thể khám phá.

+6

Tôi vừa thử làm điều này với PHP 5.2.9 và không nhận được bất kỳ cảnh báo nào.Tôi nghĩ rằng bạn có thể bị nhầm lẫn bởi thực tế là mảng() không thực sự là một chức năng - những gì tôi đang làm trong ví dụ mã của tôi về cơ bản là thiết lập '$ parameters [0] = & $ changingVar'. Vì vậy, nó không phải là thời gian gọi qua tham chiếu - tham chiếu truyền qua được xác định trong chữ ký phương thức. –

+1

Điều đó chỉ áp dụng cho các cuộc gọi hàm trực tiếp. 'mảng()' không phải là một hàm. Kể từ PHP 5.5, việc đặt tham chiếu vào mảng là khá bình thường. – Zenexer

+0

Hãy nhớ rằng việc chuyển 'mới' theo tham chiếu không được chấp nhận với PHP 5.5 (?), Do đó,' $ foo = & new ReferenceObject' không được phép nữa. – kaiser

1

trực tiếp, nó có thể là không thể - tuy nhiên, nếu bạn có kiểm soát cả trong chức năng bạn đang thực hiện của mã mà cuộc gọi nó - sau đó là một công việc xung quanh mà bạn có thể tìm thích hợp.

Bạn có đồng ý nhúng biến được đề cập vào một đối tượng không? Mã sẽ trông (phần nào) như thế này nếu bạn đã làm như vậy.

function toBeCalled($par_ref) { 
    $parameter = $par_ref->parameter; 
    //...Do Something... 
    $par_ref->parameter = $parameter; 
} 

$changingVar = 'passThis'; 
$parembed = new stdClass; // Creates an empty object 
$parembed->parameter = array($changingVar); 
call_user_func_array('toBeCalled', $parembed); 

Bạn thấy đấy, một biến đối tượng trong PHP chỉ là một tài liệu tham khảo đến nội dung của đối tượng --- vì vậy nếu bạn vượt qua một đối tượng để một chức năng, bất kỳ thay đổi chức năng làm cho nội dung của đối tượng sẽ được phản ánh trong chức năng gọi điện thoại cũng có quyền truy cập.

Chỉ cần chắc chắn rằng chức năng gọi điện thoại không bao giờ thực hiện một bài tập cho các đối tượng biến tự - hoặc sẽ gây ra các chức năng để, về cơ bản, mất tài liệu tham khảo. Bất kỳ câu lệnh gán nào mà hàm tạo ra phải là đúng đến nội dung của đối tượng.

0

Điều này hoạt động bằng cách tham khảo kép, biến ban đầu được sửa đổi khi biến thông số $ được sửa đổi.

$a = 2; 
$a = toBeCalled($a); 
echo $a //50 

function toBeCalled(&$par_ref) { 
    $parameter = &$par_ref; 
    $parameter = $parameter*25; 
} 
Các vấn đề liên quan