Late static binding trong PHP
PHP
74
White

Ôm Boom viết ngày 10/07/2015

Trong PHP 5.3 ngoài các tính năng mới như namespace, closure được giới thiệu thì còn một tính năng nữa ít được chú ý hơn (ít nhất là mình nhận thấy vậy) đó là late static binding.

Thì đầu tiên chúng ta cần phải biết late static binding là gì? Cái này mình cũng không biết giải thích sao nữa. Thôi chúng ta sẽ theo dõi một ví dụ về giới hạn của self.

<?php

abstract class AbstractWriter
{
    protected static $instance;

    public static function getInstance()
    {
        if (! self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

class FileWriter extends AbstractWriter
{

}

$writer = FileWriter::getInstance();

Khi các bạn chạy tới dòng lệnh $writer = FileWriter::getInstance(); bạn sẽ nhận được một fatal error về việc không thể khởi tạo một class abstract. Như các bạn đã biết từ khóa self dùng để là từ khóa gọi các phương thức tĩnh, hoặc các const được define trong Class đó hoặc các class mà nó kế thừa. Nhưng nó không thể gọi được các phương thức được define trong class con. Bạn có thể xem tiếp ví dụ sau.

<?php

class Foo
{
    protected static $name = 'foo';

    public static function getName()
    {
        return self::$name;
    }
}

class Bar extends Foo
{
    protected static $name = 'bar';
}

echo Foo::getName();
echo '<br />';
echo Bar::getName();

Khi các bạn chạy thử ví dụ này sẽ thấy 2 chữ foo, tại sao không phải là foobar? vì đây chính là giới hạn của self. nó chỉ có thể truy cập vào được các phương thức, biến, hằng được định nghĩa trong class đó và của các class mà nó kế thừa, chứ không thể truy cập được vào các class kế thừa từ class đó. Để giải quyết vấn đề này thì từ khóa static đã được đưa vào. Giờ hãy viết lại 2 ví dụ trên và sử dụng từ khóa static nhé.

<?php

abstract class AbstractWriter
{
    protected static $instance;

    public static function getInstance()
    {
        if (! static::$instance) {
            static::$instance = new static();
        }
        return static::$instance;
    }
}

class FileWriter extends AbstractWriter
{

}

$writer = FileWriter::getInstance();
echo get_class($writer);
echo '<br />';


class Foo
{
    protected static $name = 'foo';

    public static function getName()
    {
        return static::$name;
    }
}

class Bar extends Foo
{
    protected static $name = 'bar';
}

echo Foo::getName();
echo '<br />';
echo Bar::getName();

Kết quả bạn nhận được sẽ là

FileWriter
foo
bar

Tất nhiên bạn cũng có thể dùng từ khóa static cho constant

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Ôm Boom

10 bài viết.
31 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
13 5
Quên mật khẩu là một tính năng mà hấu hết các ứng dụng đều có. Đôi khi nó cũng vô cùng hữu ích. Nhưng đây cũng chính là một backdoor để chiếm tài...
Ôm Boom viết 6 tháng trước
13 5
White
11 2
Nhiều khi chúng ta cần một start một project nhỏ gọn, không cần phải quá cầu kỳ, nhưng lại quá quen thuộc với Eloquent của Laravel. Vậy làm sao để ...
Ôm Boom viết 1 năm trước
11 2
White
9 6
Virtual Host Virtual Host là một cấu hình trong Apache để cho phép nhiều domain cùng chạy trên một máy chủ. Có một khái niệm khác được đề cập tới ...
Ôm Boom viết hơn 2 năm trước
9 6
Bài viết liên quan
White
2 2
Bash script to fast serve Laravel project Lười gõ dòng lệnh quá nên tạo ra cái script để gõ nhanh :D laravelstart.sh /bin/bash if z "$1" ] ...
Vũ Hoàng Chung viết 11 tháng trước
2 2
Male avatar
9 1
Để bắt đầu làm thêm của riêng bạn thì ban đầu bạn phải có một theme trắng ( Blank theme ) để bắt đầu Theme trắng là gồm có các thư mục và file cơ b...
Doan Van Manh viết hơn 2 năm trước
9 1
Male avatar
0 0
Một ngày nào đó, bạn mới dựng source code lên. Bạn luôn hi vọng khi vào site sẽ hiển thị đẹp mắt và yếu tố đẹp mắt ban đầu sẽ là text của site của ...
skul169 viết hơn 1 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
10 bài viết.
31 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!