Visibilité

La visibilité d'une propriété ou d'une méthode peut être définie en préfixant sa déclaration avec un mot-clé : public, protected, ou private. Les éléments déclarés comme publics peuvent être utilisés par n'importe quelle partie du programme. L'accès aux éléments protégés est limité à la classe elle-même, ainsi qu'aux classes qui en héritent, et à ses classes parentes. L'accès aux éléments privés est uniquement réservé à la classe qui les a défini.

Visibilité des propriétés

Les propriétés des classes doivent être définies comme publiques, protégées, ou privées. Si une propriété est déclarée en utilisant var, elle sera alors définie comme publique.

Exemple #1 Déclaration de 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 manière de déclarer une variable comme 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). En PHP 5 avant PHP 5.1.3, son utilisation génèrait une erreur de niveau E_STRICT.

Visibilité des méthodes

Les méthodes des classes peuvent être définies comme publiques, privées, ou protégées. Les méthodes déclarées sans explicitement utiliser un mot-clef de visibilité seront automatiquement définies comme publiques.

Exemple #2 Déclaration de méthodes

<?php
/**
 * Définition de MyClass
 */
class MyClass
{
	// Déclare un constructeur public
	public function __construct() { }

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

	// Déclare une méthode protégée
	protected function MyProtected() { }

	// Déclare 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 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
?>

Visibilité depuis d'autres objets

Les objets de mêmes types ont accès aux membres privés et protégés les uns des autres, même s'ils ne sont pas 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 objet du même type

<?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(7) "Bonjour"
Accès à la méthode privée.
LoadingChargement en cours