码迷,mamicode.com
首页 > Web开发 > 详细

从Yii2登陆中看PHP的工厂模式

时间:2015-05-25 20:45:40      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

首先,简单介绍下工厂模式:

在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类。这时候,使用工厂模式会很方便。

工厂模式 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。

1、首先,我们来实现一个简单的工厂模式,代码如下:

<?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();

2、工厂模式有了,但是这样的工厂模式调用不是很方便,每次都需要去new,然后我们可以采用静态调用的方式,这样就不需要每次都去new一下了,并且调用更加方便

<?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进行调用。

3、那么Yii2中的登录又是如何的乃?

<?php

namespace app\models;

use Yii;

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

这段代码是Yii2中的User模型中的代码,这里使用了接口IdentityInterface类,细心的朋友会去查看\yii\web\IdentityInterface中的代码,这就是一个标准的接口

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中即可看到。部分代码如下:

<?php

namespace app\models;

use Yii;

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

    public $id;
    public $username;
    public $email;
    public $password;
    public $status;
    public $authKey;
    public $accessToken;
    public $created_at;
    public $updated_at;

    /**
     * @inheritdoc
     */
    public static function findIdentity($id) {
        $user = self::findById($id);
        if ($user) {
            return new static($user);
        }
        return null;
    }

    /**
     * @inheritdoc
     */
    public static function findIdentityByAccessToken($token, $type = null) {
        $user = Users::find()->where(array(‘accessToken‘ => $token))->one();
        if ($user) {
            return new static($user);
        }
        return null;
    }
    
    ......

Yii2中的使用是非常灵活的,并且继承了\yii\base\Object。

总结:工厂模式是设计模式中的一种很常用的设计模式,在很多大型应用中非常常见。Yii2中还有很多地方使用了工厂模式,比如依赖注入DI等,有兴趣的童鞋可以了解下。


从Yii2登陆中看PHP的工厂模式

标签:

原文地址:http://my.oschina.net/kenblog/blog/419769

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!