2009-08-20 3 views
0

hier ist mein Getter:Warum verwendet meine Getter Magic-Methode eine Klasseninstanz als Index?

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

hier ist mein Konstruktor

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(); 
    } 

Jedesmal, wenn ich auf diese Funktion zugreifen:

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; 
    } 

Ich erhalte diesen Fehler

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 

Antwort

1

Ist encrypt als public Variable in der Klasse definiert? Wenn nicht, fordert die Logik Ihrer __get()-Funktion, dass es von $this->fields['encrypt'] gelesen wird, die nie festgelegt wird, und was diesen Fehler erzeugt.

+0

Lassen Sie uns sagen, ich habe eine Verschlüsselungsklasse, die ich von dieser Klasse anrufen möchte. Wie mache ich das? Ich habe versucht, $ this-> encrypt = new Encrypt, aber ich denke, die Klasse interpretiert es als eines seiner Attribute. –

+0

Es ist klar: Die 'Verschlüsseln' * Klasse * ist hier irrelevant. Das Problem ist die "encrypt" (korrekt kleingeschriebene) Instanzvariable. Sie müssen diese Eigenschaft entweder als 'public $ encrypt;' oder 'protected $ encrypt; 'deklarieren (je nachdem, welche Sichtbarkeit Sie haben möchten). – VoteyDisciple

+0

$ this-> encrypt = new Encrypt() ist absolut gültig. Die Eigenschaft encrypt sollte eine Instanz von Encrypt sein. –

0

Verwenden Sie get_object_vars für das Objekt, bevor Sie versuchen, auf die Eigenschaft encrypt zuzugreifen, um festzustellen, ob sie wirklich existiert. Etwas anderes könnte weitergehen.

var_dump(get_object_vars($myClass)); 

Edit:

Nachdem in Ihrem Code suchen. Die Methode get() sollte niemals aufgerufen werden, da sie nur aufgerufen wird, wenn auf eine referenzierte Eigenschaft nicht zugegriffen werden kann. Deklarieren Sie $ encrypt als privat? Erklären Sie es überhaupt? Was lässt dich denken, dass get() aufgerufen werden sollte? (Der Formatierer macht verrückt, wenn ich versuche, Unterstriche vor einem Link zu setzen).

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 
    } 
} 
+0

wird tun ... aber zuerst werde ich versuchen, die Verschlüsselung Klasse Instanziierung in der __get magischen Methode hinzufügen ... hoffe, es funktioniert –

Verwandte Themen