Подтвердить что ты не робот

Можно ли написать строго типизированный PHP-код?

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

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

И можно ли определить такие функции:

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

Ответ 1

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


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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

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

а обнаруженные ошибки и скрытые ситуации и т.д. не поддаются объяснению.

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

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

Ответ 5

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

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

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

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

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

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

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

Update:

Там также: http://hacklang.org/ Язык PHP на основе PHP со статической типизацией.

Ответ 6

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

  • строка
  • integer, int
  • float, double
  • boolean, bool
  • ресурс

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

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

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

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

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