Видимост на полета

Видимостта на свойство или метод може да бъде дефинирана, чрез използване на ключовите думи public, protected или private. Полетата декларирани като public са достъпни от всякъде. Protected полетата могат да бъдат достъпни от дъщерните и родителските класове (и в класа в които са дефинирани). Private позволява достъпа само от тялото на класа в който е дефинирано полето.

Видимост на свойствата

Свойствата на даден клас, трябва да бъдат декларирани като public, private или protected.

Пример 19-9. Декларация на свойство

<?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 $obj->public; // Работи
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Извежда Public, Protected2, но не и Private

?>

Забележка: Ключавата дума var все още се поддържа, поради съображения за съвместимост (като синоним на ключовата дума public). В PHP 5 преди 5.1.3 употребата и ще генерира предупреждение от тип E_STRICT.

Видимост на методи

Методите на даден клас, трябва да бъдат декларирани като public, private или protected. Методи, без такава декларация ще бъдат дефинирани като public.

Пример 19-10. Декларация на методи

<?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
?>