La visibilité d'une propriété ou d'une méthode peut être définie en préfixant la déclaration avec un mot-clé : public, protected ou private. Les éléments déclarés publics (public) peuvent être utilisés par n'importe quelle partie du programme. L'accès aux éléments protégés (protected) est limité aux classes et parents hérités (et à la classe qui a défini l'élément). L'accès aux éléments privés (private) est uniquement réservé à la classe qui les a définis.
Les propriétés des classes doivent être définies comme publiques, protégées ou privées. Si la propriété est déclarée avec le mot var sans visibilité explicite, celle-ci sera alors définie publique.
Exemple #1 Déclaration des propriétés
<?php
/**
* Définition de MyClass
*/
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
/**
* Définition de MyClass2
*/
class MyClass2 extends MyClass
{
// On peut redéclarer les éléments publics ou protégés, mais pas ceux privés
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // Fonctionne
echo $obj2->private; // Indéfini
echo $obj2->protected; // Erreur fatale
$obj2->printHello(); // Affiche Public, Protected2 et Indéfini
?>
Note: La méthode de déclaration de variable en PHP 4 avec le mot-clé var est toujours supportée pour des raisons de compatibilité (en tant que synonyme du mot-clé public). Avant PHP 5.1.3, son utilisation génère une erreur de niveau E_STRICT.
Les méthodes des classes peuvent être définies en tant que publiques, privées ou protégées. Les méthodes sans déclaration seront automatiquement définies comme étant publiques.
Exemple #2 Déclaration d'une méthode
<?php
/**
* Définition de MyClass
*/
class MyClass
{
// Déclare un contructeur public
public function __construct() { }
// Déclaration d'une méthode publique
public function MyPublic() { }
// Déclaration d'une méthode protégée
protected function MyProtected() { }
// Déclaration d'une méthode privée
private function MyPrivate() { }
// Celle-ci sera publique
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); // Fonctionne
$myclass->MyProtected(); // Erreur fatale
$myclass->MyPrivate(); // Erreur fatale
$myclass->Foo(); // Public, Protected et Private fonctionnent
/**
* Définition de MyClass2
*/
class MyClass2 extends MyClass
{
// Celle-ci sera publique
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // Erreur fatale
}
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // Fonctionne
$myclass2->Foo2(); // Public et Protected fonctionnent, non pas Private
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
?>
Les objets de même type ont un accès aux membres privés et protégés même s'ils ne sont pas dans la même instance. Ceci est dû au fait que les détails spécifiques de l'implémentation sont déjà connus en interne par ces objets.
Exemple #3 Accès aux membres privés d'un type d'objet identique
<?php
class Test
{
private $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
private function bar()
{
echo 'Accès à la méthode privée.';
}
public function baz(Test $other)
{
// Nous pouvons modifier la propriété privée :
$other->foo = 'Bonjour';
var_dump($other->foo);
// Nous pouvons également appeler la méthode privée :
$other->bar();
}
}
$test = new Test('test');
$test->baz(new Test('other'));
?>
L'exemple ci-dessus va afficher :
string(5) "Bonjour" Accès à la méthode privée.