Table of Contents

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

Фреймворки:

Видео:

Статьи:

Книги:

Окружение

w96k Ⓐ 2019-2022

2023-01-26 Thu 17:55