为什么我的getter魔术方法使用类实例作为索引?

时间:2009-08-20 01:07:59

标签: php kohana

这是我的吸气者:

public function __get($field)
    {
        if ($field == 'userId'):
            return $this->uid;
        else:
            return $this->fields[$field];
        endif;
    }

这是我的构造函数

public function __construct()
    {
        $this->uid = null;
        $this->fields = array(
            'username' => '',
            'password' => '',
            'firstname' => '',
            'lastname' => '',
            'email' => '',
            'is_active' => false
        );
            $this->session = Session::Instance();
            $this->profiler = new Profiler();
            $this->encrypt = new Encrypt();
    }

每次我访问此功能:

private function handle_pass($password, $username=null, $encrypt=true)
    {
        if ($encrypt) :
            return $this->encrypt->encode($password);
        else:
            $query = ORM::factory('user');
            $result = $query
                ->select('password')
                ->where('username', $username)
                ->find();
            $compare_pass = $this->encrypt->decode($password);
            return ($compare_pass === $result->password);
        endif;
    }

我收到此错误

application/libraries/User.php: Undefined index: encrypt // this is the error message
application/libraries/User.php:User->__get( encrypt ) // this is the last method executed

2 个答案:

答案 0 :(得分:1)

encrypt是否被定义为班级中的public变量?如果没有,那么__get()函数的逻辑要求从$this->fields['encrypt']读取它,这是从未设置的,并且是产生该错误的原因。

答案 1 :(得分:0)

在尝试访问encrypt属性之前,在对象上使用get_object_vars以查看它是否真的存在。还有其他事情可以继续。

var_dump(get_object_vars($myClass));

编辑:

查看代码后。永远不应该调用get()方法,因为只有在引用的属性不可访问时才会调用它。您是否将$ encrypt声明为私有?你在宣布它吗?是什么让你觉得应该调用get()? (格式化程序在我尝试使用链接将下划线放在get()前面时会发疯。

class myClass()
{
  public $encrypt;

  public function __construct() 
  {
    $this->encrypt = new Encrypt();
  }

  public function __get($property)
  {
    return $this->$property;
  }

  public function handle_pass()
  {
    $this->encrypt->decode(); 
    // Since $encrypt is public, __get() will not be invoked
  }
}