Можно ли написать строго типизированный код PHP? - PullRequest
26 голосов
/ 03 октября 2009

Например, можно ли написать код, подобный этому:

int $x = 6;
str $y = "hello world";
bool $z = false;
MyObject $foo = new MyObject();

И можно ли определить функции следующим образом:

public int function getBalance()
{
   return 555; //Or any numeric value
}

Ответы [ 9 ]

51 голосов
/ 30 апреля 2015

В PHP 7 реализованы "Скалярные объявления типов", например ::100100

public function getBalance(): int {
    return 555;
}

Вам нужно заявить, что вы будете использовать строгие типы:

<?php
    declare(strict_types=1);

    function sum(int $a, int $b): int {
        return $a + $b;
    }

    sum(1, 2);
?>

Дополнительная информация: https://wiki.php.net/rfc/scalar_type_hints_v5

18 голосов
/ 03 октября 2009

Редактировать: Этот ответ относится к версиям PHP 5.6 и более ранним. Как отмечалось в последних ответах, версия PHP 7.0 и более поздние имеют некоторую поддержку для этого


Оригинальный ответ:

Нет. Начиная с php5, поддерживается только подсказка типа , но «подсказки типа могут быть только объектного и массивного типа (начиная с PHP 5.1). Подсказка традиционного типа с помощью int и string не поддерживается».

В PHP 7 реализованы «Скалярные объявления типов», см. Ответ ниже.

Это все, что касается php в настоящее время, и насколько это должно быть, если вы спросите меня.

10 голосов
/ 03 октября 2009

PHP не является строго типизированным, поэтому нет. Тем не менее, он поддерживает ограниченный тип подсказок для функций - это настолько близко, насколько это возможно.

5 голосов
/ 11 апреля 2013

К сожалению НЕТ! Сейчас я нахожусь в конце большого проекта, в котором задействовано много алгоритмов (теория графов, схемы и т. Д.), И мне бы хотелось, чтобы я не выбрал php.

Я использую php около 10 лет, и до сих пор считаю, что это хороший язык, однако решать нужно! Что плохо для меня, отсутствие строгой типизации может быть полезно для кого-то еще.

Кроме того, я хочу отметить, что я часто писал дополнительный код для поддержки строгой типизации, просто простой пример:

if (is_array($r) && count($r)===0)

и выявленные ошибки, скрытые ситуации и т. Д. Не поддаются объяснению.

Были ошибки и ситуации, которые я никогда бы не смог придумать / обнаружить априори, писать весь этот дополнительный код не доставляло удовольствия, но по крайней мере это спасло бы меня от глупых ошибок!

Если бы я вернулся, может быть, я бы выбрал php для веб-части, вы знаете, как получать и показывать данные пользователю, php просто отлично подходит для этого, обрабатывает строки, массивы, обращается к базе данных и т. Д., Но для основное ядро, алгоритмы и т. д. Я бы пошел на C ++, может быть, Haskell ... не знаю, по крайней мере, что-то строго типизированное.

3 голосов
/ 21 ноября 2014

Возможно, вам стоит попробовать это расширение PHP https://github.com/krakjoe/strict. Введена поддержка следующих типов:

  • строка
  • целое число, int
  • float, double
  • логическое, bool
  • Ресурс
3 голосов
/ 08 марта 2014

Что-то, что вы можете попробовать для симуляции строгой проверки типов бедного человека, - это использовать assert (), чтобы заставить вывод иметь определенный тип, прежде чем вы его вернете:

/**
 * Get Balance
 *
 * @return int
 */
function getBalance()
{
    /* blah blah blah */
   $out = 555; //Or any numeric value
   assert('is_int($out)');
   return $out;
}

Таким образом, вы сохраняете свои утверждения активными на протяжении всей разработки и тестирования, что-то вроде тех проверок, которые компилятор выполняет во время компиляции.

Конечно, страница assert () стремится утверждать, что вам не следует использовать утверждения для проверки входных параметров, а вместо этого использовать обычные условия для их проверки.

Этот ответ имел то, что я считал хорошим правилом:

Эмпирическое правило, которое применимо к большинству языков (все, что я смутно знаю), заключается в том, что утверждение используется для подтверждения того, что условие всегда истинно, тогда как if уместно, если возможно, что оно иногда не будет выполнено.

Если вы симулируете строгую проверку типов (пишете свой код для злобного ведения типов; не пытаетесь проверять ввод извне), то вы должны быть уверены, что это за тип, если только вы не допустили ошибку.

Обновление:

Также есть: http://hacklang.org/ PHP-язык Facebook со статической типизацией.

2 голосов
/ 03 октября 2009

Поскольку ответ в основном «нет», альтернатива: PHP «linter», который должен отлавливать некоторые вещи, которые проверка во время компиляции могла бы отследить в статически типизированном языке, таком как C. Не то же самое, но следует предотвратить глупость

«Есть ли статический анализатор кода [например, Lint] для файлов PHP» перечисляет многие из них.

1 голос
/ 11 декабря 2016

Вы можете использовать h2tp transpiler для передачи HACK-кода в PHP:

Вы можете сделать это благодаря команде Facebook и HACK Language .

Посетите http://hacklang.org и http://hhvm.com для получения дополнительной информации.

Если вы хотите кодировать напрямую в среде Hack + HHVM, вы также можете использовать внутреннюю среду IDE Facebook Nuclide

1 голос
/ 03 октября 2009

Нет. Этот синтаксис не будет работать.

Теоретически вы могли бы придумать систему объектов, которая навязывала бы их строгую типизацию, но она не работала бы и ... в любом случае, почему вы хотите?

Если вам нужна строгая типизация, используйте строго типизированный язык.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...