11/08/2018, 20:46

PHP trait kể từ PHP 5.4

Kể từ PHP 5.4, ta đã có thể dùng PHP Trait. Mình vẫn hay dùng PHP Trait để bắt buộc các lớp trờ thành singleton như thế này <?php trait Singleton { private function __construct() {} private function __clone() {} private function __wakeup() {} public static function ...

Kể từ PHP 5.4, ta đã có thể dùng PHP Trait. Mình vẫn hay dùng PHP Trait để bắt buộc các lớp trờ thành singleton như thế này

<?php

trait Singleton
{
    private function __construct() {}
    private function __clone() {}
    private function __wakeup() {}

    public static function getInstance()
    {
        static $instance = null;
        return $instance ?: $instance = new static;
    }
}

class MyClass
{
    use Singleton{
        getInstance as singleton;
    }
    public function hello()
    {
        return "Hi there!";
    }
}

$myInstance = MyClass::singleton();
var_dump($myInstance->hello());
$test = new MyClass;

Ở đây dòng cuối cùng sẽ bắn ra Fatal Error

Fatal error: Call to private MyClass::__construct() from invalid context

Lý do là vì __construct đã được định nghĩa là private ở trên trait Singletonđó.
Nếu sử dụng Trait và chỉnh lại tính công khai như sau:

    use Singleton{
         __construct as public;
         getInstance as singleton;
    }

thì khai báo new MyClass sẽ chạy được bình thường. Tuy nhiên lúc này MyClass không còn là một singleton nữa.

Bài đầu tiên trên Kipalog kết thúc ở đây, Đạt mong nhận được ý kiến góp ý của mọi người !

0