+38

Một số điều thú vị của PHP có thể bạn ít dùng

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$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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí