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

    ereditarietà degli oggetti

    ciao

    sto progettando un CMS ad oggetti, volevo sapere fino a che punto posso utilizzare l'ereditarietà in php5

    ad esempio

    Codice PHP:
    class Modulo{

    private 
    $attributo;

     function 
    Modulo(){
     
    $this->attributo="prova";
     }

     function 
    __Destruct(){
     echo 
    "Modulo si distrugge";
     }

    }


    class 
    Utenti extends Modulo(){
     function 
    Utenti(){

     }

     function 
    PrintInfo(){
     echo 
    $super->attributo;
     }

     function 
    __Destruct(){
     echo 
    "Utenti si distrugge";
     }

    questo è quello che vorrei fare, però ho notato che quando istanzio un nuovo oggetto Utenti

    - il costruttore di Modulo non viene chiamato
    - non riesco ad accedere ad "attributo" dalla classe Utenti
    - il distruttore di Modulo non viene chiamato

    sto sbagliando la sintassi o queste funzionalità non sono ancora supportate? ciao e grazie
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  2. #2
    php5 è case sensitive, __destruct e non __Destruct ... come __construct e non __Construct (se sono ammessi invece è un bug o un'idiozia, visto che i metodi sono case-sensitive)

    i parametri private sono, come dice la parola stessa, privati


    non puoi modificare da un figlio un parametro privato di un genitore, al massimo richiamare il metodo ereditato dal genitore che lavora sul privato stesso


    per ereditare un parametro privato da poter manipolare devi usare protected, quindi non private, sempre che tu voglia modificarlo direttamente


    conviene sempre approfondire l'OO prima di usare nuove funzionalità OO
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  3. #3
    be non ero stato li a verificare la sintassi...

    cmq ho visto che funziona sia

    __destruct che __Destruct (e idem per il costruttore)

    la mia domanda era più sulla possibilità di accedere ad attributi o metodi dell'oggetto da cui eredito tramite super, si può o no? perchè questo codice

    Codice PHP:
    <?
    class Modulo{
      
      public 
    $attributo;
      
      function 
    __construct(){
        echo 
    "costruisco modulo
    "
    ;
        
    $this->attributo="pippo";
      }
      
      function 
    __destruct(){
        echo 
    "Modulo si distrugge
    "
    ;
      }
      
    }


    class 
    Utenti extends Modulo{
      
      function 
    __construct(){
        echo 
    "costruisco utente
    "
    ;
      }

    function 
    PrintInfo(){
      echo 
    $super->attributo;
    }
     
     function 
    __destruct(){
       echo 
    "Utenti si distrugge
    "
    ;
     }
    }

    $a = new Utenti();
    $a->PrintInfo();
    ?>
    da questo output

    codice:
    costruisco utente
    Utenti si distrugge
    mentre io mi aspetto

    codice:
    costruisco modulo
    costruisco utente
    pippo
    Utenti si distrugge
    Modulo si distrugge
    sono io che sbaglio la sintassi , o queste funzionalità non sono ancora supportate?

    ciao e grazie
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  4. #4
    Originariamente inviato da nik600
    be non ero stato li a verificare la sintassi...
    ... ah, scusa se stiamo parlando di un linguaggio di scripting e non di meloni



    Originariamente inviato da nik600
    cmq ho visto che funziona sia

    __destruct che __Destruct (e idem per il costruttore)
    Originariamente inviato da nik600
    se sono ammessi invece è un bug o un'idiozia, visto che i metodi sono case-sensitive


    Originariamente inviato da nik600

    sono io che sbaglio la sintassi , o queste funzionalità non sono ancora supportate?
    cominciando dal fatto che php si inizializza con <?php e non con il solo <? ti rispondo subito (è il modo corretto, in futuro il secondo modo non sarà supportato)

    quando estendi una classe e dichiari un costruttore o inizializzi anche il costruttore del super, oppure fai un override di costruttore

    facendo questo, evitando di inizializzare il costruttore del super, non assegni nemeno il parametro ereditato, quindi la stampa darà "null" ovvero stampi una variabie senza valore

    il distruttore lavora allo stesso modo, se lo dichiari in una extends fai un override, quindi o distruggi anche il genitore oppure non richiamerai in automatico anche il suo.


    per questo consigliavo che conviene sempre approfondire l'OO prima di usare nuove funzionalità OO
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  5. #5
    oltre a quanto già detto da andrea,
    in php non viene chiamato il metodo del padre in automatico, devi farlo esplicitamente usando

    parent::metodo()

  6. #6
    ok, era proprio questo che mi interessava , credevo funzionasse come in java dove viene chiamato automaticamente.

    Ringrazio entrambi per le spiegazioni chiare
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  7. #7
    Originariamente inviato da skidx
    oltre a quanto già detto da andrea,
    in php non viene chiamato il metodo del padre in automatico, devi farlo esplicitamente usando
    giusto per la precisazione, solo in override o se serve quel metodo e non sempre



    Codice PHP:
    <?php
    class {
        protected 
    $test '';
        
        public final function 
    __construct() {
            
    $this->test 'Hello World!';
        }
        
        public final function 
    getTest() {
            return 
    $this->test;
        }
        
        public function 
    __destruct() {
            echo 
    '<hr />';
        }
    }
    $test = new A();
    echo 
    '[b]A[/b]
    '
    .$test->getTest();


    class 
    extends {}
    $test = new B();
    echo 
    '[b]B[/b]
    '
    .$test->getTest();


    class 
    extends {
        
    // questi due metodi sono accettati allo stesso modo
        
    public final function getTest2() {
            return 
    '2 => '.$this->getTest(); // uguale a parent::getTest
        
    }
        public function 
    getTest3() {
            return 
    '3 => '.parent::getTest(); // uguale a $this->getTest
        
    }
    }
    $test = new C();
    echo  
    '[b]C[/b]
    '
    .$test->getTest().'
    '
    .$test->getTest2().'
    '
    .$test->getTest3();


    class 
    extends {
        
    //public final function __construct() {
            // parent::__construct();
            // errore, un metodo final non può avere override
        //}
            
        // getTest3 di C invece non è final
        
    public final function getTest3() {
            
    // override del metodo non final possibile
            
    return 'Over '.parent::getTest3();
            
    // in questo caso scrivere $this->getTest3 non avrebbe avuto senso
                    // (quindi è il caso di cui parlava skidx)
        
    }
        
        
    // override del distruttore con chiamata a quello genitore
        
    public function __destruct() {
            
    parent::__destruct();
            echo 
    '_____________________________________________ END ';
        }
    }
    $test = new D();
    echo  
    '[b]D[/b]
    '
    .$test->getTest3();
    ?>






    [edit]
    Originariamente inviato da nik600
    credevo funzionasse come in java dove viene chiamato automaticamente.
    cos'è che fa Java ? ... richiama in automatico un metodo del genitore anche se si sta scrivendo un override dello stesso, a prescindere che sia costruttore o meno ??? .... io penso che Java si comporti allo stesso modo del php 5 .... magari sbaglio ...
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8
    no, in Java (come in C++) la chiamata in automatico avviene per metodi costruttori e distruttori, cosa che in PHP invece devi fare esplicitamente (se vuoi, chiaro).

  9. #9
    Originariamente inviato da skidx
    no, in Java (come in C++) la chiamata in automatico avviene per metodi costruttori e distruttori, cosa che in PHP invece devi fare esplicitamente (se vuoi, chiaro).
    ora mi spiego il declino pazzesco che ha avuto Java ultimamente ... bisogna avere il paraocchi per sviluppare con un limite di questo tipo nel 2006, assurdo



    cmq, tornando al PHP e a nik600, se hai una super classe con public final __constructor / __destructor è uguale a Java, perchè non puoi sovrascriverlo quindi ti ritroverai sempre e per forza quel costruttore / distruttore nei vari extends (però tu tentavi di sovrascriverlo ridichiarando il costruttore di Utente)



    P.S. stavo pensando giorni fa di riprendere un pò Java ... è evidente che pensavo male, è stato un bene dimenticarmelo
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  10. #10
    Originariamente inviato da andr3a
    cmq, tornando al PHP e a nik600, se hai una super classe con public final __constructor / __destructor è uguale a Java, perchè non puoi sovrascriverlo
    non è che in quei linguaggi non puoi sovrascriverlo, puoi dichiarare un costruttore diverso nel figlio ma verrà da questo chiamato in automatico (all'inizio) anche il costruttore del padre.

    Nel manuale php è infatti specificata bene questa differenza da altri linguaggi:

    Parent constructors are not called implicitly if the child class defines a constructor. In order to run a parent constructor, a call to parent::__construct() within the child constructor is required

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.