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