Tham chiếu mảng PHP

Tài liệu tham khảo là một phần rất hữu ích của PHP và, đối với vấn đề đó, hầu hết các ngôn ngữ lập trình khác. Tuy nhiên, các tài liệu tham khảo có thể hơi khó hiểu khi bạn mới bắt đầu tìm hiểu về chúng.

Hướng dẫn này là phần giới thiệu nhẹ nhàng về tài liệu tham khảo trong PHP. Bạn tìm hiểu tài liệu tham khảo là gì và cách chúng hoạt động. Bạn tìm hiểu cách tạo và xóa các tham chiếu, cũng như chuyển các tham chiếu đến và từ các hàm. Bạn cũng khám phá một số cách sử dụng khác của tham chiếu và khám phá các tình huống mà PHP tự động tạo tham chiếu thay cho bạn

Chính xác thì tham chiếu là gì?

Tham chiếu đơn giản là một cách để chỉ nội dung của một biến bằng một tên khác. Theo nhiều cách, các tham chiếu giống như lối tắt tệp trong Windows, bí danh tệp trong Mac OS X và liên kết tượng trưng trong Linux

Chỉ định theo tham chiếu

Một cách dễ dàng để tạo tham chiếu được gọi là gán theo tham chiếu. Xét ví dụ đơn giản sau

$myVar = "Hi there";
$anotherVar = $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "Hi there"
echo $anotherVar; // Displays "See you later"

Ở đây chúng ta đã tạo một biến,

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6, và đặt cho nó một giá trị là “Chào bạn”. Sau đó, chúng tôi đã gán giá trị đó cho một biến khác,
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
7. Điều này sao chép giá trị từ biến đầu tiên sang biến thứ hai

Sau đó, chúng tôi đã thay đổi giá trị được lưu trữ trong

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
7 thành “Hẹn gặp lại sau”. Vì 2 biến là độc lập, nên
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 vẫn giữ nguyên giá trị ban đầu (“Xin chào”), sau đó chúng tôi sẽ hiển thị trong trang. Càng xa càng tốt

Bây giờ, hãy thay đổi ví dụ trên để gán

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 cho
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
7 theo tham chiếu, thay vì theo giá trị. Để làm điều này, chúng ta chỉ cần đặt dấu và (
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
echo $myVar; // Displays "See you later"
2) sau dấu bằng

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"

Bây giờ bạn có thể thấy rằng giá trị của

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 cũng đã thay đổi thành “Hẹn gặp lại sau”. Những gì đang xảy ra ở đây?

Thay vì gán giá trị của

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 cho
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
7 — đơn giản là tạo ra 2 bản sao độc lập của cùng một giá trị — chúng tôi đã tạo cho
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
7 một tham chiếu đến giá trị mà
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 đề cập đến. Nói cách khác,
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 và
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
7 bây giờ đều trỏ đến cùng một giá trị. Vì vậy, khi chúng tôi gán một giá trị mới cho
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
7, giá trị của
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 cũng thay đổi

Lưu ý rằng chúng ta có thể thay đổi giá trị của

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 thành “Hẹn gặp lại sau” thay vì thay đổi
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
7 và kết quả sẽ giống hệt như vậy. Trên thực tế, 2 biến giống hệt nhau

Xóa tham chiếu

Bạn xóa một tham chiếu bằng cách sử dụng hàm

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""
4, giống như cách bạn xóa một biến thông thường

Khi bạn bỏ đặt tham chiếu, bạn chỉ đang xóa tham chiếu đó chứ không phải giá trị mà tham chiếu đó tham chiếu

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
echo $myVar; // Displays "See you later"

Giá trị vẫn còn trong bộ nhớ cho đến khi bạn bỏ đặt tất cả các tham chiếu đến nó, bao gồm cả biến ban đầu

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""

Truyền tham chiếu đến hàm

Tham chiếu mảng PHP
Tham chiếu mảng PHP

Các tham chiếu thực sự trở thành của riêng chúng khi bạn bắt đầu chuyển chúng làm đối số cho các hàm. Thông thường, khi bạn truyền một biến cho hàm, hàm sẽ nhận được một bản sao giá trị của biến đó. Tuy nhiên, bằng cách chuyển một tham chiếu đến một biến, hàm có thể tham chiếu đến - và quan trọng hơn là sửa đổi - biến ban đầu

Để truyền đối số bằng tham chiếu, bạn đặt dấu và trước tên tham số khi bạn xác định hàm

function myFunc( &$myParam ) {
  // Do something with $myParam
}

Bây giờ, bất cứ khi nào bạn gọi

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""
5 và truyền một biến cho nó, PHP sẽ truyền một tham chiếu đến biến đó, thay vì giá trị của biến

Hãy xem xét một ví dụ đơn giản về chuyển qua tham chiếu

function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"

Ở đây chúng ta đã tạo một hàm,

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""
6, chấp nhận một tham chiếu đến một biến. Tham chiếu được lưu trữ trong tham số
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""
7. Hàm gán một giá trị mới (“Hẹn gặp lại sau”) cho
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""
7, giá trị này sẽ thay đổi giá trị được lưu trữ trong biến được truyền cho hàm

Chúng tôi kiểm tra điều này bằng cách tạo một biến,

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6, với giá trị ban đầu là “Xin chào”, và gọi
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""
6, chuyển
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 theo tham chiếu.
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
unset( $anotherVar );
unset( $myVar );
echo $myVar; // Displays ""
6 sau đó thay đổi giá trị được lưu trữ trong
$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
6 thành “Hẹn gặp lại sau”

Vì vậy, hãy sử dụng tính năng chuyển qua tham chiếu bất cứ khi nào bạn muốn một hàm thay đổi một biến được truyền cho nó. Đơn giản

Nhân tiện, đừng cố gắng đặt dấu và trước tên đối số trong lời gọi hàm của bạn

goodbye( &$myVar );  // Don't do this!

Dấu và trước tham số trong định nghĩa hàm là đủ để chuyển biến theo tham chiếu

Nhiều hàm PHP tích hợp sử dụng tham chiếu qua tham chiếu. Ví dụ, hàm

function myFunc( &$myParam ) {
  // Do something with $myParam
}
4 nhận một tham chiếu đến mảng để sắp xếp, để có thể thay đổi thứ tự các phần tử trong mảng

Trả về tham chiếu từ hàm

Ngoài việc chuyển tham chiếu đến hàm, bạn có thể trả về tham chiếu từ hàm. Để thực hiện việc này, hãy đặt dấu và trước tên hàm khi bạn xác định hàm. Bạn cũng nên sử dụng gán theo tham chiếu (

function myFunc( &$myParam ) {
  // Do something with $myParam
}
5) khi gán tham chiếu được trả về cho một biến, nếu không, bạn sẽ chỉ gán giá trị chứ không phải tham chiếu. Đây là một ví dụ

$numWidgets = 10;

function &getNumWidgets() {
  global $numWidgets;
  return $numWidgets;
}

$numWidgetsRef =& getNumWidgets();
$numWidgetsRef--;
echo "$numWidgets = $numWidgets
"; // Displays "9" echo "$numWidgetsRef = $numWidgetsRef
"; // Displays "9"

Trong ví dụ này, hàm

function myFunc( &$myParam ) {
  // Do something with $myParam
}
6 của chúng ta truy xuất biến toàn cục
function myFunc( &$myParam ) {
  // Do something with $myParam
}
7 và trả về một tham chiếu đến nó. Sau đó, chúng tôi gọi
function myFunc( &$myParam ) {
  // Do something with $myParam
}
6, lưu trữ tham chiếu được trả về trong
function myFunc( &$myParam ) {
  // Do something with $myParam
}
9 và giảm giá trị mà
function myFunc( &$myParam ) {
  // Do something with $myParam
}
9 trỏ tới. Đây là cùng một giá trị được chỉ ra bởi
function myFunc( &$myParam ) {
  // Do something with $myParam
}
7, như bạn có thể thấy qua kết quả của các câu lệnh
function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
2

Có thể bạn sẽ không sử dụng trả về theo tham chiếu thường xuyên như tham chiếu qua, nhưng nó có thể hữu ích trong một số trường hợp nhất định, chẳng hạn như khi bạn muốn viết một hàm tìm kiếm (hoặc phương thức lớp) để tìm một biến (hoặc

Sử dụng tham chiếu để thay đổi giá trị trong vòng lặp function goodbye( &$greeting ) { $greeting = "See you later"; } $myVar = "Hi there"; goodbye( $myVar ); echo $myVar; // Displays "See you later" 3

Tham chiếu mảng PHP
Tham chiếu mảng PHP

Một cách sử dụng hữu ích khác của tham chiếu là thay đổi giá trị trong một mảng khi sử dụng vòng lặp

function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
3. Với vòng lặp
function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
3 thông thường, bạn đang làm việc với các bản sao của các giá trị mảng, vì vậy nếu bạn thay đổi một giá trị thì bạn sẽ không ảnh hưởng đến mảng ban đầu. Ví dụ: hãy thử thay đổi một mảng tên ban nhạc thành chữ hoa bằng vòng lặp
function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
3

$bands = array( "The Who", "The Beatles", "The Rolling Stones" );

foreach ( $bands as $band ) {
  $band = strtoupper( $band );
}

echo "
";
print_r( $bands );
echo "
";

Ví dụ trên hiển thị

Array
(
    [0] => The Who
    [1] => The Beatles
    [2] => The Rolling Stones
)

Như bạn có thể thấy, mảng ban đầu không bị thay đổi bởi vòng lặp

function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
3. Tuy nhiên, nếu chúng ta đặt dấu và trước
function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
8 trong câu lệnh
function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
3 thì
function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
8 trở thành một tham chiếu đến phần tử mảng ban đầu, thay vì một bản sao. Sau đó chúng ta có thể chuyển đổi các phần tử mảng thành chữ hoa

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
0

Mã của chúng tôi hiện đang chạy như dự định, tạo ra mã này

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
1

Một cách khác để thay đổi giá trị mảng trong một vòng lặp là sử dụng vòng lặp

goodbye( &$myVar );  // Don't do this!
1 thay vì
function goodbye( &$greeting ) {
  $greeting = "See you later";
}

$myVar = "Hi there";
goodbye( $myVar );
echo $myVar; // Displays "See you later"
3

Khi tài liệu tham khảo được sử dụng tự động

Tham chiếu mảng PHP
Tham chiếu mảng PHP

Cho đến giờ, bạn đã xem xét 4 cách để tạo tài liệu tham khảo một cách rõ ràng

    • Chỉ định theo tham chiếu
    • Chuyển qua tham chiếu
    • Trở lại bằng cách tham khảo
    • Tạo tham chiếu trong vòng lặp
      function goodbye( &$greeting ) {
        $greeting = "See you later";
      }
      
      $myVar = "Hi there";
      goodbye( $myVar );
      echo $myVar; // Displays "See you later"
      
      3

Ngoài ra, có những lúc PHP tự động tạo tài liệu tham khảo cho bạn. Hầu hết thời gian bạn sẽ không quan tâm, nhưng có thể hữu ích khi biết những thứ này

Khi sử dụng từ khóa goodbye( &$myVar ); // Don't do this! 4

Khi bạn sử dụng

goodbye( &$myVar );  // Don't do this!
4 để truy cập một biến toàn cục trong một hàm, thực tế là bạn đang tạo một tham chiếu tới biến toàn cục trong mảng
goodbye( &$myVar );  // Don't do this!
6. Vì thế

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
2

làm điều tương tự như

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
3

Khi sử dụng goodbye( &$myVar ); // Don't do this! 7

Khi bạn sử dụng từ khóa

goodbye( &$myVar );  // Don't do this!
7 trong phương thức của một đối tượng để tham chiếu đến đối tượng, thì bạn nên nhớ rằng
goodbye( &$myVar );  // Don't do this!
7 luôn là một tham chiếu đến đối tượng, chứ không phải là bản sao của nó. Ví dụ

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
4

goodbye( &$myVar );  // Don't do this!
7 là một tham chiếu đến đối tượng trong ví dụ trên, nên phương thức này có thể thay đổi một thuộc tính trong đối tượng thành một giá trị mới

Khi truyền vật xung quanh

Không giống như các loại biến khác, bất cứ khi nào bạn gán, chuyển hoặc trả lại một đối tượng, bạn sẽ chuyển một tham chiếu tới đối tượng chứ không phải một bản sao. Đây thường là điều bạn muốn xảy ra, vì hàm hoặc phương thức bạn truyền một đối tượng thường cần hoạt động trên đối tượng thực, không phải bản sao của nó. Ví dụ

$myVar = "Hi there";
$anotherVar =& $myVar;
$anotherVar = "See you later";
echo $myVar; // Displays "See you later"
echo $anotherVar; // Displays "See you later"
5

Trong một vài tình huống khi bạn thực sự muốn tạo một bản sao của một đối tượng, bạn có thể sử dụng từ khóa

$numWidgets = 10;

function &getNumWidgets() {
  global $numWidgets;
  return $numWidgets;
}

$numWidgetsRef =& getNumWidgets();
$numWidgetsRef--;
echo "$numWidgets = $numWidgets
"; // Displays "9" echo "$numWidgetsRef = $numWidgetsRef
"; // Displays "9"
1

Trên thực tế, mọi thứ tinh tế hơn thế này một chút. Khi bạn tạo một biến đối tượng, biến đó chỉ chứa một con trỏ tới đối tượng trong bộ nhớ, không phải chính đối tượng đó. Khi bạn gán hoặc chuyển biến đó, trên thực tế, bạn tạo một bản sao của biến đó. Nhưng bản sao cũng chỉ là một con trỏ tới đối tượng — cả hai bản sao vẫn trỏ tới cùng một đối tượng. Do đó, đối với hầu hết các ý định và mục đích, bạn đã tạo một tài liệu tham khảo

Bản tóm tắt

Trong hướng dẫn này, bạn đã học các nguyên tắc cơ bản về tham chiếu biến trong PHP. Bạn đã khám phá việc gán, chuyển và trả về các biến theo tham chiếu;

Nếu bạn muốn tìm hiểu thêm, hãy xem phần Giải thích tài liệu tham khảo trên trang web PHP. Chúc vui vẻ. 🙂

Làm cách nào để chuyển mảng làm tham chiếu trong PHP?

Khi một mảng được truyền cho một phương thức hoặc hàm trong PHP, nó được truyền theo giá trị trừ khi bạn truyền nó một cách rõ ràng bằng tham chiếu , chẳng hạn như . kiểm tra hàm(&$array) { $array['new'] = 'hey';

Tham chiếu của một mảng là gì?

Tham chiếu đến một mảng có nghĩa là đặt bí danh cho một mảng trong khi vẫn giữ nguyên danh tính của nó . Tham chiếu đến một mảng sẽ không phải là int* mà là int[].

Làm cách nào để cung cấp tài liệu tham khảo trong PHP?

Trong PHP, tên biến và nội dung biến khác nhau nên cùng một nội dung có thể có tên khác nhau. Biến tham chiếu được tạo bằng cách tiền tố & ký hiệu cho biến ban đầu . Do đó b=&a sẽ có nghĩa là bisareferewncevariableofa.

PHP có vượt qua giá trị hoặc tham chiếu không?

Đó là theo giá trị theo Tài liệu PHP. Theo mặc định, các đối số của hàm được truyền theo giá trị (để nếu giá trị của đối số bên trong hàm bị thay đổi, nó sẽ không bị thay đổi bên ngoài hàm). Để cho phép một hàm sửa đổi các đối số của nó, chúng phải được chuyển qua tham chiếu.