1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
:PROPERTIES:
:ID: 6e29e344-2375-49a7-8ca5-234d24a57bc5
:END:
#+title: PHP
* PHP
[[https://www.php.net/manual/en/types.comparisons.php][Таблица истинности]]
** Плюсы PHP:
- Проверки типов в рантайме (в отличии от Python)
- Заточенность под быструю скорость выполнения (JIT в мастер)
- Хорошая документация, доступная в частности на русском языке
- var_dump выводит много полезной информации
- Есть трационное ООП (почти как в Java)
- Есть этап компиляции с оптимизацией
- Поддерживается LSP (Liskov Substitute Principle) прямо в языке
- Поддерживается в Emacs в какой-то мере
- Нормальная поддржка Float'ов. Будет правильно считать 0.1 + 0.2
- Копирование значение, а не ссылки. Наличие оператора & для обращения к "ссылке" переменной.
** Минусы PHP:
- Нельзя инициализировать значения поля в классе. Это ведёт к мусору
вроде $this->param = new ArrayCollection();
- Глобальная конфигурация, которая влияет на поведение
- Неочевидное поведение
#+begin_src PHP
!($a instanceof stdClass)
# is equals to not clear
!$class instanceof someClass
#+end_src
- Расширения, которые влияют на поведение
- Нельзя изменять встроенные функции
- Сообщество обожает ООП, но в стандартной библиотеке только процедуры
- Стандартная библиотека не разбита на неймспейсы, доступно сразу около
5-6 тыся функций
- Странный нейминг
- Можно в функцию без аргументов прокинуть сколько угодно аргументов без
ошибки. Все остальные языки кроме Си этого не позволяют сделать (даже
C++).
- Сложно переопределять поведение библиотек. Есть рефлексия, но скажем,
чтобы поменять что-то в vendor через рефлексию возникнут сложности. В
языках вроде ruby и python есть конфигурация на этом же языке
программирования, где можно проводить разные манипуляции. В PHP нету
конфигурации на PHP, чтобы делать что-то до запуска программы.
- Нельзя указать тип присваевоемой переменной, что ведёт к потенциальным
ошибкам. Например мы можем в рантайме поменять переменную на другой
тип и IDE ничего не подскажет, а ошибка случится только во времени
исполнения, а не компиляции. С хорошим выводов типов, этого бы не было
(SML, Ocaml).
#+begin_src php
<?php
declare(strict_types=1);
$test = "string";
function test_func(string $var, callable $func): string
{
$func();
return $var;
}
var_dump(test_func($test, function() use (&$test) {
$test = 42;
}));
var_dump($test);
var_dump(test_func($test));
#+end_src
** Полезные библиотеки
- https://github.com/sebastiaanluca/php-pipe-operator/
- https://github.com/php-toolkit/stdlib
** Сниппеты
*** Создание объекта без класса
#+begin_src php
$object = new stdClass();
$object->property = 'I am an object\'s property';
#+end_src
#+begin_src php
#php 7.x
$place = ['city' => 'Pokhara', 'country' =>'Nepal'];
$obj = (object) $place;
#+end_src
*** Поддержка LSP
#+begin_src php
class Base { public function foo(int $a): int { return $a * $a; } }
class Extend extends Base { public function foo(): int { return 42; } }
# <warning>PHP Warning: Declaration of Extend::foo(): int should be
# compatible with Base::foo(int $a): int in /home/w96k/.configeval()'d
# code on line 3</warning>
#+end_src
#+begin_src java
class Base {
public int foo(int a) {
return a * a;
}
}
class Extend extends Base {
public int foo() {
return 42;
}
}
(new Extend()).foo(); # => 42
# works just fine with violating Liskov Substitute Principle
#+end_src
** Минусы PHP:
- Страшный синтаксис, смесь Perl, Bash и Java
- Мало реализаций
- Стандарт появился совсем недавно (в 2016м году)
- Множество скрытых ошибок (об этом ниже)
- ЫНТЫРПРАЙЗ (курсы, вебинары, подкасты, спонсоры, сертификации и другой
развод на доллары) повсюду АКА создан жидами
- Платный тулинг (PHPstorm, платный LSP-сервер)
- Непонятные ошибки
- Нельзя инициализировать экземпляры класса в определении класса (public $tear = new Tear())
- Хоть в языке и наяривают на ООП стандартная библиотека максимально процедурна
- Есть goto
- Странно работает тернарный оператор
- Подстановка переменных как в bash ($test = 'meow' $$test = 'the name of var is meow')
- ~True == 1 и False == 0~ при нестрогом сравнении (в питоне также)
- Нет docstring
- В версиях до 8.0 нет аннотаций
- Библиотеки реализуют то, что должно быть в стандартной библиотеки (класс String и т.д.)
- Нет Pipe оператора
- Нет макросов
- Нет способа создавать объект без класса (синглтон)
- Страшные массивы-хеши, какая-то муть с типами данных
- Нет проверки типов в compile-time
- Слабая типизация
Если зайти в repl ~php -a~ и нажать таб, то предложит 4618 дополнений,
что невероятно много.
Ссылки на критику:
- https://tnx.nl/php.html
[[http://phptherightway.ru][PHP: Правильный путь]]
[[https://docstore.mik.ua/orelly/webprog/php/index.htm][Programming PHP]]
*Фреймворки*:
- [[id:71d88c28-b79f-47cc-b5ec-7439fcff5f7f][Symfony]]
*Видео*:
- [[https://youtube.com/watch?v=joL__9t6E_s][Nikita Popov - PHP Language Trivia]]
- [[https://youtube.com/watch?v=JBWgvUrb-q8][Nikita Popov – PHP Performance Trivia]]
- [[https://www.youtube.com/playlist?list=PLr3d3QYzkw2xabQRUpcZ_IBk9W50M9pe-][Learn PHP The Right Way - Full PHP Tutorial]]
*Статьи:*
- http://blogerator.org/page/php-7-kritikujte-dalshe-a-my-budem-rabotat-stogov
- http://blogerator.org/page/2012-php-core-team-intervju-zmievskij-malyshev-alshanetskij-eksperty-sravnenie
- [[https://habr.com/ru/company/skyeng/blog/666626/][Как прокачаться в PHP: 70 ресурсов]]
*Блоги:*
- https://tomasvotruba.com/blog
*Книги*:
- [[https://www.amazon.com/dp/067232704X][Extending and Embedding PHP]]
** Окружение
*** Дебаггер
https://emacs-lsp.github.io/lsp-mode/tutorials/php-guide/
|