Object Yii对象实例方法访问

Object Yii对象实例方法访问,object,methods,yii,instance,overriding,Object,Methods,Yii,Instance,Overriding,这对于Yii程序员来说应该是一个非常基本的问题,但我不理解这里的OOP关系 在my/protected/models/User.php中,我有这样一个函数 public function encrypt($param) { ... } public function authenticate() { $user = User::model()->findByAttributes(array('email'=>$this->username)); ... ... ... if(

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

在my/protected/models/User.php中,我有这样一个函数

public function encrypt($param)
{
...
}
public function authenticate()
{
$user = User::model()->findByAttributes(array('email'=>$this->username));
...
...
...
if($user->password !== $user->encrypt($this->password))
对于用户身份验证,即在类“Class UserIdentity extends CUserIdentity”中 我有这样的身份验证功能

public function encrypt($param)
{
...
}
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
返回您正确分配给
$User
变量的模型实例(如果未找到,则返回null)。之后,您可以在
$user
上调用
encrypt()
或任何其他非静态方法

编辑:

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


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

让我们了解这两种语句

 $user= User::model()->findByAttributes(array('email'=>$this->username));
首先让我们了解FindByatAttributes()
这在CActiveRecord类中定义, 所有数据库模型都应该扩展。理论上,您可以创建 类,然后使用该实例的方法:

$model = new Page;
$model = $model->findByPk($id);
这可能行得通,但有点冗长、多余、不合逻辑另一种选择是 要使用静态类实例。静态类实例是一个更高级的OOP概念。
现在用户::模型()

如果您查看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书

如果User::model()->find*返回实例,那么这个User::model()是什么;model()已经是用户类中的一个方法。好的!然后,我应该能够这样调用encrypt()方法$user=newuser$用户->加密();是的。@user2554706好吧,是的,没有什么能阻止你这样做。然而,我看不出你在问题行中发布的代码有任何错误,因为它是从Yii书中复制的。