Yii对象实例方法访问



这对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

最新更新