Инструменты пользователя

Инструменты сайта


klassy_i_obekty

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

klassy_i_obekty [2015/06/24 21:58] (текущий)
Строка 1: Строка 1:
 +====== Классы и объекты PHP ======
 +  * [[ООП]]
 +  * [[http://​www.php.net/​manual/​ru/​language.oop5.php|PHP Manual: Классы и объекты]]
 +  * [[Стандарты кодирования]]:​ правила наименования классов,​ PHP_CodeSniffer и т.д..
 +  * [[Файл инициализации приложения]]. Автоматическая загрузка классов.
 +<​note>​Имя класса в PHP регистрозависимо.</​note>​
 +<​note>​Объекты всегда передаются в функцию по ссылке.</​note>​
 +  * Различия между передачей по ссылке объектов и обычных переменных в PHP версий 5.x.<​file php>
 +$var1 = 10;
 +// $var2 - копия текущего состояния переменной $var1
 +$var2 = $var1;
 +// $var3 - жесткая ссылка на $var1, дальнейшее изменение значения одной из
 +// них отразится на значении второй
 +$var3 = &$var1;
  
 +$obj1 = new MyClass();
 +$obj2 = clone $obj1; // $obj2 - копия текущего состояния $obj1
 +$obj3 = $obj1;​  ​    // $obj3 - жесткая ссылка на $obj1
 +</​file>​
 +====== $this,​parent,​self,::​ ======
 +  * **$this** - это псевдопеременная,​ указывающая на объект класса (ссылка на вызываемый объект),​ она доступна в том случае,​ если метод был вызван в контексте объекта и вы хотите указать,​ что работаете с локальным свойством текущего объекта. Обычно это тот объект,​ которому принадлежит вызванный метод, но может быть и другой объект,​ если метод был вызван статически из контекста другого объекта. Если вы не создаете объектов класса,​ ваш класс статический,​ переменная ​ работать $this не будет. При проектировании методов,​ которые обращаются к внутренним членам(методам) класса,​ необходимо следить за тем, что к членам(методам) класса следует обращаться через префикс $this, а при обращении к параметрам метода данный пре­фикс не требуется. В большинстве случаев интерпретатор РНР не сообщит о наличии ошибок,​ если при обращении к внутреннему члену класса не ис­пользуется префикс $this, а при обращении к параметру метода префикс $this используется. При этом будет создана новая переменная с нулевым значением . Эта ошибка очень распространена и связана с фундаментальной особенностью РНР - отсутствием типизации:​ использование переменной с любым именем приводит к созданию переменной с этим именем. **К статическим членам класса нельзя обращаться через $this**.
 +  * Ключевое слово **parent** используется для обращения только к родительским членам. Если дочерний класс замещает родительский метод, то родительскую версию можно вызвать только так.
 +  * **Оператор области видимости (scope resolution) ::** (два двоеточия рядом) используется для доступа к статическим или переопределенным методам класса,​ например для вызова конструктора класса-родителя из класса-потомка<​file>​
 +parent::​__construct()
 +</​file>​
 +  * Ключевое слово **self** - указатель на сам класс, в отличии от $this, который является указателем на объект класса. Методы класса не видят других членов класса. Для обращения к членам своего класса,​ включая наследуемые,​ используется ключевое слово self.
 +        * Обращение к статическому методу или свойству в классе:​ **self::​method()**
 +        * Обращение к статическому методу или свойству из вне класса:​ **ClassName::​method()**
 +
 +====== Специальные методы класса ======
 +  * [[http://​sevidi.ru/​webd/​dweb/​phppage22.php|Специальные методы класса]]
 +
 +Специальные методы класса:​ construct(),​ destruct(), clone() и т.д. Каждый специальный метод предваряется двумя символами подчеркивания.
 +  * Клонирование объектов в PHP 5 происходит при помощи ключевого слова clone. При клонировании конструктор НЕ вызывается,​ но если нужно при клонировании использовать конструктор - описывается метод clone(). Пример клонирования:​ **car2 = clone car1;**, если написать так **car2 = car1;** в этом случае car2 будет просто ссылкой на car1.
 +
 +
 +
 +====== Функции для работы с методами и классами ======
 +  * [[http://​php.net/​manual/​ru/​function.get-class-methods.php|get_class_medhods($class_name)]] - Возвращает массив с именами методов класса $class_name.<​file>​
 +$class_methods = get_class_methods(new MyClass());
 +print_r($class_methods);​
 +</​file>​
 +
 +====== Примеры ======
 +  * **Счетчик объектов**<​file php>
 +<?php
 +
 +error_reporting(E_ALL & ~E_NOTICE);
 +
 +class counter {
 +
 +    public static $count = 0;
 +
 +    public function __construct() {
 +        self::​$count++;​ // идентично counter::​$count++;​
 +    }
 +
 +    public function __destruct() {
 +        self::​$count--;​ // идентично counter::​$count--;​
 +    }
 +
 +}
 +
 +$obj = new counter();
 +echo counter::​$count . "​\n";​ // 1
 +
 +for ($i = 0; $i < 3; $i++) {
 +    $arr[] = new counter();
 +    echo counter::​$count . "​\n";​ // 2, 3, 4
 +}
 +
 +unset($arr);​ // уничтожение массива объктов
 +echo counter::​$count . "​\n";​ // 1
 +?>
 +</​file>​
klassy_i_obekty.txt · Последние изменения: 2015/06/24 21:58 (внешнее изменение)