E đang học PHP trên trang PHP.Net, đọc đến cái bài Objects and references in PHP đọc mãi mà ko thông não đc, ai pro giải đáp giúp e với ạ
A PHP reference is an alias, which allows two different variables to write to the same value. As of PHP 5, an object variable doesn’t contain the object itself as value anymore. It only contains an object identifier which allows object accessors to find the actual object. When an object is sent by argument, returned or assigned to another variable, the different variables are not aliases: they hold a copy of the identifier, which points to the same object.
Đoạn này nó nói là tham chiếu trong PHP là 1 tên giả cho phép 2 biến có cùng 1 giá trị đoạn này thì e hiểu là truyền tham chiếu vd $a = &$b tức là $a chỉ là tên giả của $b cả 2 cùng là một. Còn đoạn sau e dốt tiếng anh nên ko hiểu nó nói cái gì. Xem ví dụ của nó thì như này
class A {
public $foo = 1;
}
$a = new A;
$b = $a; // $a and $b are copies of the same identifier
// ($a) = ($b) = <id>
$b->foo = 2;
echo $a->foo."\n";
$c = new A;
$d = &$c; // $c and $d are references
// ($c,$d) = <id>
E ko hiểu lắm “copies of the same identifier” vs “references” nó khác nhau chỗ nào. Ở TH1 thì thay đổi giá trị a->b thay đổi theo và ngược lại, ở TH2 cũng tương tự thay đổi giá trị 1 trong 2 cái thì cái ngược lại cũng thay đổi theo thì sự khác biệt ở đây là gì. Ở phần comment cũng có đoạn như này
A reference is not a pointer. However, an object handle IS a pointer. Example:
Đại loại e hiểu là tham chiếu ko phải 1 con trỏ, tuy nhiên 1 object handle là 1 con trỏ thì ai giải thích cho e object handle nó là cái gì đc ko? tại xem ví dụ của nó cũng ko hiểu
$a = new Foo; // $a is a pointer pointing to Foo object 0
$b = $a; // $b is a pointer pointing to Foo object 0, however, $b is a copy of $a
$a là một con trỏ trỏ đến đối tượng Foo 0 rồi $b là một con trỏ trỏ đến đối tượng Foo 0, tuy nhiên $b là copy của $a
( ko hiểu chỗ này, copy vs trỏ nó khác nhau chỗ nào)
$c = &$a; // $c and $a are now references of a pointer pointing to Foo object 0
$a = new Foo; // $a and $c are now references of a pointer pointing to Foo object 1, $b is still a pointer pointing to Foo object 0
(ko hiểu chỗ này, tham chiếu của con trỏ trỏ đến đối tượng Foo 0 là cái gì, đoạn dưới là $a và $c là tham chiếu của con trỏ Foo 1, còn $b vẫn là con trỏ trỏ đến đối tượng Foo 0 thì tham chiếu của con trỏ khác con trỏ chỗ nào)
Trc h học C thì mặc định tham chiếu giống vs con trỏ đều là địa chỉ ô nhớ giờ sang đây nó phân biệt 2 cái e ko hiểu lắm nó khác nhau chỗ nào, rồi có tài liệu bảo tham chiếu trong PHP là con trỏ có tài liệu lại bảo trong PHP tham chiếu ko phải là con trỏ. Ai rảnh + pro thì giải thích giùm e mấy vấn đề trên vs :(( giải thích đc từng dòng code 1 thì càng tốt ạ. Here’s the code
<?php
class Foo {
private static $used;
private $id;
public function __construct() {
$id = $used++;
}
public function __clone() {
$id = $used++;
}
}
$a = new Foo; // $a is a pointer pointing to Foo object 0
$b = $a; // $b is a pointer pointing to Foo object 0, however, $b is a copy of $a
$c = &$a; // $c and $a are now references of a pointer pointing to Foo object 0
$a = new Foo; // $a and $c are now references of a pointer pointing to Foo object 1, $b is still a pointer pointing to Foo object 0
unset($a); // A reference with reference count 1 is automatically converted back to a value. Now $c is a pointer to Foo object 1
$a = &$b; // $a and $b are now references of a pointer pointing to Foo object 0
$a = NULL; // $a and $b now become a reference to NULL. Foo object 0 can be garbage collected now
unset($b); // $b no longer exists and $a is now NULL
$a = clone $c; // $a is now a pointer to Foo object 2, $c remains a pointer to Foo object 1
unset($c); // Foo object 1 can be garbage collected now.
$c = $a; // $c and $a are pointers pointing to Foo object 2
unset($a); // Foo object 2 is still pointed by $c
$a = &$c; // Foo object 2 has 1 pointers pointing to it only, that pointer has 2 references: $a and $c;
const ABC = TRUE;
if(ABC) {
$a = NULL; // Foo object 2 can be garbage collected now because $a and $c are now a reference to the same NULL value
} else {
unset($a); // Foo object 2 is still pointed to $c
}