Необъяснимые подсказки типов в PHP-коде

Я анализирую код PHP, работающий на сервере, к которому у меня нет полного доступа. Хотя я могу читать phpinfo. Код на сервере работает нормально. В моей локальной среде я просто не могу запустить код, так как получаю «Catchable Fatal Error» при каком-то вызове метода, использующего подсказку типа.

someMethod(string $str) {
  // Do something...
}

В сообщении об ошибке говорится следующее: «Аргумент 1, переданный в ..., должен быть экземпляром пути \ of \ namespace \ string, заданная строка ...».

В строковом классе нет ключевого слова use, и я не могу найти что-либо с помощью команды grep в папках среды разработки.

Существуют ли какие-либо модули PHP, расширения, которые могут заставить работать такие подсказки? Сервер и моя среда разработки используют PHP 5.4.25.

Что может дать живая система для запуска такого кода? Может ли он использовать какой-нибудь другой язык программирования, основанный на PHP, например Hack? Остальной код - это довольно простой PHP!


person Wipster    schedule 09.04.2014    source источник
comment
PHP не поддерживает подсказку типов для скаляров, только для массивов и объектов .... хотя nikic действительно предоставил код для этого как часть RFC (так что есть патч, поддерживающий его), и он поддерживается Hack   -  person Mark Baker    schedule 09.04.2014
comment
@MarkBaker Он упомянул, что строка взята из пространства имен. Так что в этом случае это вообще возможно.   -  person Hecke29    schedule 09.04.2014
comment
Я не верил, что зарезервированные слова можно использовать в качестве имен классов, даже с пространством имен   -  person Mark Baker    schedule 09.04.2014
comment
@MarkBaker Я тоже этого не делал, но, похоже, это работает, странно: codexon.codepad.org/fewDbnLN   -  person Victor Stanciu    schedule 09.04.2014
comment
Здесь снимаем в темноте, но не могли бы вы оказаться в другом пространстве имен? Я испытал нечто подобное, пытаясь создать исключение. Добавление \ решило проблему: throw new \ Exception (..);   -  person 0plus1    schedule 11.04.2014


Ответы (1)


Вы упоминаете, что в коде нет оператора use или объявления пространства имен, которые ссылаются на «строковый» класс. В коде используется автозагрузчик?

Здесь есть две возможные проблемы:

Пути. в).

Обработка ошибок. Другая возможная причина - наличие в производственной среде обработчика ошибок, который всегда возвращает true.

У меня была эта точная проблема, когда подсказка типа не разрешалась в процессе разработки, но я не осознавал этого, пока мы не запустили ее в действие и обработчик ошибок больше не был зарегистрирован.

Очевидно, что фатальную ошибку синтаксического анализа нельзя остановить, но оказывается, что обнаруживаемая ошибка может быть проигнорирована, если обработчик ошибок возвращает истину. И это то, на что я вкладываю свои деньги в вашем случае.

Кроме того, очень важно отметить, что, как указал один пользователь, нет способа указать скаляр с помощью набора.

Более простой способ сказать, что это «невозможно ввести что-либо, что может быть представлено строкой». Это связано с тем, как PHP обрабатывает более примитивные переменные, они могут все они должны быть преобразованы в типы друг к другу, и поэтому (поскольку 1, "1" и true могут быть == 1, == '1' и == true) для интерпретатора на самом деле невозможно, поскольку он написан, чтобы фактически улавливать и применять скалярные подсказки типов.

Ответьте на этот вопрос: эта переменная должна быть $str = "something"; или $str = new string(); (т. Е. Строкой или объектом)?

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

Поскольку вы говорите, что у вас нет доступа к коду, я предлагаю сообщить об этом тому, у кого он есть.

person Mike    schedule 14.05.2014
comment
Поскольку я никогда не получу доступ к действующей системе, я отметил ваш ответ как правильный. Вскоре мы перенесем код в действующую систему и в значительной степени сделали то, что вы сказали. Мы просто удалили подсказку типа. Я доложу, что происходит. - person Wipster; 15.05.2014