Verhalten von is_callable auf ‘/’

Lesezeit: 2 Minuten

Benutzer-Avatar
Michael Robinson

Mein Kollege und ich sind auf ein ziemlich seltsames Verhalten gestoßen. Unsere Umgebungen sind Ubuntu 11.10, PHP 5.3.6-13ubuntu3.6 mit Suhosin-Patch und Windows 7 PHP 5.3.5.

Auf unseren Maschinen läuft der folgende Code erwartungsgemäß:

<?php
function t() { }
var_dump(is_callable("https://stackoverflow.com/"));

Mit der Ausgabe:

bool(false)

Auf einem unserer Server, CentOS Release 5.7 (Final), PHP 5.3.8, erzeugt derselbe Code:

bool(true)

Ohne das t() Funktion, is_callable funktioniert wie erwartet. Beachten Sie, dass is_function verhält sich genauso wie is_callable bei diesen Prüfungen.

Hat jemand eine Ahnung, woran das liegen könnte?

Bearbeiten:

Es scheint nur zu passieren, wenn eine Funktion benannt wird t vorhanden ist, alles andere, wie b, c usw., und die Ausgabe ist wie erwartet.

Bearbeiten – Testen mit mehr Zeichen:

<?php
function t() { }
foreach(str_split('/abcdefghijkmnopqrstuvwxyz023456789ABCDEFGHIJKLMNOPQRSTUVXYZ!@#$%^&*()-_+=`~;:[]{}\\|\'"?.>,<') as $character) {
    if (is_callable($character)) var_dump($character, is_callable($character));
}

Gibt auf dem Server folgendes aus:

string(1) "https://stackoverflow.com/"
bool(true)
string(1) "t"
bool(true)
string(1) "T"
bool(true)
string(1) "_" // gettext
bool(true)
string(1) ":" // With the t() function undefined, this remains callable on the server
bool(true)

In unseren Umgebungen ist die Ausgabe wie erwartet:

string(1) "t"
bool(true)
string(1) "T"
bool(true)

Bearbeiten – weitere Informationen zu cbuckleys Kommentar:

<?php 
ini_set('display_errors', 1);
error_reporting(E_ALL);
function t() { }
$v = "https://stackoverflow.com/"; $v();

Erzeugt Ausgabe: Call to undefined function /()

  • Das ist wirklich bizarr. Ist es nur für '/'?

    – Hamisch

    2. März 2012 um 0:41 Uhr

  • @Hamish Ich habe meine Frage mit Codetests aktualisiert is_callable auf mehr Zeichen

    – Michael Robinson

    2. März 2012 um 0:51 Uhr

  • PHP, du verblüffst mich weiterhin. bugs.php.net 🙂

    – cmbuckley

    2. März 2012 um 1:32 Uhr


  • Weitere Tests: versuchen is_callable('/', false, $realName); var_dump($realName);

    – cmbuckley

    2. März 2012 um 1:34 Uhr

  • Versuchen Sie, die geladene Erweiterung auf beiden Servern zu vergleichen.

    – Mezze

    2. März 2012 um 8:22 Uhr


Als Workaround könntest du folgendes versuchen:

$name="https://stackoverflow.com/";
$actual = null;
if (is_callable($name, false, $actual) && $name === $actual) {
    // Method is actually callable
}

1140800cookie-checkVerhalten von is_callable auf ‘/’

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy