2011-08-16 20 views
5

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))

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.

Trả lời

2

Có lẽ tôi không hiểu tình trạng tiến thoái lưỡng nan của bạn, nhưng những chức năng đó không trực tiếp sửa đổi dữ liệu trong các tham số của chúng, cho dù chúng chấp nhận thông qua tham chiếu hay giá trị là một điểm tranh luận phải không? Dù bằng cách nào bạn sẽ cần phải chỉ định giá trị trả lại nếu bạn muốn gọi hàm thực tế làm bất kỳ điều gì cho bạn.

Trong điều khoản của cái nhìn sâu sắc vào lý do tại sao bạn có thể thấy sự khác biệt. PHP 5 đã có nhiều thay đổi được thực hiện cho cách tham chiếu làm việc. Trong thực tế, tôi tin rằng đó là PHP 5.3+ mà không còn cho phép sử dụng một số tập hợp của & để gán theo tham chiếu. Những gì bạn có thể thấy là việc chuyển đổi một số chức năng cốt lõi của PHP để tuân thủ các quy tắc mới về gán tham chiếu. Nếu bộ nhớ phục vụ cho tôi, chi nhánh PHP 5.3 thực sự được dự định là PHP 6, nhưng đã được hợp nhất một cách quyết định vào trong thân cây như một nhánh thay vì chờ đợi một số tính năng phức tạp được hoàn thành. Điều này sẽ giải thích tại sao bạn chưa bao giờ thấy sự nhầm lẫn như thế này trước đây trong PHP.

+0

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

+0

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

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