Visualizzazione dei risultati da 1 a 9 su 9

Discussione: il metodo costruttore

  1. #1
    Utente bannato
    Registrato dal
    Oct 2011
    Messaggi
    185

    il metodo costruttore

    il metodo costruttore è necessario?
    a cosa serve?

    questa domanda mi sorge spontanea perchè stavo vedendo come estendere le classi


    e quindi avevo una struttura del genere davanti

    class a{

    proprietà

    metodi
    }


    class b extends a{

    public function __construct($var){

    ecc
    ecc
    }
    }



    se la classe b necessita del metodo costruttore, come faro' io a sapere se la classe a, ha il costruttore oppure no



    cioè immagginate migliaia di classi

    utilizzo la classe a già per altre cose con il metodo costruttore ecc



    poi mi accorgo che devo esternderla per nuove funzioni separate
    sto metodo costruttore lo posso mettere a tutte e 2?
    cè una regola particolare....


    scusate sto confuso......

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    98
    il metodo costruttore è implicito in ogni classe, cioè c'è anche se non lo definisci. Nel momento in cui estendi una classe viene overridato, cioè sovrascritto nella sottoclasse. Quindi a te non serve sapere se c'è, perché c'è sempre

    Il costruttore serve a fare delle operazioni (tipo l'inizializzazione degli attributi della classe) nel momento in cui istanzi una classe. Ma quello che ho detto non riguarda propriamente il PHP, ma i paradigmi della programmazione orientata agli oggetti

  3. #3
    Utente bannato
    Registrato dal
    Oct 2011
    Messaggi
    185
    quindi posso anche non metterlo il costruttore?

    solo mi devo ricordare che quando istanzio non devo inserire niente tra parentesi e quindi non posso passare un valore di riferimento quindi

    $var = new class();


    poi posso fare una classe per ogni operazione tipo login logout registrazione ecc?
    non necessariamente collegate tra loro? possono cmq essere indipendenti le une dalle altre?

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    98
    Originariamente inviato da Raulken
    quindi posso anche non metterlo il costruttore?

    solo mi devo ricordare che quando istanzio non devo inserire niente tra parentesi e quindi non posso passare un valore di riferimento quindi

    $var = new class();
    il costruttore puoi anche non metterlo cioè non esplicitarlo; se lo metti puo' avere parametri o non averli. Quindi il fatto che ti debba ricordare o meno di mettere i parametri non c'entra con fatto che ci sia o non ci sia.


    poi posso fare una classe per ogni operazione tipo login logout registrazione ecc?
    non necessariamente collegate tra loro? possono cmq essere indipendenti le une dalle altre?
    si, puoi farle, così come puoi mettere tutto in una classe; queste solo scelte di design...

    Io ti consiglierei di capire bene cos'è la programmazione ad oggetti... meglio programmare senza oggetti, in maniera procedurale, che programmare ad oggetti molto male...

    Chi è alle prime armi deve capire che imparare a programmare è un lungo percorso e che non coincide col saper perfettamente la sintassi di un linguaggio. Tu ti poni il problema posso/non posso... dovresti porti un unico problema: so cosa sto facendo, al di là del linguaggio che sto usando? Ho capito le basi della programmazione ad oggetti? Perché se non ci sono quelle, i tuoi dubbi non si esauriranno mai

  5. #5
    Utente bannato
    Registrato dal
    Oct 2011
    Messaggi
    185
    Originariamente inviato da xproj
    Chi è alle prime armi deve capire che imparare a programmare è un lungo percorso e che non coincide col saper perfettamente la sintassi di un linguaggio. Tu ti poni il problema posso/non posso... dovresti porti un unico problema: so cosa sto facendo, al di là del linguaggio che sto usando? Ho capito le basi della programmazione ad oggetti? Perché se non ci sono quelle, i tuoi dubbi non si esauriranno mai
    il problema è che se programmo un sito in procedurale, dopo dovrò comunque trasformarlo in oggetti e rifare tutto daccapo

    ho letto molto sulla programmazione ad oggetti tra libri guide su html.it
    tra l'altro ho anche studiato UML
    tutto in modo approfondito


    ma purtroppo qualche dubbio cè l'ho ancora spesso si tratta di quisquiglie,sono proprio quelle che mi mandano in confusione

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    98
    quando hai dubbi come quello prima, potresti subito provare a buttare giù del codice di prova per vedere cosa succede. La programmazione ad oggetti è ostica all'inizio.. però da delle belle soddisfazioni!

  7. #7
    Utente di HTML.it L'avatar di garakkio
    Registrato dal
    Dec 2011
    residenza
    Roma
    Messaggi
    480
    Originariamente inviato da xproj
    il metodo costruttore è implicito in ogni classe, cioè c'è anche se non lo definisci. Nel momento in cui estendi una classe viene overridato, cioè sovrascritto nella sottoclasse.
    Potresti fornire dei riferimenti a supporto di queste due affermazioni?

  8. #8
    Originariamente inviato da Raulken
    il problema è che se programmo un sito in procedurale, dopo dovrò comunque trasformarlo in oggetti e rifare tutto daccapo
    ah sì? e perché poi??
    Non è che OOP sia intrensicamente migliore della programmazione procedurale....
    La OOP è estremamente utile (diciamo pure indispensabile) per grandi progetti, ma per progetti medio piccoli dove ci lavora un unico programmatore e la complessità e contenuta, la programmazione procedurale può essere comunque un'ottima soluzione.

    Poi va considerato che anche se fai un sito in OOP sbagliando il design delle classi ti trovi a un certo punto che devi rifare tutto da capo...

    Tornando in argomento

    Sui costruttori una cosa alla quale devi fare attenzione è questa.
    In PHP, al contrario di altri linguaggi di programmazione OOP (C++, Java, ecc), il costruttore esplicito (cioè che hai ridefinito tu) di una della classe figlio non chiama automaticamente il costruttore della classe padre, ma devi farlo tu usando parent::__construct()

    in pratica diciamo che hai una classe Tavolo dove il costruttore ogni volta
    che viene istanziato un oggetto della classe setta la proprietà $gambe = 4
    Codice PHP:

    class Tavolo {
       public 
    $gambe;
       function 
    __construct() {
           
    $this->gambe 4;
       }

    ora se tu estendi la classe così

    Codice PHP:
    class TavoloPiccolo extends Tavolo {
     public 
    $area_cmq;
    }

    $t = new TavoloPiccolo();
    echo 
    '
    gambe='
    .$t->gambe//4 
    TavoloPiccolo - ereditando da Tavolo - avrà anche lui la proprietà $gambe
    e $gambe varrà 4 perché non avendo ridefinito il costruttore diTavoloPiccol è stato chiamato implicitamente quello del padre (Tavolo) che ha impostato $gambe a 4


    ma se tu estendi la classe in questo modo

    Codice PHP:
    class TavoloPiccolo extends Tavolo {
        public 
    $area_cmq;
        function 
    __construct() {
           
    $this->area_cmq 1600;
       }

    }

    $t = new TavoloPiccolo();
    echo 
    '
    gambe='
    .$t->gambe//null
    echo '
    area='
    .$t->area_cmq//1600 
    Cioè avendo definito esplicitamente il costruttore di TavoloPiccolo quello della classe padre Tavolo non è stato chiamato.

    Per far si che venga chiamato bisogna dirlo eplicitamente con parent::__construct()
    Codice PHP:
    class TavoloPiccolo extends Tavolo {
        public 
    $area_cmq;
        function 
    __construct() {
           
    $this->area_cmq 1600;
           
    parent::__construct() ;
       }

    }

    $t = new TavoloPiccolo();
    echo 
    '
    gambe='
    .$t->gambe//4
    echo '
    area='
    .$t->area_cmq//1600 
    Ora il costruttore di TavoloPiccolo ha impostato a 1600cmq l'area e poi ha chiamato il costruttpre di Tavolo che ha impostato a 4 le gambe

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    98
    Originariamente inviato da garakkio
    Potresti fornire dei riferimenti a supporto di queste due affermazioni?
    si devo correggermi. Non viene overridato il costruttore nella subclasse se non viene esplicitato nella sub classe.. se istanzio la subclasse viene chiamato il costruttore della superclasse! pardon

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.