Khi nói đến tham chiếu, mọi thứ trở nên phức tạp hơn một chút - bạn cần có khả năng chấp nhận tham số theo tham chiếu và cũng trả về giá trị theo tham chiếu. Điều này được thực hiện với toán tử tham chiếu, &
Việc đánh dấu một biến là "được chuyển bởi tham chiếu" được thực hiện trong định nghĩa hàm, không phải trong lệnh gọi hàm. Đó là
function multiply[&$num1, &$num2] {
là đúng, trong khi
$mynum = multiply[&5, &10];
sai. Điều này có nghĩa là nếu bạn có một hàm được sử dụng hàng trăm [hàng nghìn?] lần trong dự án của mình, bạn chỉ cần chỉnh sửa định nghĩa hàm để làm cho nó nhận các biến theo tham chiếu. Chuyển qua tham chiếu thường là một cách hay để làm cho tập lệnh của bạn ngắn hơn và dễ đọc hơn - lựa chọn không phải lúc nào cũng dựa trên các cân nhắc về hiệu suất. Hãy xem xét mã này
Ví dụ đầu tiên chuyển một bản sao của $val vào, nhân bản sao đó, sau đó trả về kết quả sau đó được sao chép lại vào $val. Ví dụ thứ hai chuyển $val vào theo tham chiếu và nó được sửa đổi trực tiếp bên trong hàm - do đó tại sao square2[$val];
Một điều quan trọng cần nhớ là một tham chiếu là một tham chiếu đến một biến. Nếu bạn định nghĩa một hàm là chấp nhận một tham chiếu đến một biến, thì bạn không thể truyền một hằng số vào đó. Nghĩa là, với định nghĩa của chúng ta về square2[], bạn không thể gọi hàm bằng cách sử dụng square2[10];, vì 10 không phải là một biến, vì vậy nó không thể được coi là một tham chiếu
Bạn muốn học PHP 7?
Hacking with PHP đã được cập nhật đầy đủ cho PHP 7 và hiện có sẵn dưới dạng PDF có thể tải xuống. Nhận hơn 1200 trang học PHP thực hành ngay hôm nay
Nếu điều này hữu ích, vui lòng dành chút thời gian để nói với những người khác về Hacking với PHP bằng cách tweet về nó
Bạn có thể phân biệt thêm liệu chúng có đề cập đến cùng một đối tượng ban đầu hay không và so sánh chúng theo cùng một cách. === toán tử
if[$box1 === $box2] echo 'exact same object!';
Toán tử so sánh === trả về true khi hai biến trỏ đến cùng một giá trị. Nếu các đối tượng giống hệt nhau nhưng được lưu trữ ở các vị trí khác nhau, nó sẽ trả về false
____9. Tức là khi truyền đối tượng vào hàm thì hàm sẽ tác động lên chính đối tượng đó. Nếu đối tượng thay đổi bên trong hàm, thay đổi sẽ được phản ánh bên ngoài hàm. Đây là phần mở rộng của hành vi gán một đối tượng cho một biến mới.
Các đối tượng luôn hoạt động theo cách mà chúng cung cấp một đối tượng cho đối tượng gốc
$mynum = multiply[&5, &10];
0, chứ không phải đối tượng tạo ra chính nó $mynum = multiply[&5, &10];
1. $courier = new PigeonPost['Avian Delivery Ltd'];$other_courier = $courier;
$other_courier->name = 'Pigeon Post';echo $courier->name; // outputs "Pigeon Post"
Đối tượng sẽ cung cấp một tham chiếu đến chính nó, thay vì sao chép một bản sao của chính nó. Điều này có nghĩa là nếu một hàm hoạt động trên một đối tượng được truyền vào, thì không cần phải quay lại từ hàm. Thay đổi này được phản ánh trong bản sao gốc của đối tượng
Nếu bạn cần sao chép một bản sao riêng của một đối tượng hiện có, bạn có thể sử dụng từ khóa
if[$box1 == $box2] echo 'equivalent';
0this để tạo nó$courier = new PigeonPost['Avian Delivery Ltd'];$other_courier = clone $courier;
$other_courier->name = 'Pigeon Post';echo $courier->name; // outputs "Avian Delivery Ltd"
Khi một đối tượng được sao chép, bất kỳ đối tượng nào được lưu trữ trong thuộc tính của nó sẽ là một tham chiếu thay vì một bản sao.
PHP có một cách kỳ diệu, đó là nếu một đối tượng được khai báo, nó sẽ được gọi khi đối tượng được sao chép. Đây là phương thức _clone[] mà bạn có thể khai báo và sử dụng để quyết định
if[$box1 == $box2] echo 'equivalent';
1. Giao diện mượt mà
đối tượng luôn được truyền theo tham chiếu, nghĩa là không cần trả về một đối tượng từ một phương thức để quan sát các thay đổi của đối tượng đó. Tuy nhiên, nếu bạn trả về $this từ một phương thức, bạn có thể tạo một giao diện trôi chảy trong ứng dụng cho phép bạn liên kết các phương thức với nhau. Nguyên tắc làm việc như sau.
1. Tạo đối tượng
2. Gọi phương thức đối tượng
3. Nhận đối tượng đã sửa được trả về từ phương thức
4. Chọn quay lại bước 2
Chìa khóa ở đây là bạn có thể gọi nhiều phương thức trong một dòng mã [bạn có thể thêm một số ngắt dòng để tăng khả năng đọc mã] và gọi chúng theo bất kỳ thứ tự nào. Vì mỗi phương thức trả về đối tượng được tạo, bạn có thể gọi phương thức tiếp theo bằng cách trả về đối tượng