Object Yii对象实例方法访问
这对于Yii程序员来说应该是一个非常基本的问题,但我不理解这里的OOP关系 在my/protected/models/User.php中,我有这样一个函数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(
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书中复制的。