Можно ли написать строго типизированный 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
}
 21
Author: Click Upvote, 2009-10-03

9 answers

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


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

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

.

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

 17
Author: code_burgar, 2017-11-03 11:29:37

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

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

 44
Author: Antonín Slejška, 2015-04-30 12:38:15

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

 9
Author: Alex Barrett, 2009-10-02 23:37:07

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

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

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

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

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

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

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

 4
Author: Melsi, 2013-07-10 00:03:55

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

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

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

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

В этом ответе было то, что я считал хорошим правилом:

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

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

Обновление:

Есть еще вот что: http://hacklang.org / Язык Facebook на основе PHP со статической типизацией.

 2
Author: Caleb Paul, 2017-05-23 11:46:07

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

  • строка
  • целое число, int
  • плавающий, двойной
  • логический, bool
  • ресурс
 2
Author: marcio, 2014-11-21 01:47:05

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

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

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

 1
Author: Frank Farmer, 2009-10-02 23:37:02

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

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

 1
Author: dbr, 2017-05-23 12:17:14

Вы могли бы использовать h2tp транспилер для переноса кода ВЗЛОМА в PHP:

Вы можете сделать это благодаря команде Facebook и ВЗЛАМЫВАТЬ язык.

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

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

 0
Author: JavierFuentes, 2016-12-11 14:12:59