Maison  >  Article  >  cadre php  >  Utilisation de la classe Container pour implémenter le framework principal ThinkPHP

Utilisation de la classe Container pour implémenter le framework principal ThinkPHP

coldplay.xixi
coldplay.xixiavant
2020-09-07 13:18:533600parcourir

Utilisation de la classe Container pour implémenter le framework principal ThinkPHP

Recommandations associées : thinkphp

ThinkPHPContainer La classe fournit une méthode statique get(), qui peut obtenir une instance basée sur le nom de classe ou l'alias de la classe. L'instance créée sera conservée pour éviter une création répétée. Implémentez cette méthode ci-dessous, modifiez Container.php et ajoutez le code suivant.

//     * ThinkPHP 5 与 6 在此处参数一致//     * @param string $abstract//     * @param array $vars//     * @param bool $newInstance//     */
    public static function get(string $abstract, array $vars = [], bool $newInstance = false)
    {
        return static::getInstance()->make($abstract, $vars, $newInstance);
    }

écrit la méthode getInstance() et ajoute un attribut statique $instance pour enregistrer sa propre instance.

protected static $instance;public static function getInstance()
    {
        // 创建自身实例
        if (is_null(static::$instance)) {
            static::$instance = new static;
        }
        return static::$instance;
    }

écrit la méthode make().

public function make (string $abstract, array $vars = [], bool $newInstance = false)
    {
        // 这里的 $abstract 是包含有命名空间的类名
        if (isset($this->bind[$abstract])) {
            $abstract = $this->bind[$abstract];
        }

        // 如果已经实例化直接返回
        if (isset($this->instances[$abstract]) && !$newInstance) {
            return $this->instances[$abstract];
        }

        // 如果就创建
        $object = $this->invokeClass($abstract, $vars);

        // 保存实例
        if (!$newInstance) {
        $this->instances[$abstract] = $object;
        }

        return $object;
    }

Créer un tableau d'alias pour enregistrer les attributs$bind

    protected $bind = [
        'app' => App::class,
        'config' => Config::class,
        'request' => Request::class
    ];

Écrire la invokeClass() méthode

public function invokeClass (string $class, array $vars = [])
    {
        // $vars 为构造函数的参数
        return new $class();
    }

Modifier le fichier d'entréeindex.php

require __DIR__ . '/../core/base.php';use think\Request;$req = \think\Container::get('request');var_dump($req instanceof Request);

Output bool (true) signifie que la méthode get() fonctionne correctement.

Vous pouvez également utiliser les méthodes magiques __get() et __set() pour permettre à des objets externes de faire fonctionner directement l'instance de conteneur.

    public function __get($abstract)
    {
        // 返回容器的类实例
        return $this->make($abstract);
    }public function __set($abstract, $instance)
    {
        if (isset($this->bind[$abstract])) {
            $abstract = $this->bind[$abstract];
        }
        // 装入容器
        $this->instances[$abstract] = $instance;
    }

Test dans index.php

$container = \think\Container::getInstance();// 获取容器中的实例,输出对象var_dump($container->request);// 装入容器$container->contianerName = $container;var_dump($container->contianerName);

Objet de sortie (thinkRequest) pour indiquer le succès

Pour plus d'apprentissage en programmation, veuillez prêter attention àFormation php rubrique !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer