Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [OOP5] Accesso a proprietà da classe nipote..

    Salve giovani, ho un piccolo problemino e documentandomi e provando alcuni esempi non sono riuscito ad ottenere risultati, non ho capito se non è ancora supportato o se non c'è un workaround o cos'altro..

    Il problema è questo:
    Codice PHP:
    class root {

        protected static 
    $db;

        public function 
    __construct($db) {
            
    $this->db $db;
        }

        protected static function 
    __callDb() {
            return 
    self::$db;
        }
    }

    class 
    child extends parent {}

    class 
    nephew extends child {

        public function 
    __construct() {
            
    $this->db root::__callDb();
            }

    Il tutto non funziona, a volte mi dice: Access to undeclared static property altre che chiamo metodi di un'oggetto non esistente ect ect.. Ho provato anche altri sistemi ma non funziona..
    Alla fine lo scopo è quello di avere disponibile una classe database in un qualsiasi figlio/nipote/pronipote..

    Se qualcuno ha qualche spunto ben venga..
    Questa volta, più che un voto.. è favoreggiamento.

  2. #2
    Posto anche alcuni esempi che stò provando:

    Codice PHP:
    class root {

        protected static 
    $db;

        public function 
    __construct($db) {
            
    $this->db $db;
        }
    }

    class 
    child extends parent {}

    class 
    nephew extends child {

        public function 
    __construct() {
            
    $this->db root::$db;
        }

        private function 
    __selectQuery() {
            
    $this->db->__query('bla bla bla bla');
        }

    In questo caso mi dice su "$this->db->__query()": Call to a member function __query() on a non-object quindi non mi passa l'oggetto database nella classe nipote..


    Codice PHP:
    class root {

        protected static 
    $db;

        public function 
    __construct($db) {
            
    $this->db $db;
        }
    }

    class 
    child extends parent {}

    class 
    nephew extends child {

        public function 
    __construct($db) {
            
    $this->db root::__construct($db);
        }

        private function 
    __selectQuery() {
            
    $this->db->__query('bla bla bla bla');
        }

    In questo caso può funzionare ma stò cercando di evitare questa strategia proprio per il fatto che dovrei passare 2 volte l'istanza del database.. cosa che voglio evitare per avere disponibile l'oggetto $db dove e quando voglio..
    Questa volta, più che un voto.. è favoreggiamento.

  3. #3
    Studiati questo codice:

    Codice PHP:
    <?php 

    class root {

        protected static 
    $db;

        public function 
    __construct($db) {
            
    self::$db $db;
        }

        protected static function 
    __callDb() {
            return 
    self::$db;
        }
    }

    class 
    child extends root {}

    class 
    nephew extends child {

        function 
    print_db() {
            echo(
    self::__callDb());
        }
        
    }

    $nephew = new nephew('test');
    $nephew->print_db();

    ?>
    P.S. Non utilizzare delle parole riservate (es. parent) per i nomi delle classi.

  4. #4
    Ciao, grazie mo studio,
    per il parent era solo per esplicare la gerarchia delle classi.. infatti ho cambiato in root ma ho dimenticato di correggere una riga sempre a titolo esemplificativo.. Mo vedo se funziona come dici..
    Questa volta, più che un voto.. è favoreggiamento.

  5. #5
    Non ci siamo, posto l'ultimo test eseguito semi copleto e vediamo se si trova la soluzione, le classi:
    Codice PHP:
    class site {

        protected 
    $output;
        protected static 
    $db;

        public function 
    __construct($db) {
            
    self::$db $db;
        }

        protected static function 
    __callDb() {
            return 
    self::$db;
        }

        public function 
    __showSite() {
            return 
    $this->output;
        }
    }

    class 
    page extends site { ... }

    class 
    head extends page { ... }

    class 
    title extends head {

        private 
    $title;

        public function 
    __construct() {
            
    $this->db site::__callDb();
            
    $this->title $this->__selectQuery();
        }

        private function 
    __selectQuery() {
            
    $query "SELECT titolo FROM sezioni WHERE nome = %s LIMIT 1";
            
    $this->db->__query($query$this->page); //line 109
            
    if (!$result $this->db->__risultato()) {
                throw new 
    Exception('La query di selezione ' $query ' non funziona correttamente!!');
            }
            return 
    '<title>' $result '</title>';
        }

        public function 
    __showTitle() {
            return 
    $this->title;
        }

    L'esecuzione:
    Codice PHP:
    try {
        
    $datiAccessoDb = array('host'=>''
                            
    'user'=>''
                            
    'password'=>''
                            
    'database'=>''
                            
    );

        
    $db = new database($datiAccessoDb);

        
    $page = new page($db);
        
    $title = new title();
        
    $htmlTitle $title->__showTitle();


        
    $page->__setHead($htmlTitle);
        
    $page->__buildSite();
        echo 
    $page->__showSite();
    }
    catch(
    Exception $e) {
        echo 
    $e->getMessage();
        exit();

    L'errore che mi ritorna è: Fatal error: Call to a member function __query() on a non-object in /mounted-storage/home75b/sub005/site.php on line 109

    Da qui intuisco che l'oggetto db non passa come ci si aspetta.. Ho provato sia con $this->db = self::__callDb(); che con $this->db = site::__callDb(); ma nessun risultato migliore..

    idee..
    Questa volta, più che un voto.. è favoreggiamento.

  6. #6
    Non l'ho testato:

    Codice PHP:
    class title extends head {

        private 
    $title;

        public function 
    __construct() {
            
    $this->title $this->__selectQuery();
        }

        private function 
    __selectQuery() {
            
    $query "SELECT titolo FROM sezioni WHERE nome = %s LIMIT 1";
            
    self::$db->__query($query$this->page); //line 109
            
    if (!$result self::$db->__risultato()) {
                throw new 
    Exception('La query di selezione ' $query ' non funziona correttamente!!');
            }
            return 
    '<title>' $result '</title>';
        }

        public function 
    __showTitle() {
            return 
    $this->title;
        }

    ...

    Codice PHP:
    $db = new database($datiAccessoDb);

    $page = new page($db);
    $title = new title($db); 
    E comunque non capisco il motivo per cui desideri utilizzare $db come static. Crea solo confusione.

  7. #7
    Originariamente inviato da filippo.toso
    E comunque non capisco il motivo per cui desideri utilizzare $db come static. Crea solo confusione.
    Se c'è un modo migliore per avere una sola istanza del database per tutto il programma ben venga.. non è che voglio usare db come static, è che mi sono imbattuto in questo problema e ho trovato questo tipo di soluzione, ma se ce ne sono di migliori non le disprezzo..

    Resta comunque una soluzione che non vorrei utilizzare, come hai scritto tu:
    Codice PHP:
    $db = new database($datiAccessoDb);

    $page = new page($db);
    $title = new title($db); 
    anche xke se devo fare cosi utilizzo altri metodi.. esempio:
    Codice PHP:
    class title extends head {

        private 
    $title;

        public function 
    __construct($db) {
            
    $this->db $db;
            
    $this->title $this->__selectQuery();
        }

    Quello che vorrei io è condividere il database in tutte le classi correlate alla principale quindi quando io scrivo:
    Codice PHP:
    $sito = new site($db); 
    so già che, anche se non è visibile, ho disponibile il database su tutti i figli semplicemente richiamandolo con ........... e qui non sò dare una risposta..
    Capit.. :master:
    Questa volta, più che un voto.. è favoreggiamento.

  8. #8
    Originariamente inviato da Al_katraz984
    Se c'è un modo migliore per avere una sola istanza del database per tutto il programma ben venga.. non è che voglio usare db come static, è che mi sono imbattuto in questo problema e ho trovato questo tipo di soluzione, ma se ce ne sono di migliori non le disprezzo..

    Dai un occhio a
    singleton e questo thread

    Ad ogni modo imho se passi l'istanza del DB al costruttore (aggregation)
    delle classi in cui ti serve ottieni la stessa cosa senza singleton
    basta istanziare una volta la classe DB all'inizio dello
    script.
    Praticamente è la stessa soluzione di filippo.toso.
    Metti che hai bisogno di interogare un altro DB con il singleton
    come fai ?

    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    non capisco perche' ti impunti a usare l'ereditarieta' una possibile soluzione

    Codice PHP:
    class myBd  {

        private static 
    $db;

        public 
    setDb($db) {
            
    myBd::$db $db;
        }

        public static function 
    callDb() {
            return 
    myBd::$db;
        } 

    all'inizializzaione del db
    Codice PHP:
    myBd::setDb($db); 

    in qualsiasi punto dove ti serve il db in seguito
    Codice PHP:
    class myClass {
         public function 
    metodo() {
              
    $tmpdb myDb::callDb();

         }


    Ciao
    p.s. non l'ho provato e' l'ho scritto direttamente sul forum

  10. #10
    Ops sbagliato thread


    PS

    myBd::setDb($db);
    Questo con strict mode da errore .


    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.