Видимостта на свойство или метод може да бъде дефинирана, чрез използване на ключовите думи public (общодостъпен), protected (защитен) или private (частен). Полетата декларирани като public са достъпни от всякъде. Полетата protected могат да бъдат достъпни от дъщерните и родителските класове (и в класа, в който са дефинирани). Private позволява достъпа само от тялото на класа, в който е дефинирано полето.
Свойствата на даден клас трябва да бъдат декларирани като public, private или protected.
Example #1 Декларация на свойство
<?php
/**
* Дефиниция на 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; // Работи
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Извежда Public, Protected и Private
/**
* Дефиниция на MyClass2
*/
class MyClass2 extends MyClass
{
// Може да се дефинират повторно public и protected методи, но не и private
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // Работи
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Извежда Public, Protected2, Undefined
?>
Забележка: Ключавата дума var все още се поддържа от съображения за съвместимост (като синоним на ключовата дума public). В PHP 5 преди 5.1.3 употребата й ще генерира предупреждение от тип E_STRICT.
Методите на даден клас трябва да бъдат декларирани като public, private или protected. Методи без такава декларация ще бъдат дефинирани като public.
Example #2 Декларация на методи
<?php
/**
* Дефиниция на MyClass
*/
class MyClass
{
// Деклариране на public конструктор
public function __construct() { }
// Деклариране на public метод
public function MyPublic() { }
// Деклариране на protected метод
protected function MyProtected() { }
// Деклариране на private метод
private function MyPrivate() { }
// public метод
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); // Работи
$myclass->MyProtected(); // Fatal Error
$myclass->MyPrivate(); // Fatal Error
$myclass->Foo(); // Извикват се Public, Protected и Private
/**
* Дефиниция на MyClass2
*/
class MyClass2 extends MyClass
{
// public метод
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // Fatal Error
}
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // Works
$myclass2->Foo2(); // Извикват се Public и Protected, но не и 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
?>