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

    Chiarimento sulle regole di visibilità

    Ciao,
    vorrei chiedervi un piccolo chiarimento circa le regole di visibilità:
    Se dichiarao una variabile public: la vedo in qualunque posto nello script.
    Se dichiaro una variabile private: la vedo solo dall'interno della classe dove l'ho dichiarata e per accedervi dall'eseterno devo per forza usare un metodo public dichiarato nella classe stessa.
    Se dichiaro una variabile come protected la vedo e posso accedervi anche nelle sottoclassi...

    Ok...ecco l'esempio che mi crea dei dubbi:

    codice:
    <?php
    
    class MyClass{
    
        protected $name = "Pippo";
    
        private function getName() {
            echo $this->name;
        }
    
    }
    
    class MyOtherClass extends MyClass {        // Estente la classe MyClass
    
        public function getName() {             // aggiungendo un metodo
            echo "The name is " . $this->name;
        }
    
    }
    
    /* Funzione esterna alle classi che deve ricevere un oggetto istanza di MyClass */
    function giveMeObj(MyClass $obj) {
        echo $obj->getName();
    }
    
    $obj1 = new MyOtherClass();     // Creo un oggetto come istanza di MyOtherClass
    giveMeObj($obj1);   // Lo posso passare comunque alla funzione perchè MyOtherClass estende MyClass
    
    ?>
    Ho una classe MyClass che al proprio interno contiene la variabile $name dichiarata come protected, allora $name sarà visibile dentro MyClass e dentro le sue sottoclassi.

    Poi ho una sottoclasse MyOtherClass che estende MyClass aggiungendogli un metodo getName() che semplicemente restituisce il valore della variabile $name.

    Se dichiaro la variabile $name come protected quando invoco la funzione esterna giveMeObj che a sua volta invoca il metodo getName di MyOtherClass mi viene restituito il valore di tale variabile.

    Se invece dichiaro $name come private dentro MyClasse tale valore non mi viene restituito...

    In pratica non mi viene restituito perchè se $name è dichiarata come private, la proprietà non viene ereditata dalla sottoclasse MyOtherClass che estende MyClass?

    E' corretto il ragionamento?

    Grazie
    Andrea

  2. #2
    Utente di HTML.it L'avatar di bubi1
    Registrato dal
    Dec 2009
    Messaggi
    1,230
    Forse non ho capito bene quali sono i tuoi dubbi, ma.. stai facendo delle prove per arrivare a quello che c'e' gia' scritto nel manuale?

    Class members declared public can be accessed everywhere. Members declared protected can be accessed only within the class itself and by inherited and parent classes. Members declared as private may only be accessed by the class that defines the member.

  3. #3
    Originariamente inviato da bubi1
    Forse non ho capito bene quali sono i tuoi dubbi, ma.. stai facendo delle prove per arrivare a quello che c'e' gia' scritto nel manuale?

    Esatto...è una prova...volevo sapere se la mia conclusione circa questo esempio sia corretta

    Tnx

  4. #4
    Andrè, ricordati che le regole di visibilità, con qualche distinguo sintattico, sono le stesse di qualsiasi linguaggio di oop.

    e cmq nel tuo esempio hai myClass con getName privato, e la sottoClasse con getName publico. Se non ricordo male dovrebbe darti errore di compilazione, ma non me lo ricordo

    giusto per chiudere: ovviamente se $name la dichiari privata in myClass, il metodo publico getName dovrà essere in myClass. la sottoClasse potrà fare l'overwrite di tale funzione, però non potrà cmq accedere a $name direttamente. esempio:

    Codice PHP:

    class myClass{
       private 
    $name;

       public function 
    getName(){ return $this->name; }
     
    }


    class 
    subClass extends myClass{
       
       public function 
    getName(){
          
    $name parent::getName(); //uso la funzione di myClass
          
    return $name;
    }


    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  5. #5
    Ho ripassato e ti posso dire...no non da alcun errore di compilazione...se $name è dichiarata protected posso accedervi anche nelle sottoclassi di MyClass...

    Nell'esempio in questione fuori da entrambe le classi viene invocato: echo $obj->getName();
    che a sua volta invoca il metodo pubblico della sottoclasse che può restituire il valore della variabile $name perchè questa è protected quindi accessibbile nella sottoclasse...se invece è dichiarata private non può accedervi...

    Cmq grazie
    Andrea

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.