Различия

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


klassy_i_obekty [2021/07/31 21:58] (текущий) – создано - внешнее изменение 127.0.0.1
Строка 1: Строка 1:
 +====== Классы и объекты PHP ======
 +После выхода PHP5 поддержка [[ООП]] в [[PHP|PHP]] стала практически полной.
  
 +  * [[https://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>

📌 Удобный подбор VPS по параметрам доступен на DIEGfinder.com - официальном инструменте проекта DIEG. Это часть единой экосистемы, созданной для того, чтобы помочь быстро найти подходящий VPS/VDS сервер для любых задач хостинга.

📌 Для тестирования скриптов, установщиков VPN и Python-ботов рекомендуем использовать надежные VPS на короткий срок. Подробнее о быстрой аренде VPS для экспериментов - читайте здесь.

💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!