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

    Oggetto di una classe richiamato in un'altra classe, si può?

    Salve a tutti

    ho un problema logico, si può creare un oggetto di una classe in una istanza di un'altra?

    per farvi capire eccovi un esempio:

    classe uso database (db_use.php)
    Codice PHP:
    class db_use
     
    {
        private 
    $databaseName;
        private 
    $username;
        private 
    $password;
        private 
    $hostname;
        private 
    $db;

        public function 
    _construct()
        {
          
    $this->hostname="localhost";
          
    $this->username="pippo";
          
    $this->password="pippo";

        }
        public function 
    _destruct()
        {
        }
        public function 
    connect()
        {
          try
          {
            
    $this->db= new PDO('odbc:database'$username$password);
            
    $res="OK";
          }
          catch(
    PDOException $e)
          {
            
    $res=$e->getMessage();
          }
          return 
    $res;
        }
        public function 
    get_up_menu()
        {
            
    $i=0;
            foreach( 
    $this->db->query('SELECT titolo FROM page WHERE livello=0 ') as $row) ;
            {
               
    $res[$i]=$row['titolo'];
               
    $i++;
            }
            return 
    $res;
        }
     } 
    principale (index.php)
    Codice PHP:
      $db= new db_use;
      
    $conCheck=$db->connect();
      if  (
    $conOk="Ok")
      {
        
    $menu_up=$db->get_menu_up();
      }
      else
        echo 
    $conCheck

    ma mi ritorna questo errore:
    Fatal error: Call to a member function query() on a non-object in C:\Programmi\xampp\htdocs\sito\db_use.php on line 39


    come se non riconoscssse come metodo di PDO query(), come mai?
    "Due cose riempiono l’animo di ammirazione e venerazione sempre nuova e crescente, quanto piú spesso e piú a lungo la riflessione si occupa di esse: il cielo stellato sopra di me, e la legge morale in me..." Immanuel Kant

  2. #2
    scusa ma il metodo

    Codice PHP:
    $menu_up=$db->get_menu_up(); 
    non dovrebbe istanziare l'altra classe?puoi sempre creare classi separate e fare una estensione dell'altra se vuoi che erediti i suoi metodi e proprietà.

    magari o capito male, ma ad esempio io ho creato un'oggetto x i dns..una classe soa e una classe record dove la soa con il metodo addRecord istanziava l'altra classe...la soa conteneva dati suoi e record e anche soa.

  3. #3
    Originariamente inviato da lbottoni
    scusa ma il metodo

    Codice PHP:
    $menu_up=$db->get_menu_up(); 
    non dovrebbe istanziare l'altra classe?puoi sempre creare classi separate e fare una estensione dell'altra se vuoi che erediti i suoi metodi e proprietà.

    magari o capito male, ma ad esempio io ho creato un'oggetto x i dns..una classe soa e una classe record dove la soa con il metodo addRecord istanziava l'altra classe...la soa conteneva dati suoi e record e anche soa.
    a questo punto sono io che non ho capito la domanda!

    quando c'è il get_menu l'oggetto della classe pdo è già stato creato dalla classe db_use richiamata dalla funzione connect
    "Due cose riempiono l’animo di ammirazione e venerazione sempre nuova e crescente, quanto piú spesso e piú a lungo la riflessione si occupa di esse: il cielo stellato sopra di me, e la legge morale in me..." Immanuel Kant

  4. #4
    hai ragione..la istanzia il metodo connect...allora sono io che ho capito male..se vuoi domani ti posto il codice usato da me così amgari trovi lo spunto per risolvere..

  5. #5
    Originariamente inviato da lbottoni
    hai ragione..la istanzia il metodo connect...allora sono io che ho capito male..se vuoi domani ti posto il codice usato da me così amgari trovi lo spunto per risolvere..
    si ma non capisco che c'è che non va in questo di codice!!
    "Due cose riempiono l’animo di ammirazione e venerazione sempre nuova e crescente, quanto piú spesso e piú a lungo la riflessione si occupa di esse: il cielo stellato sopra di me, e la legge morale in me..." Immanuel Kant

  6. #6
    ho capito...il php distrugge l'oggetto $db nel momento che finisce l'esecuzione della funzione connect e quindi quando poi esegue get_up_menu la variabile $db non è più un
    oggetto della classe PDO e non riconosce il metodo query...
    ma che diavolo di comportamento è? è assurdo, lo fa anche se faccio tutto nell'index.php, nel momento in cui richiamo un'altra funzione l'oggetto viene disintegrato e quando vado a richiamare un suo metodo non lo riconosce come tale...

    qualcuno sa dirmi perchè si comporta così?
    "Due cose riempiono l’animo di ammirazione e venerazione sempre nuova e crescente, quanto piú spesso e piú a lungo la riflessione si occupa di esse: il cielo stellato sopra di me, e la legge morale in me..." Immanuel Kant

  7. #7

    .......

    Codice PHP:
    public function _construct()
        {
          
    $this->hostname="localhost";
          
    $this->username="pippo";
          
    $this->password="pippo";

        }
        public function 
    _destruct()
        {
        }
        public function 
    connect()
        {
          try
          {
            
    $this->db= new PDO('odbc:database'$username$password);
            
    $res="OK";
          }
          catch(
    PDOException $e)
          {
            
    $res=$e->getMessage();
          }
          return 
    $res;
        } 

    La riga incriminata:
    $this->db= new PDO('odbc:database', $username, $password);
    deve essere $this->username etc etc

    Togli il try e catch e lancia un Exception
    se $this->db non è un oggetto.
    Il tutto in OOP si chiama aggregazione.

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

  8. #8

    Re: .......

    fin qui ho capito poi:

    Originariamente inviato da whisher
    Togli il try e catch e lancia un Exception
    se $this->db non è un oggetto.




    non ho capito cosa dovrei fare?
    "Due cose riempiono l’animo di ammirazione e venerazione sempre nuova e crescente, quanto piú spesso e piú a lungo la riflessione si occupa di esse: il cielo stellato sopra di me, e la legge morale in me..." Immanuel Kant

  9. #9

    ......

    private $db = null;

    in connect
    if(!is_a($this->db)
    {
    throw new PDOException('ERROR ');
    }
    Ancora meglio usa instanceof


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

  10. #10

    Re: ......

    Originariamente inviato da whisher
    private $db = null;

    in connect
    if(!is_a($this->db)
    {
    throw new PDOException('ERROR ');
    }
    Ancora meglio usa instanceof


    grazie alla tua chicca sono riuscito a capire quale fosse il problema.
    Ma è una cosa strana ed adesso te la posto:

    se l'istruzione è scritta così:
    Codice PHP:
    $this->db= new PDO('odbc:database''root'''); 
    funziona tutto!

    se invece la scrivo così :
    Codice PHP:
    $this->db= new PDO('odbc:database'$this->username$this->password); 
    mi ritorna questo errore:
    codice:
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HYT00] SQLConnect: 1045 
    [MySQL][ODBC 3.51 Driver]Access denied for user 'ODBC'@'localhost' (using password: NO)' in 
    C:\Programmi\xampp\htdocs\sito\db_use.php:33 Stack trace: #0 
    C:\Programmi\xampp\htdocs\sito\db_use.php(33): PDO->__construct('odbc:database', NULL, NULL) #1 
    C:\Programmi\xampp\htdocs\sito\index.php(8): db_use->connect() #2 {main} thrown in 
    C:\Programmi\xampp\htdocs\sito\db_use.php on line 33
    eppure nel costruttore della mia classe ho definito:
    Codice PHP:
    public function _construct()
        {
          
    $this->hostname="localhost";
          
    $this->username="root";
          
    $this->password="";
          
    $this->databaseName="database";
        } 
    è come se non venisse invocata..come mai?
    "Due cose riempiono l’animo di ammirazione e venerazione sempre nuova e crescente, quanto piú spesso e piú a lungo la riflessione si occupa di esse: il cielo stellato sopra di me, e la legge morale in me..." Immanuel Kant

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.