2011-09-07 29 views
5

Do không thống nhất trong hướng dẫn sử dụng PHP (như tôi đã đăng về trước) Tôi chỉ hỏi về một số làm rõ.Làm rõ hướng dẫn sử dụng PHP; giá trị mặc định được chuyển bởi tham chiếu

Các Function Arguments trang (http://ca2.php.net/manual/en/functions.arguments.php) có ghi chú sau:

Note: As of PHP 5, default values may be passed by reference.

Bây giờ, tôi giả định này chỉ đơn giản có nghĩa là cú pháp sau có thể chấp nhận:

function foo(&$bar = null){ 
    // ... 
} 

Tuy nhiên, một lần nữa do những mâu thuẫn khác, tôi đã tự hỏi liệu có lẽ điều này liên quan đến cái gì khác.

+0

Hmm, dường như bạn có thể đặt mặc định thành biến được chuyển bằng tham chiếu trong PHP. Tôi không thể nghĩ về một trường hợp mà đó sẽ không phải là một dấu hiệu bạn đang làm một cái gì đó sai mặc dù. –

+1

Cảm ơn @Tim - Tôi đã sử dụng nó trong một chức năng hai nhiệm vụ để giải quyết/xác nhận các tuyến yêu cầu. Khi giải quyết, một đối số bổ sung được chuyển theo tham chiếu và được điền với các tham số đã giải quyết. Khi xác thực, không có đối số là cần thiết vì bạn chỉ cần giá trị trả về boolean. Đây không phải là không giống như 'preg_match'. – Dan

+0

Ah, điều đó có ý nghĩa. –

Trả lời

4

Nó có nghĩa là trong PHP 4, sử dụng một giá trị mặc định cho các đối số thông qua tham khảo sẽ cho kết quả trong một lỗi phân tích cú pháp:

Parse error: syntax error, unexpected '=', expecting ')' in ... 

Demo

Trong PHP5, khi không có đối số được truyền, chức năng của bạn sẽ có một biến cục bộ thông thường được gọi là $bar được khởi tạo thành null.

Nó có lẽ nên được reworded để:

Note: As of PHP 5, function declarations may define a default value for argument passed by reference.

+0

Tôi đã tìm ra điều này nhiều; các từ ngữ * là * nhẹ gây nhầm lẫn - nó loại dẫn bạn tin rằng có nhiều hơn đáp ứng mắt. Đồng ý về việc viết lại; đề cập rằng bản thân mình: http://chat.stackoverflow.com/transcript/message/15381785#15381785 – Dan

+0

Từ ngữ làm cho nó có vẻ như bạn bằng cách nào đó có thể làm 'chức năng foo ($ bar = & $ something)' đó là loại vô lý; -) –

4

nó có nghĩa là khi bạn thay đổi thanh

$bar = "newvalue"; 

trong chức năng, cũ (bản gốc một) sẽ bị ảnh hưởng quá

<?php 
function foo(&$bar = null){ 
    $bar = 'newval'; 
} 

$bar = 'oldval, will be changed'; 
foo($bar); 
echo $bar; //RETURNS newval 

vì vậy nếu bạn thay đổi bất kỳ biến thông qua tham khảo, nó doesn' t vấn đề bạn thay đổi, nguồn nào cũng thay đổi, quá

http://sandbox.phpcode.eu/g/51723

+0

Cảm ơn @genesis - Tôi hiểu đó là chức năng dự định của các tham chiếu nói chung. Các câu hỏi liên quan đến việc đề cập đến nondescript của đối số tham chiếu và mặc định.Như tôi đã nói, tôi cho rằng đơn giản là nó có nghĩa là các đối số được chấp nhận bởi tham chiếu cũng có thể có các giá trị mặc định; Tôi đã tự hỏi liệu nó có thể được giới thiệu đến một số tính năng khác (* nếu không được nói không có lẽ *)) hay tác dụng phụ. – Dan

+0

@Bracketworks: Tôi không nghĩ như vậy – genesis

+0

Tôi cũng vậy, nhưng hướng dẫn đã làm tôi ngạc nhiên trước đây. Tài liệu hướng dẫn đi vào chi tiết hợp lý trên trang đó một mình (* và các phần khác; "Tài liệu tham khảo giải thích", vv *) về việc chuyển tham chiếu bằng đối số. Có vẻ như sự báo trước đó là không cần thiết, hoặc liên quan đến cái gì khác mà tôi không thấy. Bạn có hiểu ý tôi? – Dan

0

Tôi nghĩ rằng lý do duy nhất tồn tại này là cho phép bỏ qua tham số kéo dài trong một cuộc gọi chức năng

function test(&$bar = 10) 
{ 
    echo " '$bar' "; 
    $bar = $bar*2; 
    echo " '$bar' "; 
} 

test($aaa);  // prints '' '0'  (NULL as string, NULL*2) 
echo $aaa;  // prints 0   ($aaa is set to NULL*2) 
echo "<br>"; 

$bbb = 6; 
test($bbb);  // prints '6' '12' (6, 6*2) 
echo $bbb;  // prints 12   ($bbb is set to 6*2) 
echo "<br>"; 

test();  // prints '10' '20' 
// (uses the default value since the argument was skipped, so: 10, 10*2) 

Vì vậy, IMHO lý do tồn tại này là chỉ đơn thuần là khả năng có thanh ngang $ được đặt thành một số giá trị mặc định bên trong phạm vi chức năng khi bạn bỏ qua tham số hàng đầu trong lời gọi của hàm

Nếu như vậy tôi đồng ý với bạn, hướng dẫn phải chính xác hơn về điều này

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