Intereting Posts
Как установить цвет фона для каждой страницы tcpdf Отслеживание исходящих ссылок с помощью Javascript и PHP Использование двойных кавычек в значении 'input type = "text"' не работает, строка останавливается при двойной кавычке! Как настроить ffmpeg для сервера CentOS версии 6.5 Сортировка массива объектов Инструкция WHERE не работает в Joomla! 3.0.3. запрос php Инструмент поможет мне получить все css и javascript, связанные с тегом HTML Шифрование «нулевого знания» для базы данных mysql В чем разница между Switch и IF? Карты Google – панорамирование и масштабирование по областям – маркеры не появляются при увеличении или панорамировании – ПОМОЩЬ! Как использовать cURL для получения данных jSON и декодирования данных? Загружать несколько файлов с завихрением Facebook getAccessToken () возвращает токен доступа к приложениям: работает отлично на одном сервере, но бросает токен доступа к приложениям в другом. NetBeans не удалось установить некоторые модули Проблема с использованием DOTNET с PHP.

Можно ли написать строго типизированный 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 } 

Изменить: этот ответ относится к версиям 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 . Вводится поддержка следующих типов:

  • строка
  • integer, int
  • поплавок, двойной
  • boolean, bool
  • ресурс

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

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

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

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

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

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

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

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

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