PHP программирование → Переход от php4 к php5 (Дескрипторы Private, Public и Protected. Интерфейсы)
Начало здесь: http://php5.com.ua/blog/php-programming/133.html
В PHP4 все методы и переменные внутри объекта были доступны извне, другими словами все методы и переменные всегда были открытыми. В PHP5 вводится три дескриптора для осуществления контроля над доступом к переменным и методам: Public, Protected и Private.
* Public (открытый): Метод/переменная доступны из любого места в коде.
* Private (закрытый): Закрытые методы или переменные доступны только внутри класса.
* Protected (защищённый): Защищённые методы или переменные доступны только внутри класса, где они были объявлены и из его производных классов.
Пример: Public, protected and private
Совет разработчикам: Переменные класса всегда следует делать закрытыми, прямой доступ к переменным — не очень хорошая практика в ООП, лучше всего для доступа/изменения переменных класса определять специальные методы.
Как вы знаете, PHP4 поддерживает наследование классов синтаксисом «class foo extends parent». В PHP4 И в PHP5 класс может наследовать только один класс, то есть множественное наследование не поддерживается. Интерфейсом называется класс, в котором не реализуется ни один метод, определяются только названия методов и набор передаваемых им параметров. Впоследствии классы могут 'реализовывать' сколь угодно много интерфейсов, показывая тем самым, что тот или иной класс реализует методы, определённые в интерфейсе.
Пример: Интерфейсы
Использование интерфейсов полезно для более удобного чтения и понимания кода: прочитав объявление класса, мы увидим, что класс реализует интерфейсы displayable и printable; это означает, что класс должен иметь методы display() и doprint(). Как эти методы реализованы — значения не имеет, главное — уже из объявления класса, вы знаете, что можете вызывать эти методы.
Продолжение:
http://php5.com.ua/blog/php-programming/135.html
http://php5.com.ua/blog/php-programming/146.html
Дескрипторы Private, Public и Protected
В PHP4 все методы и переменные внутри объекта были доступны извне, другими словами все методы и переменные всегда были открытыми. В PHP5 вводится три дескриптора для осуществления контроля над доступом к переменным и методам: Public, Protected и Private.
* Public (открытый): Метод/переменная доступны из любого места в коде.
* Private (закрытый): Закрытые методы или переменные доступны только внутри класса.
* Protected (защищённый): Защищённые методы или переменные доступны только внутри класса, где они были объявлены и из его производных классов.
Пример: Public, protected and private
<?php
class foo {
private $x;
public function public_foo() {
print("Это открытый метод");
}
protected function protected_foo() {
$this->private_foo(); //Всё правильно, мы можем вызывать закрытые методы, потому что мы находимся в том же классе
print("Это защищённый метод");
}
private function private_foo() {
$this->x = 3;
print("Это закрытый метод");
}
}
class foo2 extends foo {
public function display() {
$this->protected_foo();
$this->public_foo();
// $this->private_foo(); // Неправильно! В базовом классе метод закрыт
}
}
$x = new foo();
$x->public_foo();
//$x->protected_foo(); //Неправильно, защищённые методы могут вызываться только из того же класса или
//его производных классов
//$x->private_foo(); //Неправильно, закрытые методы могут быть вызваны только в классе, где они были объявлены
$x2 = new foo2();
$x2->display();
?>
class foo {
private $x;
public function public_foo() {
print("Это открытый метод");
}
protected function protected_foo() {
$this->private_foo(); //Всё правильно, мы можем вызывать закрытые методы, потому что мы находимся в том же классе
print("Это защищённый метод");
}
private function private_foo() {
$this->x = 3;
print("Это закрытый метод");
}
}
class foo2 extends foo {
public function display() {
$this->protected_foo();
$this->public_foo();
// $this->private_foo(); // Неправильно! В базовом классе метод закрыт
}
}
$x = new foo();
$x->public_foo();
//$x->protected_foo(); //Неправильно, защищённые методы могут вызываться только из того же класса или
//его производных классов
//$x->private_foo(); //Неправильно, закрытые методы могут быть вызваны только в классе, где они были объявлены
$x2 = new foo2();
$x2->display();
?>
Совет разработчикам: Переменные класса всегда следует делать закрытыми, прямой доступ к переменным — не очень хорошая практика в ООП, лучше всего для доступа/изменения переменных класса определять специальные методы.
Интерфейсы
Как вы знаете, PHP4 поддерживает наследование классов синтаксисом «class foo extends parent». В PHP4 И в PHP5 класс может наследовать только один класс, то есть множественное наследование не поддерживается. Интерфейсом называется класс, в котором не реализуется ни один метод, определяются только названия методов и набор передаваемых им параметров. Впоследствии классы могут 'реализовывать' сколь угодно много интерфейсов, показывая тем самым, что тот или иной класс реализует методы, определённые в интерфейсе.
Пример: Интерфейсы
<?php
interface displayable {
function display();
}
interface printable {
function doprint();
}
class foo implements displayable,printable {
function display() {
// код
}
function doprint() {
// код
}
}
?>
interface displayable {
function display();
}
interface printable {
function doprint();
}
class foo implements displayable,printable {
function display() {
// код
}
function doprint() {
// код
}
}
?>
Использование интерфейсов полезно для более удобного чтения и понимания кода: прочитав объявление класса, мы увидим, что класс реализует интерфейсы displayable и printable; это означает, что класс должен иметь методы display() и doprint(). Как эти методы реализованы — значения не имеет, главное — уже из объявления класса, вы знаете, что можете вызывать эти методы.
Продолжение:
http://php5.com.ua/blog/php-programming/135.html
http://php5.com.ua/blog/php-programming/146.html



