Yii对象实例方法访问

时间:2013-12-27 08:39:34

标签: object methods yii instance override

对于Yii程序员来说这应该是一个非常基本的问题,但我不理解这里的OOP关系......

在我的/protected/models/User.php中我有这样的函数......

public function encrypt($param)
{
...
}

对于用户身份验证,即在类“class UserIdentity extends CUserIdentity”中 我有像这样的Authenticate函数......

public function authenticate()
{
$user = User::model()->findByAttributes(array('email'=>$this->username));
...
...
...
if($user->password !== $user->encrypt($this->password))

这怎么可能? encrypt是User Class中的一种方法。然后应按以下方式访问...

$user = new User;
$user->encrypt();

但是在上面的代码中,$ user已经访问静态方法模型,然后找到记录。那么,我们如何使用$ user作为对象或实例。

有人可以澄清这个吗?

2 个答案:

答案 0 :(得分:2)

User::model()->findByAttributes返回您正确分配给$user变量的模型实例(如果没有找到则返回null)。之后,您可以在encrypt()上调用$user或任何其他非静态方法。

修改

User::model()(或者通常为MyModel::model())是一个静态方法,它返回AR类的实例,除其他外,它可以用于执行find*调用。 不代表数据库中的任何模型。

实际上,所有find*方法都应该是静态的(如User::findBy),但由于Yii不能使用像LSB这样的PHP 5.3功能,因此无法以这种方式实现它。因此,Yii开发人员最终使用CActiveRecord::model()方法,该方法的作用类似于模型的静态实例。

答案 1 :(得分:0)

让我们理解这两个陈述

 $user= User::model()->findByAttributes(array('email'=>$this->username));

让我们先了解 findByAttributes()
这是在 CActiveRecord类中定义的, 所有数据库模型都应该扩展。从理论上讲,您可以创建一个实例 该类然后使用该实例的方法:

$model = new Page;
$model = $model->findByPk($id);

那会有效,但它有点冗长,多余,不合逻辑。 替代方案是 使用静态类实例。静态类实例是更高级的OOP概念 现在 User :: model()

如果你要查看你的User.php,你会发现像

这样的函数
public static function model($className=__CLASS__)
            {
                    return parent::model($className);
            }

那么 User :: model()的作用是什么?

这里model()是一个静态方法,在这里它代表用户类的 model()方法 所以基本上 User :: model()会返回用户类对象。
因此,当您执行此语句时

$user= User::model()->findByAttributes(array('email'=>$this->username));

然后依次以$ user 的形式获得用户类对象。

这就是您可以访问encrypt()

$user->encrypt()方法的原因

来源: - Larry Ulman的Yii Book