diff options
Diffstat (limited to 'content/digarden/pages/20210423140526-php.org')
-rw-r--r-- | content/digarden/pages/20210423140526-php.org | 171 |
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 |