Приватные, защищенные и публичные свойства и методы
Краткое описание
Свойства
В PHP5 появились приватные и защищенные свойства, которые позволяют определить область их видимости. Приватные свойства доступны только в том классе, в котором они определены, в то время как защищенные доступны во всех классах наследованных от того, где свойство определено. Публичные свойства доступны из любой области видимости. Приватные, защищенные и публичные свойства свойства определяются с использованием ключевых слов private, protected и public, соответственно, перед именем свойства. Свойства, определяемые ранее ключевым словом var, являются публичными, т.е. var является синонимом public. Однако var является устаревшим.
Пример:
<?php
class MyClass {
private $private = 'приватное';
protected $protected = 'защищенное';
public $public = 'публичное';
function printOut() {
echo 'MyClass::printOut() ' . $this->private . "\n";
echo 'MyClass::printOut() ' . $this->protected . "\n";
echo 'MyClass::printOut() ' . $this->public . "\n";
}
}
class MyClass2 extends MyClass {
protected $protected = 'защищенное2';
function printOut() {
parent::printOut();
echo 'MyClass2::printOut() ' . $this->private . "\n";
echo 'MyClass2::printOut() ' . $this->protected . "\n";
echo 'MyClass2::printOut() ' . $this->public . "\n";
}
}
$o = new MyClass();
//echo $o->private . "\n"; // Fatal error: Cannot access private property MyClass::$private
//echo $o->protected . "\n"; // Fatal error: Cannot access protected property MyClass::$protected
echo $o->public . "\n";
$o->printOut();
$o = new MyClass2();
echo $o->private . "\n";
//echo $o->protected . "\n"; // Fatal error: Cannot access protected property MyClass2::$protected
echo $o->public . "\n";
$o->printOut();
?>
Результат:
Методы
Вместе с приватными и защищенными свойствами в PHP5 также появились приватные и защищенные методы. Они определяются с использованием ключевых слов private и protected перед ключевым словом function. Публичные методы определяются, либо ключевым словом public, либо вообще без такового перед function.
Пример:
<?php
class Foo {
private function aPrivateMethod() {
echo "Foo::aPrivateMethod() вызван.\n";
}
protected function aProtectedMethod() {
echo "Foo::aProtectedMethod() вызван.\n";
$this->aPrivateMethod();
}
}
class Bar extends Foo {
public function aPublicMethod() {
echo "Bar::aPublicMethod() вызван.\n";
$this->aProtectedMethod();
}
}
$o = new Bar();
//$o->aPrivateMethod(); // Fatal error: Call to private method Foo::aPrivateMethod() from context ''
//$o->aProtectedMethod(); // Fatal error: Call to protected method Foo::aProtectedMethod() from context ''
$o->aPublicMethod();
?>
Результат:
Проблемы с обратной совместимостью
Старый код без пользовательских функций, методов или классов с именами public, protected или private должен работать без изменений.
Дополнительные сведения
Описание в оригинальной документации:
http://www.php.net/oop5.visibility