Переход к 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 переменная была унаследованна и обращение к ней возвращает её значение.