DEV Community

Discussion on: Design Patterns in PHP 8: Singleton & Multiton

Collapse
 
suckup_de profile image
Lars Moelleken • Edited

I found recommend not to use "extend" for such patterns.

<?php

final class SingletonLib {

    /**
     * @var array<class-string, object>
     */
    private static $singleton_array = [];

    /**
     * @param string $classname
     *
     * @return object
     *
     * @template       TInit as object
     * @phpstan-param  class-string<TInit> $classname
     * @phpstan-return TInit
     */
    public static function init($classname) {
        if (!isset(self::$singleton_array[$classname])) {
            self::$singleton_array[$classname] = new $classname();
        }

        /* @phpstan-ignore-next-line | static magic */
        return self::$singleton_array[$classname];
    }

    /**
     * @param string $classname
     *
     * @return object
     *
     * @template       TInit as object
     * @phpstan-param  class-string<TInit> $classname
     * @phpstan-return TInit|null
     */
    public static function get($classname) {
        if (!isset(self::$singleton_array[$classname])) {
            return null;
        }

        /* @phpstan-ignore-next-line | static magic */
        return self::$singleton_array[$classname];
    }

    /**
     * @return array<class-string, object>
     */
    public static function getAll() {
        return self::$singleton_array;
    }
}
Enter fullscreen mode Exit fullscreen mode
class Database
{
    public function connect()
    {
        // ...
    }

    /**
     * @return static
     */
    public static function singleton() {
        return SingletonLib::init(static::class);
    }
}
Enter fullscreen mode Exit fullscreen mode

PS: you maybe do not need this at all because you can move this decision into your container e.g.: container.thephpleague.com/4.x/def...

Collapse
 
zhukmax profile image
Max Zhuk • Edited

Thanx for detailed comment