Tôi đã nhận thấy một số mâu thuẫn trong hướng dẫn sử dụng PHP; một số chữ ký chức năng lõi được ghi lại để chấp nhận các đối số bằng cách tham chiếu, tuy nhiên chúng chấp nhận các đối số theo giá trị.Đối số chức năng cốt lõi của PHP; hướng dẫn sử dụng nói tham chiếu, tuy nhiên nó chấp nhận các giá trị
tôi đăng một nhiều specific question trước đây, và @cweiske cung cấp một câu trả lời tuyệt vời (có sự tham khảo các nguồn PHP thích hợp) tuy nhiên những mâu thuẫn dường như tràn lan hơn.
Có một số chức năng bị ảnh hưởng bởi điều này (tôi sẽ cập nhật danh sách này là bảo đảm; cũng lưu ý, những thử nghiệm đã được thực hiện trong một môi trường error_reporting(-1)
)
- http://www.php.net/manual/en/function.current.php
- Điều này đã được thảo luận tại câu hỏi được liên kết
- http://www.php.net/manual/en/function.key.php
- này đã được thảo luận tại các câu hỏi liên quan
-
http://www.php.net/manual/en/function.array-replace-recursive.php-
array
array_replace_recursive
( array
&$array
, array
&$array1
[, array
&$
... ] )
- Chấp nhận đối số
$array
,$array1
vv, theo giá trị. Điều này đã được sửa chữa.
-
- http://www.php.net/manual/en/function.array-multisort.php
bool
array_multisort
( array
&$arr
[, mixed
$arg
=
SORT_ASC
[, mixed
$arg
=
SORT_REGULAR
[, mixed
$
... ]]] )
- Chấp nhận đối số
$arr
vv, theo giá trị. Điều này nên ném một lỗi, vì nó sẽ không làm bất cứ điều gì nếu đối số không phải là một biến.
Bây giờ tôi đang quan tâm, không phải vì tôi là hậu môn về tài liệu, nhưng vì tôi sợ rằng PHP devs đang trên hàng rào về các chi tiết thực hiện các chức năng (hoặc một cái gì đó đều không đáng tin cậy)
Ví dụ: tôi sử dụng array_replace_recursive()
để lấy đối số mảng và áp dụng đối số đó với một mảng khác có chứa giá trị mặc định. Một số codebase của tôi đã bị lợi dụng mâu thuẫn này, chỉ đơn giản là làm:
$values = array_replace_recursive(array(
'setting_1' => array(
'sub-setting_1' => '',
'sub-setting_2' => '',
'sub-setting_3' => '',
),
'setting_2' => array(
'sub-setting_1' => 0,
'sub-setting_2' => 0,
),
'setting_3' => true,
), $values);
Do đó tạo ra một mảng được định dạng đúng (để có được xung quanh cho không isset()
cuộc gọi)
Tôi có nên được quan tâm với điều này? Tôi đang nghĩ về việc gửi yêu cầu lỗi liên quan đến tài liệu, nhưng tôi tò mò đầu tiên nếu có ai trên SO (tìm kiếm theo hướng của bạn @cweiske) có thông tin chi tiết về lý do tại sao điều này đã được thực hiện.
Cảm ơn @Brian - Tình trạng khó xử của tôi, là điểm không phải là tranh luận cho thực tế là các nhà phát triển PHP có thể đã ghi rõ điều này vì có thay đổi về đường chân trời. Nếu hàm * không * sửa đổi các đối số, thì tại sao xác định chúng bằng tham chiếu? Nếu hàm * làm * sửa đổi các đối số, thì tại sao chấp nhận các giá trị được truyền? Nếu đây là một tài liệu giám sát, và với 5.4, cùng với tất cả các thay đổi phiên bản/phân nhánh, (* như bạn đã đề cập, 5.3, 6.0, vv *) thì nó hoàn toàn dễ hiểu. Tuy nhiên, việc triển khai cho phép truyền các giá trị. Điều này có vẻ không đúng, và tôi chỉ muốn biết tại sao. – Dan
Ah, tôi thấy bạn sẽ đi đâu với mối quan tâm của bạn, nếu họ có ý định sửa đổi cách thức các chức năng này hoạt động bằng cách cho phép họ lấy tham số của họ làm tham chiếu và trực tiếp làm việc với họ thay vì yêu cầu kết quả của hàm trả lại? Tôi có thể thấy nó có thể là vấn đề như thế nào: P Thật không may tôi cũng không phải là một người thường xuyên tìm hiểu nguồn PHP, vì vậy tôi sẽ để lại câu hỏi cho một trong những nerder nerdier ở đây trên stack;) – Brian