source: content/digarden/pages/20210423140526-php.org@ 972a737

Last change on this file since 972a737 was 972a737, checked in by w96k <w96k@…>, on Apr 16, 2023 at 5:54:55 PM

Add logseq

  • 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
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*** Дебаггер
171https://emacs-lsp.github.io/lsp-mode/tutorials/php-guide/
Note: See TracBrowser for help on using the repository browser.