Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Regole di visibilità

  1. #1
    Utente di HTML.it L'avatar di Sei
    Registrato dal
    Oct 2016
    Messaggi
    37

    Problema programmazione OO PHP - Variabili vuote in classi figlio

    Ciao ragazzi,
    sono un neofita nella programmazione OO lato PHP. Ora ho il primo problema che mi affligge, potete aiutarmi?
    Allora, ho la mia prima classe, questo è il codice:
    Codice PHP:
    class Veicoli{
        
              protected 
    $elencoVeicoli;

              public function 
    __construct{
                               
    $index 0;
                               
    $topIndex func_num_args();
                               
    $argList func_get_args();
                               for(
    $index$index $topIndex$index++)
                               
    $this->elencoVeicoli[$argList[$index]] = 0;
                                                   }

                      } 
    Diciamo che in questa classe memorizzo tutte le auto che vengono passate..
    Nel main (index, programma principale) faccio questo:
    Codice PHP:
    $oggetto = new Veicoli("maserati","fiat","trattore","ignoranzaInFattoDiVeicoli"); 
    E fin qui tutt'ok.. Poi creo una nuova classe:
    Codice PHP:
    class AnalizzaVeicoli extends Veicoli{

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

                                                     } 
    Torno nel main e scrivo:
    Codice PHP:
    $oggetto2 = new AnalizzaVeicoli(); 
    Il risultato del print è vuoto, come se l'array fosse stato deallocato.. Cosa mi sfugge?
    Ultima modifica di Sei; 18-10-2016 a 12:31

  2. #2
    Ciao, prima di utilizzare l'estensione della classe prova a stampare, nel costruttore della classe principale, il tuo array:



    public function
    __construct{
    $index = 0;
    $topIndex = func_num_args();
    $argList = func_get_args();
    for(
    $index; $index < $topIndex; $index++)
    $this->elencoVeicoli[$argList[$index]] = 0;
    }
    print_r($this->elencoVeicoli);
    }
    e vedi cosa ti stampa.


    Comunque secondo me l'errore è dovuto al fatto che non hai specificato il parametro passato in argomento al costruttore:


    public function
    __construct($arrayVeicoli){

    $this->elencoVeicoli = $arrayVeicoli; //MEGLIO SAREBBE UTILIZZANDO UN METODO DI set

    print_r($this->elencoVeicoli);
    }
    prova così, ho dato uno sguardo veloce se hai problemi fammi sapere.

  3. #3
    Utente di HTML.it L'avatar di Sei
    Registrato dal
    Oct 2016
    Messaggi
    37
    Ciao hypertextPro, intanto grazie per la risposta!
    La stampa è la seguente:
    Codice PHP:
    Array ( [maserati] => [fiat] => [trattore] => [ignoranzaInFattoDiVeicoli] => 
    In effetti ho dimenticato di aggiungere le parentesi tonde al metodo costruttore nel codice trascritto qui, però sul mio originale ci sono..
    Dici che quindi il func_get_args non funziona? Devo esplicitamente passargli un array come valore?
    Ho provato, ma con esito negativo

    Inoltre, vorrei specificare che le due classi si trovano nello stesso documento, funzioni.php, e che sono richiamate nella pagina principale, dove istanzio gli oggetti, dal comando:
    Codice PHP:
    include 'funzioni.php'
    Ultima modifica di Sei; 18-10-2016 a 14:58

  4. #4
    Posta tutto il codice per favore. Ci ho riguardato e sembrerebbe esserci più di un errorre.

  5. #5
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Scusa, ma se fai
    Codice PHP:
    $oggetto = new Veicoli("maserati","fiat","trattore","ignoranzaInFattoDiVeicoli");  
    $oggetto2 = new AnalizzaVeicoli(); 
    Perchè pensi che nell'array di $oggetto2 ci sia qualcosa? Sono due oggetti diversi. nel primo, nel costruttore, riempi l'array. nel secondo, non fai nulla se non stampare l'array, che è vuoto (non è mica quello di $oggetto)
    Al massimo devi fare così:
    Codice PHP:
    class AnalizzaVeicoli extends Veicoli{

             public function 
    __construct(){
                     
    call_user_func_array(array($this'parent::__construct'), func_get_args());
                     
    print_r($this->elencoVeicoli);
             }

     } 
    $oggetto2 = new AnalizzaVeicoli("ferrari","trattore","ignoranzaInFattoDiVeicoli"); 
    Ultima modifica di boots; 18-10-2016 a 16:50

  6. #6
    Utente di HTML.it L'avatar di Sei
    Registrato dal
    Oct 2016
    Messaggi
    37
    Ok, ecco il codice.
    Nel file index.php ho:
    Codice PHP:
    include 'functions.php';
    $Oggetto1 = new Veicoli("veicolo1","veicolo2","veicolo3");
    $Oggetto2 = new AnalizzaVeicoli(); 
    Mentre nel file functions.php sono messo così:
    Codice PHP:
    class Veicoli
    {             
    protected 
    $elencoVeicoli;

    public function 
    __construct()
    {                          
    $index 0;                           
    $topIndex func_num_args();                           
    $argList func_get_args();                           
    for(
    $index$index $topIndex$index++)                               
    $this->elencoVeicoli[$argList[$index]] = 0;
                               
    //Verifica aggiunta su consiglio
    print_r($this->elencoVeicoli);   
    }                                         
    }

    class 
    AnalizzaVeicoli extends Veicoli
    {

    protected 
    $arrayCopia;

    public function 
    __construct()
    {
    print_r($this->elencoVeicoli);
    $arrayCopia $this->elencoVeicoli;
    }

    Ultima modifica di Sei; 18-10-2016 a 17:00

  7. #7
    Utente di HTML.it L'avatar di Sei
    Registrato dal
    Oct 2016
    Messaggi
    37
    Ciao boots,
    grazie per la risposta, ora ho capito.. Cioè, sono due istanze separate, quindi non condividono gli stessi valori..
    A questo punto mi chiedo.. A cosa possono servirmi le classi figlio? Tanto vale inserire tutto il codice che mi interessa nella stessa classe.. Inoltre, riusciresti a spiegarmi brevemente questo:
    Codice PHP:
    ($this'parent::__construct'

  8. #8
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Le classi derivate di solito specializzano la classe padre...aggiungono/modificano funzioni. Esempio banale:
    Classe Base: Persona(nome, cognome)
    Classe Figlia: Studente(nome, cognome, +matricola ) : Persona
    Classe Figlia: Lavoratore(nome,cognome, +lavoro): Persona
    Studente e Lavoratore erediteranno tutte le funzioni di Persona in più gestiranno un campo extra (matricola o lavoro).
    Inoltre potrebbero modificare un ipotetica funzione stampa, aggiungendo il loro campo extra

    ($this, 'parent::__construct')
    Serve a richiamare il costruttore della classe base (Veicoli), che "riempie" l'array. Di solito basterebbe fare così:
    Codice PHP:
    function __construct($param){
        
    parent::__construct($param); // costruttore classe padre
        // altre operazioni della classe figlia

    Ma visto che tu passi un numero arbitrario di parametri, devi usare la call_user_func_array() per poterli passare al costruttore padre
    call_user_func_array(array($istanzaOggetto, 'nome del metodo da chiamare'), $argomenti);
    Ultima modifica di boots; 18-10-2016 a 18:42

  9. #9
    Utente di HTML.it L'avatar di Sei
    Registrato dal
    Oct 2016
    Messaggi
    37
    Ora è davvero tutto chiaro, ti ringrazio moltissimo! Spero di perfezionare molto la mia conoscenza della programmazione ad oggetti con PHP, è molto comodo in termini di riuso del codice! Probabilmente avrò ancora bisogno, ma sino ad allora.. Un saluto e grazie!

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 © 2026 vBulletin Solutions, Inc. All rights reserved.