→

PHP программирование →  Переход от php4 к php5 (Дескрипторы Private, Public и Protected. Интерфейсы)

Начало здесь: http://php5.com.ua/blog/php-programming/133.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();
?>


Совет разработчикам: Переменные класса всегда следует делать закрытыми, прямой доступ к переменным — не очень хорошая практика в ООП, лучше всего для доступа/изменения переменных класса определять специальные методы.

Интерфейсы



Как вы знаете, 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() {
    // код
  }
}
?>


Использование интерфейсов полезно для более удобного чтения и понимания кода: прочитав объявление класса, мы увидим, что класс реализует интерфейсы displayable и printable; это означает, что класс должен иметь методы display() и doprint(). Как эти методы реализованы — значения не имеет, главное — уже из объявления класса, вы знаете, что можете вызывать эти методы.

Продолжение:
http://php5.com.ua/blog/php-programming/135.html
http://php5.com.ua/blog/php-programming/146.html
2