Un metodo in una classe dovrebbe sapere che la classe ha "caricato" una variabile?

1

Quindi ho il seguente codice, che si connette e quindi si collega a un server LDAP.

La domanda è nel primo metodo.

  public function getUsers() // This is the method in question
  {
    if( $this->connect()->bind() ) {
      ldap_query(self::$connection) // Here, should it be aware that class succesfully loaded
         // the connection, or should the bind() method return the resource?
    }
  }

  public function connect()
  {
    self::$connection = ldap_connect($this->host);
    if( ! self::$connection ) {
      throw new \CHttpException(503, 'No se puede establecer una conexión con el servidor '.$this->host);
    }
    foreach( $this->options as $option => $value ) {
      ldap_set_option(self::$connection, constant($option), $value);
    }
    return $this;
  }

  public function bind()
  {
    $ldapbind = ldap_bind(self::$connection, $this->username.'@'.$this->domain, $this->password);
    if( ! $ldapbind ) {
      throw new \CHttpException(503, 'No se puede enlazar con el servidor: '.ldap_error(self::$connection));
    }
    return true;
  }
    
posta JorgeeFG 04.02.2014 - 20:40
fonte

2 risposte

3

Le classi (o oggetti come istanze di classi) creano un ambito locale in cui le variabili membro fungono da "globale" entro i limiti di questo ambito. Questo è intenzionale, quindi è perfettamente ok se una funzione membro inizializza una variabile membro e una seconda fa uso del fatto che la prima funzione è terminata correttamente senza un'eccezione.

Quindi nel tuo caso: se bind() inizializza $ldapbind (e non lancia un'eccezione), non c'è motivo di restituire $ldapbind . getUsers può semplicemente assumere $ldapbind da inizializzare.

    
risposta data 04.02.2014 - 21:12
fonte
3

Piuttosto che doversi preoccupare che la classe crei e leghi correttamente una connessione. Far passare la risorsa alla classe come parte del costruttore. La connessione e il binding sarebbero parte della loro classe che restituirebbe la risorsa che si passa alla classe che chiama getUsers . Quindi non devi preoccuparti se è stata effettivamente creata una connessione da utilizzare in quanto deve esistere per poter persino usare la classe.

In alternativa potresti avere un'interfaccia Connection che la tua classe si aspetta che avvolge la risorsa e fornisce un metodo query che useresti per ottenere gli utenti nel tuo metodo getUsers . In questo modo se decidi di cambiare ciò che connetti per ottenere i tuoi utenti, devi solo creare una nuova classe che utilizzi l'interfaccia Connection e funzionerà senza problemi.

    
risposta data 04.02.2014 - 21:13
fonte

Leggi altre domande sui tag