summaryrefslogtreecommitdiff
path: root/content/digarden/pages/20210423140526-php.org
diff options
context:
space:
mode:
Diffstat (limited to 'content/digarden/pages/20210423140526-php.org')
-rw-r--r--content/digarden/pages/20210423140526-php.org171
1 files changed, 171 insertions, 0 deletions
diff --git a/content/digarden/pages/20210423140526-php.org b/content/digarden/pages/20210423140526-php.org
new file mode 100644
index 0000000..fcb0075
--- /dev/null
+++ b/content/digarden/pages/20210423140526-php.org
@@ -0,0 +1,171 @@
+: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/ \ No newline at end of file