Một số điều thú vị của PHP có thể bạn ít dùng
Bài đăng này đã không được cập nhật trong 7 năm
Mình xin đưa ra một số trường hợp khá thú vị của PHP mà có thể bạn ít dùng, và có lẽ bạn không nên dùng =))
$$
Chúng ta đều biết rằng biến của PHP
được gọi bắt đầu từ dấu $
:
$a = 10;
echo $a;
Kết quả ra màn hình sẽ là 10 rồi nhỉ. Vậy còn trường hợp này thì bạn nghĩ sao?
$a = 10;
$b = 'a';
echo $$b;
Rồi nhiều $
nữa thì có được không nhỉ?
$a = 10;
$b = 'a';
$c = 'b';
echo $$$c;
Mời các bạn test và trải nghiệm.
Nếu bạn vô tình đọc code của ai đó mà thấy
$$
thì có lẽ bạn sẽ nghĩ họ code lỗi ấy nhỉ?
file_get_contents()
Có lẽ bạn đã biết hàm này, nó có thể đọc nội dung của một file nào đó rồi trả về string:
$fileContent = file_get_contents($fileName);
Thậm chí nó còn có thể lấy được nội dung của một web nào đó:
$google = file_get_contents('http://www.google.com.vn/');
Nếu bạn muốn post
một dữ liệu gì đó lên URL nào đó, có lẽ bạn sẽ nghĩ đến cURL
, nhưng bạn có biết file_get_contents()
cũng có thể làm được điều này?
$postData = http_build_query([
'username' => 'someone',
'password' => 'secret',
];
$options = [
'http' => [
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postData,
]
];
$context = stream_context_create($options);
$output = file_get_contents('http://example.com/submit.php', false, $context);
Call a method of class
Nếu bạn muốn gọi một method (giả sử là static method) của một class A
nào đó, bạn có thể gọi bằng những cách nào?
VD class A:
class A
{
public static function talk()
{
echo "I'm A";
}
}
Cách truyền thống có lẽ là đây nhỉ?
A::talk();
Tiếp, có lẽ bạn cũng đã từng thấy cách này nhỉ:
$class = 'A';
$class::talk();
hoặc...
$class = 'A';
$method = 'talk';
$class::$method();
Oki, mạnh tay hơn cách trên, bạn đã thử hay thấy ai đó dùng cách này chưa?
'A'::talk();
hoặc...
$method = 'talk';
'A'::$method();
Yeah, và có lẽ chúng ta cũng nên kể đến cả hàm hỗ trợ sẵn của PHP nhỉ?
call_user_func(['A', 'talk']);
hoặc...
call_user_func_array(['A', 'talk'], []);
Không chỉ dừng lại ở đây, bạn có thể sẽ ngạc nhiên khi PHP cũng có thể gọi bằng cách này:
$func = 'A::talk';
$func(); // PHP >= 7.0.0
hoặc...
$func = ['A', 'talk'];
$func();
Object Reference
Khi $a
là một Object và $b = $a
thì $b
chứa cái gì của Object? $b
có giống hoàn toàn $a
không? Và nó khác gì so với $b = &$a
không?
VD đoạn code sau:
class A
{
public $x;
}
$a = new A();
$a->x = 10;
$b = $a;
$b->x = 20;
echo $a->x;
Có lẽ nhiều bạn sẽ trả lời được rằng kết quả in ra màn hình sẽ là 20
nhỉ.
Ok, vậy ví dụ này, bạn nghĩ nó sẽ in ra màn hình bao nhiêu?
class A
{
public $x;
}
$a = new A();
$a->x = 10;
$b = $a;
$b = new A();
$b->x = 20;
echo $a->x;
10
hay 20
nhỉ? Kết quả là 10
bạn nhé. Vì lúc $b = new A();
thì $b
sẽ trỏ tới đối tượng khác, không liên quan tới $a
nữa.
Rồi, vậy còn trường hợp này thì sao? (Khác nhau ở đoạn gán $a
cho $b
class A
{
public $x;
}
$a = new A();
$a->x = 10;
$b = &$a;
$b = new A();
$b->x = 20;
echo $a->x;
Bạn tự test để kiểm tra nhé
Clone Object
Từ khóa clone
dùng để nhân bản 1 Object. VD:
class A
{
public $b;
}
$a = new A();
$a->b = 10;
$c = clone $a;
Đoạn code $c = clone $a;
sẽ nhân bản đối tượng mà $a
đang trỏ tới, tức tương đương với:
$c = new A();
$c->b = 10;
Ok, vậy trường hợp này bạn nghĩ sao?
class A
{
public $b;
}
class B
{
public $x;
}
$b = new B();
$b->x = 10;
$a = new A();
$a->b = $b;
$c = clone $a;
// $c->b === $a->b ??
$c->b
và $a->b
có cùng là 1 Object không? Hay cũng được clone lúc clone $a?
Bạn tự test và kiểm tra nhé
Just kidding
Có 3 function như thế này:
function f1()
{
return null;
}
function f2()
{
return;
}
function f3()
{
// no return
}
$a = f1();
$b = f2();
$c = f3();
Bạn có cách nào để phân biệt được 3 biến này không? Hiii.
All rights reserved