Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    OOP passaggi per riferimento

    ho un classe padre A
    e varie classi B,C,D,E figlie di A
    di cui creo un ogetto in maniera dinamica

    la situazione è questa:
    Codice PHP:
    $variab = array ('pippo'=>'paperina');
    $A=new ();
    $A->Init($variab);
        

    function 
    _Costruisci $CONF ) {

     require_once( 
    "{$CONF['path']}/{$CONF['file']}.php" ); 

     
    $FIGLIA = new $CONF['file']($CONF) ;

     
    $tmp $FIGLIA->Show() ;
     ...
     ...
     if (
    condizione) {
      
    // modifico $CONF ;
      
    _Costruisci $CONF ) ;
     }

    questo è il metodo Init della classe A
    Codice PHP:
    function Init ($variab) {
      
    $this->_VAR $variab#inizial. la proprietà privata

    questo è il metodo elabora della classe A
    Codice PHP:
    function mostra () {
      ...
      
    print_r ($this->_VAR);

    questo è il metodo Show della classe figlia
    Codice PHP:
    function Show() {
     ... 
     
    //faccio altre cose
     
    ...
     
    parent::mostra();

    ovviamente nel costruttore di ogni classe figlia
    richiamo il costruttore della classe padre A

    io mi aspeto che mi venga visualizzato l'array che ho settato inizialmente con il metodo Init
    ma invece l'array è vuoto
    è mi da questo Notice

    Notice: Undefined index: pippo in .....

    come potrei fare?
    perchè quando richiamo (da una classe figlia) il metodo mostra() della classe A
    non mi riconosce il contenuto della proprietà _VAR ?

    grazie 1000
    There are 10 types of people in the world: Those who understand binary, and those who don't.

  2. #2
    up
    There are 10 types of people in the world: Those who understand binary, and those who don't.

  3. #3
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    perché lo richiami come se fosse un metodo statico. Devi usare

    $this->mostra()

  4. #4
    Originariamente inviato da kuarl
    perché lo richiami come se fosse un metodo statico. Devi usare

    $this->mostra()
    nulla, ho provato ma il risultato non cambia...

    Notice: Undefined index: pippo
    There are 10 types of people in the world: Those who understand binary, and those who don't.

  5. #5
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    posta il codice completo, se è troppo evidenzia i passaggi più significativi, magari in grassetto

  6. #6
    Non vorrei dire una sciocchezza dato che non programmo ad oggetti da un bel po', ma se non erro tu prima crei un oggetto $A e successivamente un oggetto $FIGLIA. Ma $A e $FIGLIA sono due oggetti separati e distinti quindi è normale che l'array di $FIGLIA sia vuoto. Devi creare un metodo in $FIGLIA che invoca parent::init() a cui passerai l'array.
    Insomma l'ereditarietà premette di utilizzare i metodi e gli attributi gia definiti nella classe genitore, ma non implica nessun legame tra due oggetti diversi.
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  7. #7
    index.php
    Codice PHP:
        $ELENCO = array('path'=> 'blabla');
        
    $MODULI    = new Moduli ();# creo un oggetto della classe padre 
        
    $MODULI->Init($ELENCO); # QUI LO STAMPA !
        
        
    function _Costruisci $_MOD_CONF ) {
            require_once(
    "{$_MOD_CONF['path']}/{$_MOD_CONF['plugin']}/{$_MOD_CONF['modulo']}.php"); 
            
    $_MODULO = new $_MOD_CONF['modulo'] ($_MOD_CONF) ; # creo un oggetto della classe figlia
            
    $tmp $_MODULO->Carica () ;
            
    $lista $_MODULO->EstraiLista () ;
            while (list(
    $key$value) = each($lista[0])) {
                
    $_MOD_CONF['plugin'] = $lista[1][$key] ; 
                
    $_MOD_CONF['modulo'] = $lista[2][$key] ; 
                
    $return _Costruisci($_MOD_CONF);
                
    $tmp    str_replace($value$return$tmp);
            }
            return 
    $tmp;
        }

        
    $pagina _Costruisci($_MOD_CONF); 
    il metodo Init della classe padre
    Codice PHP:
    function Init ($ELENCO) {
        
    $this->_ELENCO $ELENCO#QUI valorizzo la proprietà incriminata
        
    print_r ($this->_ELENCO);

    il metodo (incriminato) della classe padre
    Codice PHP:
        function TplEval($TPL_CONF) {
            ...
            if (
    $this->_ELENCO["path"] == "blabla"){
            ...
    // qui l'array lo vede come non-inizializzato
            
    }
            ...    
        } 
    il metodo (incriminato) nella classe figlia
    Codice PHP:
    function Carica () { 
        ...
        
    // $ RICHIAMO IL METODO DELLA CLASSE PADRE
        
    eval("\$tmp_tpl = \"".$tmp_tpl=$this->TplEval($this->_TPL_CONF)."\";");
        return 
    $this->TplCarica($this->_TPL_CONF,$tmp_tpl);

    ho provato anche a passare tutto per riferimento
    ma nulla
    e come se perdesse il valore ce ho asseggnato all'array con il metodo Init
    There are 10 types of people in the world: Those who understand binary, and those who don't.

  8. #8
    Originariamente inviato da Anªkin
    Non vorrei dire una sciocchezza dato che non programmo ad oggetti da un bel po', ma se non erro tu prima crei un oggetto $A e successivamente un oggetto $FIGLIA. Ma $A e $FIGLIA sono due oggetti separati e distinti quindi è normale che l'array di $FIGLIA sia vuoto. Devi creare un metodo in $FIGLIA che invoca parent::init() a cui passerai l'array.
    Insomma l'ereditarietà premette di utilizzare i metodi e gli attributi gia definiti nella classe genitore, ma non implica nessun legame tra due oggetti diversi.
    ciao Anªkin
    si, in effetti prima di scrivere il metodo Init
    valorizzavo l'array nel costruttore...e funzionava
    ma dovevo passare ogni volta quest'array (che è molto grande)
    prima alla classe figlia, nel costruttore,
    che a sua volta lo passava alla classe padre (sempre nel costruttore)

    ma poichè creo dinamicamente molti oggetti e poichè alla fine quest'array è sempre lo stesso volevo passarlo una sola volta...

    mmmm hai un'idea di come potrei risolvere? cercando, appunto, di non portarmi dietro quest'array ovunque?
    There are 10 types of people in the world: Those who understand binary, and those who don't.

  9. #9
    neanche questa mattina ho risolto

    ho provato a richiamare il metodo Init della classe padre all'interno della funzione ricorsiva....
    Fatal error: Call to a member function on a non-object in c...
    ma scusate se io definisco una variabile all'esterno di una funzione... essa avrà visibilità anche all'interno della funzione o stò cannando di brutto?
    There are 10 types of people in the world: Those who understand binary, and those who don't.

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