Maison > cadre php > PensezPHP > 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
Libérer: 2020-09-07 13:18:53
avant
3730 Les gens l'ont consulté

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);
    }
Copier après la connexion

é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;
    }
Copier après la connexion

é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;
    }
Copier après la connexion

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

    protected $bind = [
        'app' => App::class,
        'config' => Config::class,
        'request' => Request::class
    ];
Copier après la connexion

Écrire la invokeClass() méthode

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

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);
Copier après la connexion

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;
    }
Copier après la connexion

Test dans index.php

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

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!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal