对于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作为对象或实例。
有人可以澄清这个吗?
答案 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