OOP e __construct

Ciao a tutti  :)

Io ho una classe del tipo

class _controller
{
    function _controller()
    {
          try {
          $this->action();
          } catch (Exception $e)
          {  //FAI QUALCOSA  }

     function action()
     {
      //Questa funzione deve essere eseguita ogni volta che la classe viene istanziata
       if (isset($_GET["a"]) && method_exists($this,$_GET["a"]))
         call_user_func(array($this,$_GET[HTTP_ACTION_VAR]));
      else
         $this->main();
     }
    }

abstract class controller extends _controller
{
abstract function main();
}

//La classe controller non va usata da sola ma va estesa, inoltre fa si che il metodo main debba essere ridefinito ogni volta che la si usa

class pagina extends controller
{
     function pagina()
     {
        //carica dei dati   
     }

     function main()
     {
           //fai qualcosa
      }
}
}

Ecco il problema.... la funzione main è la funzione DEFAULT nel senso che se non esiste nessuna variabile $_GET[] che dice quale metodo del controller andare a richiamare, il metodo che deve agire è main.

Per richiamare main in automatico ho  inserito nel costruttore del controller una chiamata ad action (il metodo che richiama gli altri)

Se nella classe pagina ridefinisco il costruttore tutto ciò cade a pezzi, perchè cs facendo Cancello il sotruttore della classe _controller, per essere più preciso, lo ridefinisco, eliminando la chiamata $this->action.

L'unico modo per evitare la cancellazione della chiamata di default è NON sovrascrivere il metodo.

Ora capite bene che se la classe pagina fa uso di un database, sarebbe bene che la connessione ad esso venisse eseguita nel costruttore così da non dover ricopiare il codice in ogni metodo della classe pagina stessa; ma ciò non mi è possibile.

Ho provato il metodo __construct, che da quanto sapevo è "diverso" dal controllore, ma non riesco, forse per un utilizzo errato di __construct. Io avrei semplicemente inserito

function __construct()
{
     $this->action();
}

così speravo di non sovrascrivere il costruttore di _controller.... ma l'interprete php5 non mi da ragione :(

sto impazzendo  :D :D :D   

qualcuno ha qualche idea?  :angel:   

inviato 7 anni fa
fatmatt
X 0 X

In PHP 5, per retrocompatibilità con PHP 4, è consentito creare il costruttore della classe con lo stesso nome della classe. Se però è presente il metodo __construct allora questo verrà considerato come costruttore.

Per ridefinire il costruttore e, allo stesso tempo, non perdere il vecchio si procede così:

class Padre {
    public function __construct() {
   }
}


class Figlio extends Padre {
   public function __construct() {
      parent::__construct();
   }
}

in questo modo quando istanzi un oggetto Figlio il suo costruttore richiamerà il costruttore di Padre

 :bye:

risposto 7 anni fa
Gianni Tomasicchio
X 0 X

Grazie capo, sempre tu mi rispondi  ;D

Però un'ultima domanda: è possbile fare in modo da non dover invocare il costruttore del padre direttamente dal figlio? ovvero, istanzio il figlio, ed eseguo costruttore di padre e poi di figlio

risposto 7 anni fa
fatmatt
modificato 7 anni fa
X 0 X

Ho risolto eliminando un passaggio:

Per far si che il metodo main debba essere implementato utilizzo un metodo di controllo, non ho più bisogno della classe astratta  :)

risposto 7 anni fa
fatmatt
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda