Hướng dẫn pass by value and pass by reference php - chuyển theo giá trị và chuyển bằng tham chiếu php

TL; DR: PHP hỗ trợ cả vượt qua giá trị và vượt qua tham chiếu. Các tài liệu tham khảo được khai báo bằng cách sử dụng ampers và [&]; Điều này rất giống với cách C ++ thực hiện nó. Khi tham số chính thức của hàm không được khai báo với ampersand và [nghĩa là, nó không phải là một tham chiếu], mọi thứ đều được truyền qua giá trị, bao gồm cả các đối tượng. Không có sự khác biệt giữa cách các đối tượng và nguyên thủy được truyền xung quanh. Điều quan trọng là để hiểu những gì được truyền khi bạn chuyển các đối tượng cho một hàm. Đây là nơi hiểu được con trỏ là vô giá.: PHP supports both pass by value and pass by reference. References are declared using an ampersand [&]; this is very similar to how C++ does it. When the formal parameter of a function is not declared with an ampersand [i.e., it's not a reference], everything is passed by value, including objects. There is no distinction between how objects and primitives are passed around. The key is to understand what gets passed along when you pass in objects to a function. This is where understanding pointers is invaluable.

Đối với bất kỳ ai bắt gặp điều này trong tương lai, tôi muốn chia sẻ viên đá quý này từ các tài liệu PHP, được đăng bởi một người dùng ẩn danh:

Dường như có một số nhầm lẫn ở đây. Sự khác biệt giữa con trỏ và tài liệu tham khảo không đặc biệt hữu ích. Hành vi trong một số ví dụ "toàn diện" đã được đăng có thể được giải thích bằng các thuật ngữ thống nhất đơn giản hơn. Ví dụ, mã của Hayley đang làm chính xác những gì bạn nên mong đợi. [Sử dụng> = 5.3]

Nguyên tắc đầu tiên: Một con trỏ lưu trữ địa chỉ bộ nhớ để truy cập một đối tượng. Bất cứ khi nào một đối tượng được gán, một con trỏ được tạo. [Tôi chưa đào sâu vào động cơ Zend, nhưng theo như tôi có thể thấy, điều này được áp dụng]

Nguyên tắc thứ 2 và nguồn của sự nhầm lẫn nhất: Chuyển một biến cho một hàm được thực hiện theo mặc định dưới dạng thông qua giá trị, tức là bạn đang làm việc với một bản sao. "Nhưng các đối tượng được truyền qua tham chiếu!" Một quan niệm sai lầm phổ biến cả ở đây và trong thế giới Java. Tôi chưa bao giờ nói một bản sao của những gì. Việc vượt qua mặc định được thực hiện theo giá trị. Luôn luôn. Những gì đang được sao chép và thông qua, tuy nhiên, là con trỏ. Khi sử dụng "->", tất nhiên bạn sẽ truy cập cùng một bên trong với biến ban đầu trong hàm người gọi. Chỉ cần sử dụng "=" sẽ chỉ chơi với các bản sao.

Nguyên tắc thứ 3: "&" Tự động và vĩnh viễn đặt một tên/con trỏ biến khác đến cùng một địa chỉ bộ nhớ như một thứ khác cho đến khi bạn tách chúng ra. Đó là chính xác để sử dụng thuật ngữ "bí danh" ở đây. Hãy nghĩ về nó khi tham gia hai con trỏ ở hông cho đến khi bị buộc phải tách ra với "unset []". Chức năng này tồn tại cả trong cùng một phạm vi và khi một đối số được chuyển đến một hàm. Thông thường đối số được thông qua được gọi là "tham chiếu", do sự phân biệt nhất định giữa "chuyển bằng giá trị" và "đi qua tham chiếu" rõ ràng hơn trong C và C ++.

Chỉ cần nhớ: Con trỏ đến các đối tượng, không phải chính các đối tượng, được truyền đến các chức năng. Những gợi ý này là các bản sao của bản gốc trừ khi bạn sử dụng "&" trong danh sách tham số của bạn để thực sự vượt qua bản gốc. Chỉ khi bạn đào sâu vào phần bên trong của một đối tượng, bản gốc mới thay đổi.

Và đây là ví dụ họ cung cấp:

Bài Viết Liên Quan

Chủ Đề