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

    classe senza costruttore?

    Ciao, ho visto diversi esempi in cui si crea una classe senza il costruttore. Mi domando quindi che differenza ci sia tra questa e una serie di funzioni o metodi statici.
    Forse una riesco ad immaginarla, ovvero poter avere delle variabili private da gestire come si vuole, ma per il resto?

  2. #2
    Utente di HTML.it L'avatar di Gab-81
    Registrato dal
    Nov 2005
    Messaggi
    558
    Questo è assai strano...un costruttore deve necessariamente esserci, altrimenti l'oggetto come lo inizializzo? E siamo alla seconda domanda: un costruttore serve ad inizializzare lo stato dell'oggetto; le funzioni a lavorare sulle variabili definite all'interno dell'oggetto stesso...


  3. #3
    Originariamente inviato da Gab-81
    Questo è assai strano...un costruttore deve necessariamente esserci, altrimenti l'oggetto come lo inizializzo?
    non è obbligatoria la presenza di un costruttore in una classe.
    Infatti, se usate phpmailer (ad esempio), non inizializzate niente.
    Difatti:
    Codice PHP:
    $mail = new PHPMailer(); 
    E' solo buona norma, evitando di aggiungere 30 metodi magari inutili, oppure se la classe ha bisogno di qualcosa che non si può omettere
    Tipo:
    Codice PHP:
    $dir = new dir("/etc"); 
    il discorso è lo stesso del distruttore; se in una mia classe ne ho bisogno per fare delle operazione, allora dichiaro il metodo __destruct, altrimenti no.

    E siamo alla seconda domanda: un costruttore serve ad inizializzare lo stato dell'oggetto; le funzioni a lavorare sulle variabili definite all'interno dell'oggetto stesso...
    Attenzione: tra funzioni e metodi ne passa...
    una funzione non appartiene ad un oggetto, a differenza dei metodi, e come tale non può accedere alle propietà dell'oggetto (non essendoci)
    Perchè essere stupidi non è una menomazione ma un diritto di tutti!!!

  4. #4
    Utente di HTML.it L'avatar di Gab-81
    Registrato dal
    Nov 2005
    Messaggi
    558
    Originariamente inviato da sonounostrinato
    Attenzione: tra funzioni e metodi ne passa...
    una funzione non appartiene ad un oggetto, a differenza dei metodi, e come tale non può accedere alle propietà dell'oggetto (non essendoci)
    Intendevo metodi, ovviamente

    Cmq ritorno a dire che un costruttore, anche se di default e non espressamente dichiarato serve. E' impensabile avere:

    Codice PHP:
    // Omissis
    $phpmailer->aMethod(); 
    Senza aver inizializzato lo stato della variabile $phpmailer attraverso il costruttore - come hai detto anche tu -, anche se questa operazione non tocca alcuna variabile di classe. Purtroppo credo che queste differenze non si apprezzino in PHP, che non è un linguaggio propriamente ad oggetti, nel senso che nasce come un linguaggio di scripting ed ha avuto una estensione verso la OOP solo dalla versione 4, credo...in altri linguaggi espressamente ad oggetti tali distinzioni sono apprezzabili...a mio avviso...


  5. #5
    ehm ... non c'entra poi molto

    il fatto che non ci sia il costruttore non ti vieta di fare

    $phpMailer = new PHPMailer();

    infatti in automatico php instanzia la classe e restituisce l'oggetto senza chiamare il costruttore dato che non c'è

    Il costruttore non è affatto indispensabile infatti potrebbe benissimo essere che per le operazioni che fai i parametri li setti dopo invece che prima.

    Un sistema molto usato, quando hai la necessità di prima istanziare, per mantenere un integrità interna ed evitare inutili controlli, e aggiungere un metodo tipo Initialize e usare quello per far fare l'inizializzazione, se ne ha bisogno, all'oggetto

  6. #6
    Io faccio questo ragionamento:
    se ho queste classi:
    Codice PHP:
    class Img
    {
        private 
    $resource;
       
        public function 
    __construct($path)
        {
              
    $this->resource imagecreatefromjpeg($path);
        }
    }

    class 
    Img_2
    {
        private 
    $resource;

        public function 
    addResource($path)
        {
             
    $this->resource imagecreatefromjpeg($path);
        }

    e le richiamo cosi:
    Codice PHP:
    $img = new Img("/path/toimg.jpg");
    $img2 = new Img_2();
    $img2->addResource("/path/toimg.jpg"); 
    cosa ottengo? la stessa identica cosa! (provare per credere)

    Detto questo, bisogna capire che il costruttore è un cosa, e l'inizializzazione di un oggetto è un altra.
    Nel primo esempio inizializzo un oggetto ($img) ed essendoci il metodo "magico" del costruttore, che viene eseguito, è obbligatorio passargli il path all'immagine.
    Mentre nel secondo ($img2) c'è solo l'inizializzazione .
    Per essere ancora più chiari
    Codice PHP:
    $img = new Img("/path"); #Inizializzazione con costruttore
    $img2 = new Img2();       #Inizializzazione e basta 
    Quindi l'esempio che dici tu è impossibile perchè non viene inizializzato l'oggetto (operatore new).
    Lo stesso discorso lo puoi fare con __destruct: se c'è vuol dire che hai delle operazioni da fare in fase di distruzione dell'oggetto, altrimenti vuol dire che non te ne frega niente.
    Seguendo il tuo discorso, inizializzando un oggetto ma non distruggendolo con __destruct l'oggetto persiste, cosa sbagliata.
    Spero di averti fatto capire la differenza tra costruttore e inizializzazione, altrimenti chiedi di nuovo







    Perchè essere stupidi non è una menomazione ma un diritto di tutti!!!

  7. #7
    Originariamente inviato da daniele_dll
    ehm ... non c'entra poi molto

    il fatto che non ci sia il costruttore non ti vieta di fare

    $phpMailer = new PHPMailer();

    infatti in automatico php instanzia la classe e restituisce l'oggetto senza chiamare il costruttore dato che non c'è

    Il costruttore non è affatto indispensabile infatti potrebbe benissimo essere che per le operazioni che fai i parametri li setti dopo invece che prima.

    Un sistema molto usato, quando hai la necessità di prima istanziare, per mantenere un integrità interna ed evitare inutili controlli, e aggiungere un metodo tipo Initialize e usare quello per far fare l'inizializzazione, se ne ha bisogno, all'oggetto
    infatti, alla fine, i metodi __construct e compagnia solo utili ma non obbligatori.
    Perchè essere stupidi non è una menomazione ma un diritto di tutti!!!

  8. #8
    Utente di HTML.it L'avatar di Gab-81
    Registrato dal
    Nov 2005
    Messaggi
    558
    Ma comunque l'oggetto va creato con l'operatore new, altrimenti come faccio a richiamare metodi su quell'oggetto se non lo creo?


  9. #9
    Originariamente inviato da Gab-81
    Ma comunque l'oggetto va creato con l'operatore new, altrimenti come faccio a richiamare metodi su quell'oggetto se non lo creo?

    sisi certo

  10. #10
    Originariamente inviato da Gab-81
    Ma comunque l'oggetto va creato con l'operatore new, altrimenti come faccio a richiamare metodi su quell'oggetto se non lo creo?

    si certo, l'unica cosa era che non avevate chiaro la differenza tra inizializzazione e construct

    Perchè essere stupidi non è una menomazione ma un diritto di tutti!!!

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.