2013-08-04 36 views
7

tôi đã viết đoạn mã sau:Tại sao lệnh gọi hàm bằng tham chiếu trong PHP không được chấp nhận?

<?php 
    $a1 = "WILLIAM"; 
    $a2 = "henry"; 
    $a3 = "gatES"; 

    echo $a1." ".$a2." ".$a3. "<br />"; 

    fix_names($a1, $a2, $a3); 

    echo $a1." ".$a2." ".$a3; 

    function fix_names(&$n1, &$n2, &$n3) 
    { 
     $a1 = ucfirst(strtolower(&$n1)); 
     $a2 = ucfirst(strtolower(&$n2)); 
     $a3 = ucfirst(strtolower(&$n3)); 

    } 

    ?> 

Tôi nhận được thông báo này: Không dùng nữa: Gọi thời gian pass-by-reference đã bị phản đối

Tôi cần một lời giải thích lý do tại sao tôi lại nhận được thông báo này? Và tại sao trong phiên bản PHP 5.3.13, điều này đã không được chấp nhận?

+0

http://stackoverflow.com/questions/4665782/call-time-pass-by-reference-has-been-deprecated?answertab=votes#tab-top –

+3

Có lý do cụ thể nào khiến bạn sử dụng cuộc gọi thời gian qua-tham chiếu ở đây anyway? –

+0

Đối với lý do tại sao (chỉ có một dự đoán): Gọi thời gian qua-tham khảo có thể dẫn đến hành vi bất ngờ nếu chức năng không mong đợi tài liệu tham khảo. –

Trả lời

10

này được tất cả các tài liệu trên PHP Passing by Reference trang hướng dẫn. Cụ thể (thêm tôi nhấn mạnh):

Lưu ý: Không có dấu hiệu tham khảo trên một cuộc gọi chức năng - chỉ về chức năng định nghĩa. Chỉ các định nghĩa chức năng là đủ để vượt qua một cách chính xác đối số bằng cách tham chiếu. Kể từ PHP 5.3.0, bạn sẽ nhận được cảnh báo nói rằng "thời gian gọi qua tham chiếu" không được dùng nữa khi bạn sử dụng & trong foo (& $ a) ;. Và kể từ PHP 5,4.0, thời gian gọi qua tham chiếu đã bị xóa , vì vậy việc sử dụng nó sẽ gây ra lỗi nghiêm trọng.

Do đó, nó không được chấp nhận (và sẽ ném cảnh báo) trong PHP 5.3.x và sẽ không thành công trong PHP 5.4.

Điều đó nói rằng, đó là một sửa chữa tầm thường. Đơn giản chỉ cần cập nhật chức năng fix_names của bạn như sau:

function fix_names(&$n1, &$n2, &$n3) 
{ 
    $a1 = ucfirst(strtolower($n1)); 
    $a2 = ucfirst(strtolower($n2)); 
    $a3 = ucfirst(strtolower($n3)); 

} 

Ngẫu nhiên, series 5.3.x là nhận được khá lâu trong răng, vì vậy nó sẽ là khôn ngoan để nâng cấp lên xây dựng gần đây (sau khi thực hiện các thử nghiệm cần thiết) nếu tất cả khả thi.

+1

Trong khi điều này giải thích hiện trạng, nó không trả lời câu hỏi tiêu đề là ** tại sao ** tài liệu tham khảo trang web gọi không được chấp nhận. – TheOperator

+0

Rõ ràng vì việc phân tích và giải thích không cần thiết chậm hơn. – Heitor

0

Tháo & biểu tượng từ như bạn: &$n1, &$n2 ...

0

sử dụng này ....

fix_names (& $ a1, & $ a2, a3 & $);

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