source: at-w96k/content/digarden/20210423140526-php.org@ d1d01c6

Last change on this file since d1d01c6 was d1d01c6, checked in by w96k <w96k@…>, on Apr 2, 2023 at 3:20:19 PM

Update blog

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