Например, можно ли написать такой код:
int $x = 6; str $y = "hello world"; bool $z = false; MyObject $foo = new MyObject();
И можно ли определить такие функции:
public int function getBalance() { return 555; //Or any numeric value }
Изменить: этот ответ относится к версиям PHP 5.6 и более ранних версий. Как отмечалось в последних ответах, PHP версии 7.0 и более поздних версий имеют определенную поддержку для этого
Оригинальный ответ:
Нет. Существует поддержка типа намекания с php5, но «Тип подсказки может быть только типа объекта и массива (начиная с PHP 5.1). Традиционный тип hinting с int и string не поддерживается».
Это до тех пор, пока php идет, и насколько он должен идти, если вы спросите меня.
В 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
PHP не строго типизирован, поэтому нет. Тем не менее, он поддерживает ограниченный тип намека на функции – это как можно ближе.
К сожалению нет! Сейчас я нахожусь в конце большого проекта, который включает в себя много алогоритов (теория графов, схемы и т. Д.), И мне жаль, что я не выбрал php.
Я использую php уже около 10 лет и по-прежнему считаю, что это хороший язык, однако нужно решить! Что плохо для меня, отсутствие строгого набора текста может быть хорошим для кого-то другого.
Кроме того, я хочу упомянуть, что я часто писал дополнительный код для поддержки строгой типизации, просто пример:
if (is_array($r) && count($r)===0)
и обнаруженные ошибки и скрытые ситуации и т. д. не поддаются объяснению.
Были ошибки и ситуации, которые я никогда не мог бы думать / обнаруживать априори, писать все эти дополнительные коды не было, но, по крайней мере, это спасет меня от глупых ошибок!
Если я вернусь, возможно, я бы выбрал php для веб-части, вы знаете, что получаете и показываете данные пользователю, php просто подходит для этого, обрабатывая строку, массивы, разговаривая с базой данных и т. Д. И т. Д., Но для основного ядра , алгоритмы и т. д. Я бы пошел на C ++, может быть, haskell .. не знаю, по крайней мере, что-то строго типизированное.
Что-то, что вы могли бы попытаться смоделировать строгий контроль бедных людей, использует 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 на основе статической типизации.
Возможно, вам стоит попробовать это расширение PHP https://github.com/krakjoe/strict . Вводится поддержка следующих типов:
Нет. Этот синтаксис не будет работать.
Теоретически вы могли бы придумать систему объектов, которая применяла бы их собственную строгую типизацию, но она не будет работать и … зачем вам это нужно?
Если вам нужна строгая типизация, используйте строго типизированный язык.
Поскольку ответ в основном «нет», альтернатива: PHP «linter», который должен улавливать некоторые из вещей, которые проверяет время компиляции на статично типизированном языке, таком как C. Не то же самое, но должно предотвращать некоторую глупость
«Есть ли статический анализатор кода [например, Lint] для файлов PHP» перечисляет многие из них.
Вы можете использовать transpiler h2tp для пересылки кода HACK на PHP:
Вы можете сделать это благодаря команде Facebook и HACK Language .
Посетите http://hacklang.org и http://hhvm.com для получения дополнительной информации.
Если вы хотите скопировать код непосредственно в среду Hack + HHVM, вы также можете использовать встроенный в среду IDE Nuclide