Php có được chuyển qua tham chiếu không?

Điều này cho phép bạn chuyển một biến bằng cách tham chiếu đến một hàm hoặc thành phần cho phép bạn sửa đổi biến ban đầu

Truyền theo tham chiếu không chỉ giới hạn ở các biến, những điều sau đây cũng có thể được truyền theo tham chiếu

  • Tuyên bố mới, e. g. foo(new SomeClass)
  • Tài liệu tham khảo được trả về từ các chức năng

Mảng

Một cách sử dụng phổ biến của "chuyển qua tham chiếu" là sửa đổi các giá trị ban đầu trong một mảng mà không đi đến mức tạo mảng mới hoặc xả rác không gian tên của bạn. Chuyển qua tham chiếu cũng đơn giản như đặt trước/đặt trước biến bằng một ____ ______25_______ => ____26_______

Dưới đây là một ví dụ về khai thác một phần tử từ một mảng và chỉ cần thêm 1 vào giá trị ban đầu của nó

$arr = array(1, 2, 3, 4, 5);

foreach($arr as &$num) {
    $num++;
}

Bây giờ khi bạn khai thác bất kỳ phần tử nào trong $arr, phần tử ban đầu sẽ được cập nhật khi tham chiếu được tăng lên. Bạn có thể xác minh điều này bằng cách

print_r($arr);

Ghi chú

Bạn nên lưu ý khi khai thác vượt qua tham chiếu trong các vòng lặp. Ở cuối vòng lặp trên, $num vẫn giữ một tham chiếu đến phần tử cuối cùng của mảng. Chỉ định nó sau vòng lặp sẽ kết thúc việc thao tác phần tử mảng cuối cùng. Bạn có thể đảm bảo điều này không xảy ra bằng cách

print_r($arr);
0'ing nó sau vòng lặp

$myArray = array(1, 2, 3, 4, 5);

foreach($myArray as &$num) {
   $num++;
}
unset($num);

Những điều trên sẽ đảm bảo bạn không gặp phải bất kỳ vấn đề nào. Một ví dụ về các vấn đề có thể liên quan đến vấn đề này có trong câu hỏi này trên StackOverflow


Chức năng

Một cách sử dụng phổ biến khác để chuyển qua tham chiếu là trong các hàm. Sửa đổi biến ban đầu đơn giản như

$var = 5;
// define
function add(&$var) {
    $var++;
}
// call
add($var);

Điều này có thể được xác minh bằng cách

print_r($arr);
1'ing biến ban đầu

echo $var;

Có nhiều hạn chế khác nhau xung quanh các chức năng, như được ghi chú bên dưới từ tài liệu PHP

Ghi chú. Không có dấu hiệu tham chiếu trên một lệnh gọi hàm - chỉ trên các định nghĩa hàm. Chỉ định nghĩa hàm là đủ để chuyển đối số theo tham chiếu một cách chính xác. Kể từ PHP 5. 3. 0, bạn sẽ nhận được cảnh báo nói rằng "tham chiếu chuyển qua thời gian cuộc gọi" không được dùng nữa khi bạn sử dụng & trong foo(&$a);. Và kể từ PHP 5. 4. 0, tham chiếu chuyển qua thời gian cuộc gọi đã bị xóa, vì vậy sử dụng nó sẽ gây ra lỗi nghiêm trọng

Theo mặc định, các biến PHP, nhưng không phải đối tượng, được truyền theo giá trị. Khi các biến PHP được truyền theo giá trị, phạm vi biến, được xác định ở cấp hàm được liên kết trong phạm vi của hàm. Việc sửa đổi một trong hai biến không có tác động

Hãy xem một ví dụ

Đầu ra sẽ như sau

  Function w3docs
  Global w3docs

Để truyền biến theo tham chiếu, cần thêm ký hiệu dấu và (&) trước đối số của biến

Một ví dụ về một chức năng như vậy sẽ như sau. hàm( &$x )

Phạm vi của các biến toàn cục và hàm trở thành toàn cầu. Lý do là chúng được xác định bởi cùng một tham chiếu. Do đó, sau khi thay đổi biến toàn cục, biến bên trong hàm cũng bị thay đổi theo.

Đây là một ví dụ rõ ràng

đầu ra sẽ là

  Function w3docs 
  Function w3docs
Các đối tượng PHP theo mặc định được truyền theo tham chiếu

Đầu ra sẽ như sau

1

Theo quy định, các biến PHP bắt đầu bằng dấu $ theo sau là tên biến

Khi gán một giá trị văn bản cho một biến, việc đặt dấu ngoặc kép xung quanh giá trị là cần thiết

Khác với các ngôn ngữ lập trình khác, PHP không có lệnh khai báo biến. Nó được tạo ra tại thời điểm một giá trị được gán cho nó lần đầu tiên

Trong PHP, biến là nơi chứa dữ liệu

Các biến PHP có thể có cả tên ngắn (ví dụ: x và y) và tên mô tả hơn (tên trái cây, tuổi, chiều cao, v.v.)

Theo mặc định, các biến PHP được truyền theo giá trị dưới dạng đối số hàm trong PHP. Khi các biến trong PHP được truyền theo giá trị, phạm vi của biến được xác định ở cấp hàm bị ràng buộc trong phạm vi của hàm. Thay đổi một trong hai biến không có bất kỳ ảnh hưởng nào đến một trong hai biến

Thí dụ




<?php

 

// Function used for assigning new

// value to $string variable and 

// printing it

function print_string($string

Function geeksforgeeks 
Function geeksforgeeks
0

Function geeksforgeeks 
Function geeksforgeeks
1$string
Function geeksforgeeks 
Function geeksforgeeks
3
Function geeksforgeeks 
Function geeksforgeeks
4
Function geeksforgeeks 
Function geeksforgeeks
5
Function geeksforgeeks 
Function geeksforgeeks
6
Function geeksforgeeks 
Function geeksforgeeks
7

 

Function geeksforgeeks 
Function geeksforgeeks
1<?php0

Function geeksforgeeks 
Function geeksforgeeks
1<?php2<?php3$string<?php5

<?php6

 

<?php8

$string

Function geeksforgeeks 
Function geeksforgeeks
3 1
Function geeksforgeeks 
Function geeksforgeeks
5_______10_______6
Function geeksforgeeks 
Function geeksforgeeks
7

print_string($string<?php5

<?php2_______29_______3$string<?php5

// Function used for assigning new2

đầu ra.

Function geeksforgeeks
Global geeksforgeeks

Chuyển qua tham chiếu. Khi các biến được truyền theo tham chiếu, cần sử dụng ký hiệu & (dấu và) trước đối số biến. Ví dụ. hàm( &$x ). Phạm vi của cả biến toàn cục và biến hàm trở thành toàn cầu vì cả hai biến được xác định bởi cùng một tham chiếu. Vì vậy, mỗi khi biến toàn cục thay đổi thì biến bên trong hàm cũng thay đổi theo và ngược lại.

Bạn có nên chuyển qua tham chiếu trong PHP không?

Vì vậy, hãy sử dụng tham chiếu chuyển tiếp 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ố đặt dấu và trước tên đối số trong lời gọi hàm của bạn. tạm biệt( &$myVar ); .

Các mảng PHP có được chuyển qua tham chiếu không?

Đối với câu hỏi đầu tiên của bạn, mảng được truyền theo tham chiếu TRỪ KHI nó được sửa đổi trong phương thức/hàm bạn đang gọi . Nếu bạn cố gắng sửa đổi mảng trong phương thức/hàm, một bản sao của nó sẽ được tạo trước và sau đó chỉ bản sao được sửa đổi.

Điều gì được thông qua trong một cuộc gọi PHP theo tham chiếu?

Trong PHP, đối số của hàm có thể được truyền theo giá trị hoặc truyền theo tham chiếu. Theo mặc định, các giá trị của các đối số thực tế được truyền theo giá trị cho các đối số chính thức trở thành các biến cục bộ bên trong hàm. Do đó, việc sửa đổi các biến này không làm thay đổi giá trị của biến đối số thực tế.

Chuyển qua tham chiếu PHP có nhanh hơn không?

Truyền theo giá trị sẽ LUÔN LUÔN NHANH HƠN THEO GIÁ TRỊ so với tham chiếu đối với số lượng đối số nhỏ . Điều này phụ thuộc vào số lượng biến mà kiến ​​trúc cho phép được chuyển qua các thanh ghi (ABI). Điều này là do bạn không phải hủy tham chiếu con trỏ, chỉ cần sử dụng giá trị trực tiếp.