PHP
Плюсы PHP:
- Проверки типов в рантайме (в отличии от Python)
- Заточенность под быструю скорость выполнения (JIT в мастер)
- Хорошая документация, доступная в частности на русском языке
- var_dump выводит много полезной информации
- Есть трационное ООП (почти как в Java)
- Есть этап компиляции с оптимизацией
- Поддерживается LSP (Liskov Substitute Principle) прямо в языке
- Поддерживается в Emacs в какой-то мере
- Нормальная поддржка Float'ов. Будет правильно считать 0.1 + 0.2
- Копирование значение, а не ссылки. Наличие оператора & для обращения к "ссылке" переменной.
Минусы PHP:
- Нельзя инициализировать значения поля в классе. Это ведёт к мусору вроде $this->param = new ArrayCollection();
- Глобальная конфигурация, которая влияет на поведение
- Неочевидное поведение
!($a instanceof stdClass) # is equals to not clear !$class instanceof someClass
- Расширения, которые влияют на поведение
- Нельзя изменять встроенные функции
- Сообщество обожает ООП, но в стандартной библиотеке только процедуры
- Стандартная библиотека не разбита на неймспейсы, доступно сразу около 5-6 тыся функций
- Странный нейминг
- Можно в функцию без аргументов прокинуть сколько угодно аргументов без ошибки. Все остальные языки кроме Си этого не позволяют сделать (даже C++).
- Сложно переопределять поведение библиотек. Есть рефлексия, но скажем, чтобы поменять что-то в vendor через рефлексию возникнут сложности. В языках вроде ruby и python есть конфигурация на этом же языке программирования, где можно проводить разные манипуляции. В PHP нету конфигурации на PHP, чтобы делать что-то до запуска программы.
- Нельзя указать тип присваевоемой переменной, что ведёт к потенциальным ошибкам. Например мы можем в рантайме поменять переменную на другой тип и IDE ничего не подскажет, а ошибка случится только во времени исполнения, а не компиляции. С хорошим выводов типов, этого бы не было (SML, Ocaml).
<?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));
Полезные библиотеки
Сниппеты
Создание объекта без класса
$object = new stdClass(); $object->property = 'I am an object\'s property';
#php 7.x $place = ['city' => 'Pokhara', 'country' =>'Nepal']; $obj = (object) $place;
Поддержка LSP
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>
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
Минусы 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 дополнений,
что невероятно много.
Ссылки на критику:
PHP: Правильный путь Programming PHP
Фреймворки:
Видео:
- Nikita Popov - PHP Language Trivia
- Nikita Popov – PHP Performance Trivia
- 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
- Как прокачаться в PHP: 70 ресурсов
Книги: