Visibilité Public Protected Private en PHP

Programmer en PHP avec les visibilités Public Protected et Private.

 

Visibilité Public Protected Private

La visibilité avec Public Protected Private a été introduit depuis la version de PHP5.
Les propriétés de classe doivent être définies comme publiques, privées ou protégées.
Certaines méthodes ou propriétés peuvent être rendues inaccessible de l’extérieur pour protéger d'autres méthodes ou propriétés.

L'avis d'un développeur :
Il est généralement plus facile de rendre une méthode privée publique que l'inverse.
Vous pouvez être sûr que la méthode privée n'a été utilisée nulle part ailleurs que dans la classe elle-même.
Une méthode publique peut déjà être utilisée partout, ce qui nécessite éventuellement une réécriture du code.

 

Public

Le préfixe public définit une méthode ou propriété publique accessible à tous les niveaux, soit à partir de la classe, d’un descendant ou de l’extérieur.
Si elle est déclarée en utilisant var, la propriété sera définie comme publique.



Protected

Le préfixe protected définit une méthode ou propriété privée accessible qu’à partir de la classe elle-même et ses descendants.
Toutes tentatives d’accès à ces membres  protected entraînera une erreur fatale.

 

Private

Le préfixe private définit une méthode ou propriété privée accessible qu’à partir de la classe mère.
Toutes tentatives d’accès à ces membres private, à partir de l’extérieur ou d’un descendant, entraînera une erreur fatale.

 

Exemple public protected private

<?php
class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // Fonctionne.
echo $obj->protected; // Erreur fatale.
echo $obj->private; // Erreur fatale.
$obj->printHello(); // Affiche Public, Protected et Private
?>

Public
PublicProtectedPrivate

 

Exemple de classe étendue

<?php
class MyClass2 extends MyClass
{
    // Il est possible de redéclarer la valeur des propriétés public et protected, mais pas private.
    public $public = 'Public2';
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // Fonctionne.
echo $obj2->protected; // Erreur fatale.
echo $obj2->private; // Non défini.
$obj2->printHello(); // Affiche Public2, Protected2, Non défini
?>

Public2

Public2Protected2

 

Les méthodes déclarées sans visibilité sont publiques

<?php
class OtherClass
{
    // Déclare un constructeur publique.
    public function __construct() { }

    // Déclare une méthode publique.
    public function MyPublic() { }

    // Declare une méthode protégée.
    protected function MyProtected() { }

    // Declare une méthode privée.
    private function MyPrivate() { }

    // La fonction Foo est publique.
    function Foo()
    {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate();
    }
}

$OtherClass = new OtherClass;
$OtherClass->MyPublic(); // Fonctionne.
$OtherClass->MyProtected(); // Erreur fatale.
$OtherClass->MyPrivate(); // Erreur fatale.
$OtherClass->Foo(); // Public, Protected et Private fonctionnent.

class OtherClass2 extends OtherClass
{
    // La fonction Foo2 est publique.
    function Foo2()
    {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate(); // Erreur fatale.
    }
}

$OtherClass2 = new OtherClass2;
$OtherClass2->MyPublic(); // Fonctionne.
$OtherClass2->Foo2(); // Public et Protected fonctionnent, Private ne fonctionne pas.

class Bar 
{
    public function test() {
        $this->testPrivate();
        $this->testPublic();
    }

    public function testPublic() {
        echo "Bar::testPublic\n";
    }
    
    private function testPrivate() {
        echo "Bar::testPrivate\n";
    }
}

class Foo extends Bar 
{
    public function testPublic() {
        echo "Foo::testPublic\n";
    }
    
    private function testPrivate() {
        echo "Foo::testPrivate\n";
    }
}

$myFoo = new Foo();
$myFoo->test();
// Bar::testPrivate 
// Foo::testPublic
?>

Bar::testPrivate
Foo::testPublic

 

Voir les autres exemples sur le site php.net

Site officiel : https://secure.php.net/manual/en/language.oop5.visibility.php#language.oop5.visiblity-constants

Je ne suis ni athénien, ni grec, mais un citoyen du monde.
Socrate (470-399 avant Jésus-Christ)

Visionduweb - La Réponse Collaborative - 2002 / 2019

Condition d'utilisation du site Visionduweb

Vous êtes soumis au règlement suivant et à ce titre ni l'administrateur ni l'hébergeur ne pourraient ni ne seraient tenu pour responsable de vos actes.
Vous ne devez en aucun cas utiliser les informations présentes sur Visionduweb pour nuire à autrui ou à un système informatique.

La licence CC BY-NC-ND 4.0 est attribuée au contenu rédigé par Visionduweb sur les domaines suivants :
www.visionduweb.com www.visionduweb.eu www.visionduweb.fr www.visionduweb.info

Les profils utilisés par Visionduweb : Anonymous, Visionduweb, Zer00CooL

Soutenir le travail de recherche de Visionduweb :
Le wiki a besoin de vous !

------------

Chercher dans ce site

Menu de connexion