这对Yii程序员来说应该是一个非常基本的问题,但我不理解这里的OOP关系…
在我的/protected/models/User.php中,我有一个这样的功能…
public function encrypt($param)
{
...
}
对于用户身份验证,即在"类UserIdentity扩展CUserIdentity"中我有这样的身份验证功能…
public function authenticate()
{
$user = User::model()->findByAttributes(array('email'=>$this->username));
...
...
...
if($user->password !== $user->encrypt($this->password))
这怎么可能?encrypt是用户类中的一个方法。然后应该通过以下方式访问…
$user = new User;
$user->encrypt();
但在上面的代码中,$user已经在访问静态方法模型,然后找到记录。那么,我们如何使用$user作为对象或实例呢。
有人能澄清一下吗?
User::model()->findByAttributes
返回一个模型实例(如果找不到,则为null),您正将该实例正确分配给$user
变量。之后,您可以在$user
上调用encrypt()
或任何其他非静态方法。
编辑:
User::model()
(或通常的MyModel::model()
)是一个静态方法,它返回AR类的实例,该实例可用于执行find*
调用。它不表示数据库中的任何模型。
实际上,所有的find*
方法都应该是静态的(比如User::findBy
),但由于Yii不能使用像LSB这样的PHP 5.3功能,所以不可能用这种方式实现它。因此Yii开发人员最终得到了CActiveRecord::model()
方法,它的作用就像一个模型的静态实例。
让我们理解这两个语句
$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()是一个静态方法,这里它表示User类的model()方法
所以基本上User::model()返回一个用户类对象
因此,当您执行此语句时,
$user= User::model()->findByAttributes(array('email'=>$this->username));
然后依次获得$User形式的User类对象
这就是您可以访问encrypt()
方法(如$user->encrypt()
)的原因
来源:-Larry Ulman的Yii Book