Переход к PHP5 - Новые уровни доступа private и public

ОГЛАВЛЕНИЕ

Новые уровни доступа private и public

В PHP5 добавлены новые модификаторы уровня доступа для переменных классов. Как и во многих других языках программирования, они носят названия private, protected и public.

Private - самый ограниченничивающий модификатор. Private переменная класса может быть использованна только в классе, в котором объявленна. К ней невозможно обратиться из другого программного кода.

Protected - расширение области private, добавляющее к ней возможность обращаться к переменной из классов-потомков.

Public - расширяющий protected модификатор, задающий наиболее широкую область доступа. К возможности использовать переменную в классах-потомках, добавляется возможность обращаться к переменной непосредственно из другого кода. Строго говоря, public не является новой областью доступа. Ранее в PHP все переменные классов являлись public переменными.

Private переменные используются для алгоритмов, которые используются только в текущем классе и не могут быть переопределенны в классах-потомках. Protected может быть использован, когда организовывается семейство объектов, обладающих сходными алгоритмами и организованных в иерархию. Использование public переменных, обычно, не является хорошей практикой но иногда оправданно. Их можно использовать, если у класса много свойств, которые должны быть доступны всем алгоритмам, использующим этот класс.

Аналогично, private/protected/public мидификаторы применяются к методам класса. Методы, объявленные без модификатора, являются public методами.

Если метод или переменная переопределяются в классе-наследнике, то уровень доступа должен быть таким-же или выше. Например, protected метод в классе-потомке можно сделать public, но нельзя private.

Для примера рассмотрим классы NewClass и NewClass1.

class NewClass {
// new PHP5 modifiers
private $myPrivateVar = 'myPrivateVar';
protected
$myProtectedVar = 'myProtectedVar';
public
$myPublicVar = 'myPublicVar';
// old PHP declaration
var $myVar = 'myVar';
}

class
NewClass1 extends NewClass {
function
getProtectedVar() {
return
$this->myProtectedVar;
}
}

NewClass содержит несколько переменных с разными областями доступа. NewClass1 используется для тестирования областей видимости, связанных с наследованием.

Создаем объекты классов:

$c = new NewClass();
$c1 = new NewClass1();

Обращаемся к переменным:
print $c->myPrivateVar;
Непосредственное обращение к private переменной приводит к ошибке.
print $c->myProtectedVar;
Непосредственное обращение к protected переменной приводит к ошибке.
print $c->myPublicVar;
Обращение к public переменной возвращает её значение.
print $c->myVar;
Обращение к переменной, объявленной в старом стиле, равносильно обращению к public переменной.
print $c1->myPrivateVar;
Private переменная не была унаследованна классом NewClass1. Обращение к ней равнозначно обращению к необъявленной переменной.
print $c1->myProtectedVar;
Protected переменная была унаследованна и непосредственное обращение к ней приводит к ошибке. Для проверки, что она была унаследованна вместе с начальным значением, можно вызвать "print $c1->getProtectedVar();".
print $c1->myPublicVar;
Public переменная была унаследованна и обращение к ней возвращает её значение.