Oop php

x
 
1
                                <?php
2
3
/* При обращение к классу в самом классе пишем $this
4
Методы классов это функциии */
5
6
class Index extends Page
7
{ // Класс Index наследует класс Page
8
9
    public function __construct($t, $s) { /* Переопределение метода. Метод construct наследует метод construct из класса Page, далее добавляю $s */
10
        parent::__construct($t);
11
        $this->slide = $s;
12
    }
13
    /* Метод обычно что-то возвращает с помощью return */
14
}
15
16
class Poly
17
{
18
    public $ob;
19
    public function get_ob(Page $var) { // (Page $var) эта запись означает в классе Page переменная var
20
        $this->ob[] = $var;
21
    }
22
23
    // В статичном методе создать экземпляр класса
24
    public static function test() {
25
        $self = new self();
26
    }
27
}
28
29
/* Сначала создать класс, затем методы, ниже создать объекты */
30
31
$poly = new poly(); /* новый объект poly или $poly = new $pol; */
32
$poly->get(); /* вызываем метод */
33
34
35
class Page
36
{
37
    // Свойство класса
38
    public $header = 'HEADER';
39
    public $content;
40
    public $footer;
41
42
    // Метод класса
43
    public function view_hearder($var1, $var2)
44
    {
45
        echo $this->hearder.'<br>'.$var1.$var2;
46
    }
47
48
    function __autoload($var)
49
    { // Подключение множество файлов из папки classes
50
        include 'classes/' . $var . '.php'; // В переменную var попадает имя класса, объект которого создаём
51
    }
52
53
class Page
54
{
55
56
    const NUMBER = 1; // Костанта — не изменяемая, знак $ не ставим и вместо $this пишем self::NUMBER;
57
    public $a = 'public'; // Открытый спецификатор доступа
58
    protected $_b = 'protected'; // Закрытый спецификатор доступа, только из класса и наследников, в название нижние подчёркивание
59
    private $_c = 'private'; // Закрытый спецификатор доступа, только внутри класса, в название нижние подчёркивание
60
61
}
62
63
$page = new Page(); // Создать объяект
64
65
echo Page::NUMBER; // Вывести NUMBER
66
67
interface IUser
68
{ // Абстракные методы, которые только наследуются и переопределяются
69
    public function get_user();
70
}
71
abstract class AUser implements IUser
72
{ // Обязательно наследование interface
73
}
74
// Абстрактный класс - нельзя создать объект
75
// Абстрактный метод - в классе наследнике необходимо создать этот метод
76
77
78
// Если наследуются два класса, то пишем через запятую
79
80
class User
81
{ // final финальные классы не наследуют
82
    public $name;
83
    public function __construct($name){
84
        $this->name = $name;
85
    }
86
    public function __clone()
87
    { // Вызывается в момент клонированя объектов
88
        echo 'CLONE OBJECT';
89
    }
90
    final protected function can()
91
    { // Финальные методы запрещенно переопределять в дочерних классах
92
        // code
93
    }
94
}
95
96
$user = new User('Victor');
97
98
if ($User instanceof User) { // Принадлежит ли объект к классу
99
    if ($User instanceof Customer) { // или к родителям класса
100
        echo 'is Customer';
101
    } else {
102
        echo 'is User';
103
    }
104
}
105
106
$user2 clone $user; // Клонирование объектов
107
108
echo $user2->name;
109
110
// Магические методы
111
__construct() // метод при создание класса
112
__destruct() // метод при удаление класса
113
__clone() // метод при клонирование класса
114
__set($name, $value) // метод не существуещего свойства класса
115
__get($name) // метод выводит не существуещее свойства класса
116
__call() // метод при обращение к не существующим методам
117
__tostring() // метод приводит объект в строку, можно вывести через echo
118
119
120
// В объекте создать любое свойство и получать его, для этого в классе или в трайте пишем:
121
protected $data;
122
public function __set($name, $value)
123
{
124
    $this->data[$name] = $value;
125
}
126
public function __get($name)
127
{
128
    return $this->data[$name] ?? null;
129
}
130
// Задаём и получаем свойство
131
$user = new \app\classes\User();
132
$user->display = 'New';
133
dump($user->display);
134
135
136
Позднее статическое связывание - вызов метода в контексте текущего класса.
137
Вместо self использовать static, тогда в классе наследнике можно переопределить свойство (переменную).
138
139
// Документация
140
/**
141
 *
142
 * @return int Сумма двух чисел.
143
 *
144
 * @property \App\Config $config Свойства у объектов или переменные
145
 *
146
 * @deprecated Устаревший метод.
147
 */
148
149
Инкапсуляция. Скрытие внутреннего состояния и функций объекта и предоставление доступа только через открытый набор функций.
150
Инкапсуляция это сокрытие данных и функциональности от клиентского кода.
151
Наследование. Возможность создания новых абстракций на основе существующих.
152
Полиморфизм. Возможность реализации наследуемых свойств или методов отличающимися способами в рамках множества абстракций.
153
Полиморфизм это поддержка нескольких реализаций на основе общего интерфейса.
154
Абстракция. Моделирование требуемых атрибутов и взаимодействий сущностей в виде классов для определения абстрактного представления системы.
155
156
private, protected, public - модификаторы видимости.
157
158
Namespace - это механизм использование класса через пространство имен
159
160
Магические методы - это специальные методы, которые переопределяют действие PHP по умолчанию, когда над объектом выполняются определённые действия.
161
construct(), destruct(), call(), callStatic(), get(), set(), isset(), unset(), sleep(), wakeup(), serialize(), unserialize(), toString(), invoke(), set_state(), clone() и __debugInfo()
162
163
Трейт - это механизм обеспечения повторного использования кода в языках с поддержкой только одиночного наследования, таких как PHP. Трейт предназначен для уменьшения некоторых ограничений одиночного наследования, позволяя разработчику повторно использовать наборы методов свободно, в нескольких независимых классах и реализованных с использованием разных архитектур построения классов. При использовании нескольких трейтов с одинаковыми методами, возникает конфликт. Разрешение конфликта производится с помощью оператора insteadOf. Так же если у дочернего класса есть такой же переопределенный метод как и у базового, и стаким же именем есть у трейта, порядок вызова следующий: вызов дочернего метода, вызов метода трейта, вызов у родительского класса. Доступны частные методы trait в классе. Можно компоновать traits в trait.
164
165
Абстракный класс - нельзя создать объект.
166
Абстракный метод - обязательно реализовать в классам наследниках.
167
Абстрактный класс похож на обычный, но отличается тем, что может содержать абстрактные методы  методы без реализации, и нельзя создать экземпляр абстрактного класса. Так же интерфейсы имплементируются, а от абстрактных классов наследуются.
168
Абстрактный класс может содержать частный метод.
169
170
Интерфейс - не имеет реализации, это контракт на который мы подписываем класс, множественное наследование.
171
Абстарктный тип данных, который определяет контракты по которым обязуются реализовать методы в классах, которые их имплементируют.
172
На практике интерфейсы содержат определения функций (то есть описание их сигнатур) без их реализации.
173
174
Позднее статическое связывание
175
PHP реализует функцию, называемую позднее статическое связывание, которая может быть использована для того, чтобы получить ссылку на вызываемый класс в контексте статического наследования.
176
static - для конкретного класса, т.е. для потомков.
177
self - внутри класса.
178
179