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:


Tôi đã viết một bài đăng trên blog chi tiết, chi tiết về chủ đề này cho JavaScript, nhưng tôi tin rằng nó áp dụng tốt như nhau cho PHP, C ++ và bất kỳ ngôn ngữ nào khác mà mọi người dường như bị nhầm lẫn về việc vượt qua giá trị so với việc vượt qua.

Rõ ràng, PHP, giống như C ++, là một ngôn ngữ hỗ trợ vượt qua tham chiếu. Theo mặc định, các đối tượng được truyền bởi giá trị. Khi làm việc với các biến lưu trữ các đối tượng, nó giúp xem các biến đó là con trỏ (vì đó là cơ bản những gì chúng là, ở cấp độ lắp ráp). Nếu bạn vượt qua một con trỏ theo giá trị, bạn vẫn có thể "theo dõi" con trỏ và sửa đổi các thuộc tính của đối tượng được chỉ ra. Những gì bạn không thể làm là có nó chỉ vào một đối tượng khác. Chỉ khi bạn khai báo rõ ràng một tham số được thông qua bởi tham chiếu, bạn mới có thể làm điều đó.


Trong bài viết này, chúng tôi sẽ tìm hiểu về vượt qua giá trị và vượt qua bằng cách tham khảo trong PHP. & NBSP;

Bây giờ, hãy để hiểu chi tiết hai khái niệm này.

Trong PHP nói chung, chúng tôi đã làm theo để chuyển các đối số cho hàm với cách tiếp cận giá trị được truyền. Chúng tôi đang tuân theo thực tiễn này bởi vì nếu giá trị của đối số trong hàm được thay đổi, nó không bị thay đổi bên ngoài hàm.

Trong một số trường hợp, chúng ta có thể cần sửa đổi các đối số chức năng, vì vậy để cho phép một hàm sửa đổi các đối số của nó, chúng phải được truyền bằng cách tham chiếu.

Hãy bắt đầu bằng việc được thông qua bởi tham chiếu. Vì nó đã được đề cập, chúng tôi có thể chuyển một biến bằng cách tham chiếu đến một hàm để hàm có thể sửa đổi biến. Để bắt đầu quá trình truyền các tham số được truyền qua tham chiếu, hãy dành cho một ampersand và) cho tên đối số trong định nghĩa hàm.

Thí dụ

Hãy kiểm tra điều này với một ví dụ đơn giản.

Đầu ra

6

Giải trình

Ở đây chúng tôi đã khai báo biến $ a và chuyển nó dưới dạng thông qua tham chiếu đến hàm tính toán (). Vì vậy, như nguyên tắc nói rằng nếu giá trị của $ a được thay đổi bên trong hàm thì nó cũng sẽ thay đổi bên ngoài hàm.

Ghi chú

Không có dấu hiệu tham chiếu trên một cuộc gọi chức năng - chỉ trên các định nghĩa chức năng. Định nghĩa chức năng một mình là đủ để vượt qua chính xác đối số bằng cách tham khảo. Điều này không được dùng trong phiên bản 5.4 của PHP khi bạn sử dụng để tính toán (& $ a); Nó ném một lỗi.

Thí dụ

Hãy kiểm tra điều này với một ví dụ đơn giản.

";
   }
   $a=5;
   calculate($a);
   echo $a;
?>

Đầu ra

6
5

Giải trình

Ở đây chúng tôi đã khai báo biến $ a và chuyển nó dưới dạng thông qua tham chiếu đến hàm tính toán (). Vì vậy, như nguyên tắc nói rằng nếu giá trị của $ a được thay đổi bên trong hàm thì nó cũng sẽ thay đổi bên ngoài hàm.

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

Ghi chú

  • Không có dấu hiệu tham chiếu trên một cuộc gọi chức năng - chỉ trên các định nghĩa chức năng. Định nghĩa chức năng một mình là đủ để vượt qua chính xác đối số bằng cách tham khảo. Điều này không được dùng trong phiên bản 5.4 của PHP khi bạn sử dụng để tính toán (& $ a); Nó ném một lỗi.
  • Hãy kiểm tra một ví dụ để hiểu qua giá trị.
  • Ở đây chúng tôi đã chuyển giá trị cho hàm tính toán () khi được truyền theo giá trị. Giá trị của nó được thay đổi bên trong hàm nhưng điều đó không được phản ánh bên ngoài hàm. Giá trị của biến vẫn giống nhau bên ngoài hàm.
  • Cập nhật vào ngày 29 tháng 6 năm 2020 08:51:12
  • Câu hỏi và câu trả lời liên quan
  • Java có vượt qua tham chiếu hoặc vượt qua giá trị không?
  • Mô tả vượt qua giá trị và vượt qua tham chiếu trong JavaScript?
  • Vượt qua tham chiếu vs vượt qua giá trị trong java
  • Sự khác biệt giữa vượt qua bằng giá trị và vượt qua tham chiếu trong C ++
  • JavaScript có phải là một ngôn ngữ ngang qua hoặc giao thông không?
  • Truyền qua giá trị bằng ngôn ngữ C là gì?
  • Làm thế nào để bạn vượt qua các đối tượng bằng cách tham khảo trong PHP 5?
  • Vượt qua một số nguyên bằng cách tham khảo trong java
  • Giải thích vượt qua JavaScript bằng cách tham khảo trong JavaScript?
  • Java được vượt qua nghiêm ngặt như thế nào?
  • Làm thế nào để truyền đối số bằng cách tham khảo trong hàm Python?

Sự khác biệt giữa truyền qua giá trị và truyền qua tham chiếu trong PHP là gì?

Truyền bằng giá trị đề cập đến một cơ chế sao chép giá trị tham số chức năng sang biến khác trong khi vượt qua tham chiếu đề cập đến một cơ chế truyền các tham số thực tế cho hàm. Do đó, đây là sự khác biệt chính giữa vượt qua giá trị và vượt qua tham chiếu.

Sự khác biệt giữa truyền qua giá trị và vượt qua tham chiếu là gì?

Pass by giá trị: Các giá trị tham số phương thức được sao chép vào một biến khác và sau đó đối tượng được sao chép được truyền, đó là lý do tại sao nó được gọi là Pass by giá trị. Truyền qua tham chiếu: Một bí danh hoặc tham chiếu đến tham số thực tế được chuyển đến phương thức, đó là lý do tại sao nó được gọi là Pass by tham chiếu.

Thông qua giá trị là gì và vượt qua tham chiếu với ví dụ?

"Chuyển bằng giá trị" có nghĩa là bạn chuyển giá trị thực của biến vào hàm. Vì vậy, trong ví dụ của bạn, nó sẽ vượt qua giá trị 9. "Truyền bằng tham chiếu" có nghĩa là bạn chuyển biến chính vào hàm (không chỉ là giá trị). Vì vậy, trong ví dụ của bạn, nó sẽ vượt qua một đối tượng số nguyên với giá trị 9.. So, in your example, it would pass the value 9. "Passing by reference" means that you pass the variable itself into the function (not just the value). So, in your example, it would pass an integer object with the value of 9.

Sự khác biệt giữa cuộc gọi theo giá trị và cuộc gọi bằng tham chiếu trong PHP là gì?

Trong trường hợp gọi theo giá trị, khi chúng ta chuyển giá trị của tham số trong quá trình gọi hàm, nó sao chép chúng vào đối số cục bộ thực tế của hàm.Trong trường hợp gọi bằng tham chiếu, khi chúng tôi chuyển tham chiếu/địa chỉ vị trí của tham số, nó sao chép và gán chúng cho đối số cục bộ của hàm.