HHVM 3.9 ist nicht so ein Fan von ternären Aussagen mit benannten Funktionen, auch wenn fun()
passiert, aber ≥ 3.10 ist völlig in Ordnung mit ihnen. Es scheint, als ob dies eine der wenigen Fällen ist jedoch wegen 3.9 tut genannten Funktionen von konkreten Funktionen zurücknehmen, sowie die Annahme in andere Funktionen übergeben genannten Funktionen (3v4l):Sind Hack namens Funktionen voll erstklassige Bürger?
<?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
Was hat sich verändert zwischen 3.9 und 3.10? Gibt es Fälle in HHVM ≥ 3.10 wo benannte Funktionen nicht referenziert werden können und auf diese Weise verwendet werden?
Ah, also ist das eher eine Frage dessen, was _PHP7_ mit benannten Funktionen unterstützt. Ich bin neugierig, warum die "Notiz ... undefinierte Konstante" durch "Spaß" unterdrückt wird, wenn sie "nur auf die üblichen aufrufbaren Formen von PHP herunter läuft", aber es ist ein kleines Detail, das ich vermute. Zur Klarstellung: Außerhalb von Typfehlern gibt es keine Fälle, in denen 'fun '(' foo ')' und 'foo' anders interpretiert werden, oder? – concat
Die Typfehler sind der gesamte Punkt; sie sind im Typchecker eindeutig nicht dasselbe. Allerdings [zur Laufzeit ja] (https://github.com/facebook/hhvm/blob/cc7f35361e5dfc934631e1e19e2f2b9f66890391/hphp/system/php/lang/fun.ns.php#L31-L67). EDIT: Beachten Sie, dass die Kommentare in dem Code, den ich verlinkt, Code auf Toplevel haben und als solcher falsch sind, aber [die normalen öffentlichen Dokumente] (https://docs.hhvm.com/hack/callables/special-functions) haben Recht . –