HHVM 3.9 не является таким фанатом тройных выражений с именованными функциями, даже если он прошел через fun()
, но ≥ 3.10 полностью в порядке с ними. Кажется, что это один из немногих случаев, однако, из-за 3,9 делает принимают названные функции, возвращенных из конкретных функций, а также прием названных функций передаются в другие функции (3v4l):Являются ли Hack названными функциями полностью первоклассные граждане?
<?hh
echo ((() ==> fun('strlen'))())('Hello'); // 5
echo (($f, $v) ==> $f($v))(strlen, 'Hello'); // 5 + Notice: Use of undefined constant strlen - assumed 'strlen'
echo (true ? strlen : intval)('100'); // Fatal error: syntax error, unexpected '(', expecting ',' or ';' on line 3
Что изменилось между 3,9 и 3,10? Существуют ли какие-либо случаи в HHVM ≥ 3.10, где названные функции нельзя ссылаться и использовать таким образом?
А, так что это больше вопрос о том, что _PHP7_ поддерживает по названным функциям. Мне любопытно, почему 'Notice ... undefined constant' подавляется' fun', если он «просто сводится к обычным формулам, вызываемым PHP», но это небольшая деталь, которую я подозреваю. Чтобы уточнить: вне ошибок типа, нет случаев, когда 'fun ('foo')' и 'foo' интерпретируются по-разному, не так ли? – concat
Ошибки типа - это целая точка; они категорически не то же самое в typechecker. Однако [во время выполнения, да] (https://github.com/facebook/hhvm/blob/cc7f35361e5dfc934631e1e19e2f2b9f66890391/hphp/system/php/lang/fun.ns.php#L31-L67). EDIT: имейте в виду, что комментарии в коде, который я связал, имеют код на уровне и, как таковые, неправильные, но [обычные общедоступные документы] (https://docs.hhvm.com/hack/callables/special-functions) являются правильными , –