從Yii2登錄中看PHP的工廠模式

首先,簡單介紹下工廠模式:php

在大型系統中,許多代碼依賴於少數幾個關鍵類。須要更改這些類時,可能會出現困難。例如,假設您有一個從文件讀取的 User 類。您但願將其更改成從數據庫讀取的其餘類,可是,全部的代碼都引用從文件讀取的原始類。這時候,使用工廠模式會很方便。web

工廠模式 是一種類,它具備爲您建立對象的某些方法。您可使用工廠類建立對象,而不直接使用 new。這樣,若是您想要更改所建立的對象類型,只需更改該工廠便可。使用該工廠的全部代碼會自動更改。數據庫

一、首先,咱們來實現一個簡單的工廠模式,代碼以下:設計模式

<?php
 
/*
 * PHP設計模式
 * 工廠模式
 */
 
/**
 * 接口
 */
interface Iuser {
 
    function getName();
 
    function getAge();
}
 
/**
 * 接口實現
 */
class User implements Iuser {
 
    public $uid;
    public $user_list = array(
        '1' => array(
            'name' => 'ken',
            'age' => '32'
        ),
        '2' => array(
            'name' => 'nices',
            'age' => '13'
        ),
    );
    public $user;
 
    public function __construct($uid) {
        $this->uid = $uid;
        if (in_array($uid, array(1, 2))) {
            $this->user = $this->user_list[$uid];
        }
    }
 
    public function getName() {
        return $this->user['name'];
    }
 
    public function getAge() {
        return $this->user['age'];
    }
 
}
 
class Studenty {
 
    public function getInfo($uid) {
        return new User($uid);
    }
 
}
 
$studenty = new Studenty();
$sInfo = $studenty->getInfo(2);
echo $sInfo->getName();
echo $sInfo->getAge();

二、工廠模式有了,可是這樣的工廠模式調用不是很方便,每次都須要去new,而後咱們能夠採用靜態調用的方式,這樣就不須要每次都去new一下了,而且調用更加方便app

<?php
 
/*
 * PHP設計模式
 * 工廠模式變種
 */
 
interface Iuser {
 
    public function getName();
 
    public function getAge();
}
 
class User implements Iuser {
 
    public $uid;
    public $user_list = array(
        '1' => array(
            'name' => 'ken',
            'age' => '32'
        ),
        '2' => array(
            'name' => 'nices',
            'age' => '13'
        ),
    );
    public $user;
 
    public static function Load($uid) {
        return new User($uid);
    }
 
    public function __construct($uid) {
        if (in_array($uid, array(1, 2))) {
            $this->uid = $uid;
            $this->user = $this->user_list[$uid];
        }
    }
 
    public function getName() {
        return $this->user['name'];
    }
 
    public function getAge() {
        return $this->user['age'];
    }
 
}
 
$user = User::Load(2);
echo $user->getName();

經過這樣的工廠模式,咱們能夠很方便的使用靜態方法User::Load進行調用。yii

三、那麼Yii2中的登陸又是如何的乃?ui

<?php

namespace app\models;

use Yii;

class User extends \yii\base\Object implements \yii\web\IdentityInterface

這段代碼是Yii2中的User模型中的代碼,這裏使用了接口IdentityInterface類,細心的朋友會去查看\yii\web\IdentityInterface中的代碼,這就是一個標準的接口this

interface IdentityInterface
{
    /**
     * 爲了減小篇幅,我去掉了註釋,這段代碼能夠從Yii2中獲取
     */
    public static function findIdentity($id);
    public static function findIdentityByAccessToken($token, $type = null);
    public function getId();
    public function getAuthKey();
    public function validateAuthKey($authKey);
}

User模型使用了該接口,那麼久必需要進行一些方法的聲明使用,在app\models\User中便可看到。部分代碼以下:spa

<?php

namespace app\models;

class User extends \yii\base\Object implements \yii\web\IdentityInterface
{
    public $id;
    public $username;
    public $password;
    public $authKey;
    public $accessToken;

    private static $users = [
        '100' => [
            'id' => '100',
            'username' => 'admin',
            'password' => 'admin',
            'authKey' => 'test100key',
            'accessToken' => '100-token',
        ],
        '101' => [
            'id' => '101',
            'username' => 'demo',
            'password' => 'demo',
            'authKey' => 'test101key',
            'accessToken' => '101-token',
        ],
    ];

    /**
     * @inheritdoc
     */
    public static function findIdentity($id)
    {
        return isset(self::$users[$id]) ? new static(self::$users[$id]) : null;
    }

    /**
     * @inheritdoc
     */
    public static function findIdentityByAccessToken($token, $type = null)
    {
        foreach (self::$users as $user) {
            if ($user['accessToken'] === $token) {
                return new static($user);
            }
        }

        return null;
    }
    
    ......

Yii2中的使用是很是靈活的,而且繼承了\yii\base\Object。設計

總結:工廠模式是設計模式中的一種很經常使用的設計模式,在不少大型應用中很是常見。Yii2中還有不少地方使用了工廠模式,好比依賴注入DI等,有興趣的童鞋能夠了解下。

相關文章
相關標籤/搜索