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