PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Wie viele interne Funktionen hat PHP?

with 5 comments

Tja, das ist nicht so leicht zu beantworten, die Antwort lautet: Kommt drauf an.

  • Zählt man nur die Funktionen in der sogenannten Standard-Extension und der SPL-Extension sind es 526. Das ist also die Anzahl die jede PHP Installation auf jeden Fall bietet.
  • Zählt man auch die Methoden der Klassen mit die mit ausgeliefert werden kommt man zusammen auf 1402. Darin sind jedoch auch viele „doppelte“ Methoden vorhanden die durch Ableitung entstehen.

Doch jede PHP-Installation wird normalerweise mit zusätzlichen Extensions kompiliert bzw. werden weitere geladen, sodass die Anzahl der zur Verfügung stehenden Funktionen deutlich höher ist:

  • Zählt man alle internen Funktionen hier in dieser PHP-Version von Xampp dann sind dies 1605. Darin sind nun auch die Funktionen aller installierten Extensions enthalten, z.B. die mysql_* Funktionen durch die mysqli-Extension oder die xdebug_* Funktionen der xdebug-Extension.
  • Zählt man alle Funktionen und Methoden zusammen kommt man auf stolze 3825 Funktionen und Methoden.

Ich habe für diese Zählungen die folgenden Scripte verwendet, die jeweils alle gefundenen Funktionen und Methoden inklusive Parametern ausgibt, man erhält also eine lange Liste die ungefähr so aussieht:

...
is_uploaded_file($path)
move_uploaded_file($path, $new_path)
gethostbyaddr($ip_address)
gethostbyname($hostname)
gethostbynamel($hostname)
gethostname()
dns_check_record($host, $type)
checkdnsrr($host, $type)
dns_get_mx($hostname, &$mxhosts, &$weight)
getmxrr($hostname, &$mxhosts, &$weight)
dns_get_record($hostname, $type, &$authns, &$addtl)
intval($var, $base)
floatval($var)
doubleval($var)
strval($var)
gettype($var)
settype(&$var, $type)
is_null($var)
...

Hier das Script für die Zählung der Funktionen in der Standard- und SPL-Extension:

<?

$countFunctions = 0;

$extensions = array('standard' ,'spl');
foreach ($extensions as $extension) {
    $reflectionExtension = new ReflectionExtension($extension);

    foreach ($reflectionExtension->getFunctions() as $reflectionFunction) {
        /** @var $reflectionFunction ReflectionFunction  */

        $params = array();
        foreach ($reflectionFunction->getParameters() as $reflectionParameter) {
            /** @var $reflectionParameter ReflectionParameter  */

            $paramString = '';
            if ($reflectionParameter->isPassedByReference()) {
                $paramString = '&';
            }
            if ($reflectionParameter->getName() != '...') {
                $paramString .= '$';
            }
            $paramString .= $reflectionParameter->getName();

            $params[] = $paramString;
        }

        echo $reflectionFunction->getName() ."(".join(', ', $params).")\n";

        $countFunctions++;
    }
}

echo $countFunctions;

Das Script das alle zur Verfügung stehenden Funktionen auflistet (incl. aller geladenen Extensions):

<?

$definedFunctions = get_defined_functions();
$definedInternalFunctions = $definedFunctions["internal"];

foreach ($definedInternalFunctions as $functionName) {

    $reflectionFunction = new ReflectionFunction($functionName);

    $params = array();
    foreach ($reflectionFunction->getParameters() as $reflectionParameter) {
        /** @var $reflectionParameter ReflectionParameter  */

        $paramString = '';
        if ($reflectionParameter->isPassedByReference()) {
            $paramString = '&';
        }
        $paramString .= '$' . $reflectionParameter->getName();

        $params[] = $paramString;
    }

    echo $functionName ."(".join(', ', $params).")\n";
}

echo count($definedInternalFunctions);

Hiermit werden alle Methoden der Standard- und SPL-Extension gezählt:

<?

$countMethods = 0;

$extensions = array('standard' ,'spl');
foreach ($extensions as $extension) {
    $reflectionExtension = new ReflectionExtension($extension);

    foreach ($reflectionExtension->getClasses() as $reflectionClass) {
        /** @var $reflectionClass ReflectionClass  */

        foreach ($reflectionClass->getMethods() as $reflectionMethod) {
            /** @var $reflectionMethod ReflectionMethod  */

            $params = array();
            foreach ($reflectionMethod->getParameters() as $reflectionParameter) {
                /** @var $reflectionParameter ReflectionParameter  */

                $paramString = '';
                if ($reflectionParameter->isPassedByReference()) {
                    $paramString = '&';
                }
                if ($reflectionParameter->getName() != '...') {
                    $paramString .= '$';
                }
                $paramString .= $reflectionParameter->getName();

                $params[] = $paramString;
            }

            echo $reflectionClass->getName() . '::' . $reflectionMethod->getName() ."(".join(', ', $params).")\n";

            $countMethods++;
        }
    }
}

echo $countMethods;

Und zu guter letzt alle Methoden aller PHP-Klassen die zur Verfügung stehen:

<?

$countMethods = 0;

$declaredClasses = get_declared_classes();
foreach ($declaredClasses as $declaredClass) {
    $reflectionClass = new ReflectionClass($declaredClass);

    foreach ($reflectionClass->getMethods() as $reflectionMethod) {
        /** @var $reflectionMethod ReflectionMethod  */

        $params = array();
        foreach ($reflectionMethod->getParameters() as $reflectionParameter) {
            /** @var $reflectionParameter ReflectionParameter  */

            $paramString = '';
            if ($reflectionParameter->isPassedByReference()) {
                $paramString = '&';
            }
            if ($reflectionParameter->getName() != '...') {
                $paramString .= '$';
            }
            $paramString .= $reflectionParameter->getName();

            $params[] = $paramString;
        }

        echo $reflectionClass->getName() . '::' . $reflectionMethod->getName() ."(".join(', ', $params).")\n";

        $countMethods++;
    }
}

echo $countMethods;

Im PHP Manual gibt es auch eine Liste aller PHP-Funktionen die im PHP Manual einen Eintrag haben. Dabei sind aber auch teils Funktionen von exotischen PECL-Extensions.

Written by Michael Kliewe

April 13th, 2012 at 10:01 am

5 Responses to 'Wie viele interne Funktionen hat PHP?'

Subscribe to comments with RSS or TrackBack to 'Wie viele interne Funktionen hat PHP?'.

  1. Fällt wohl unter die Kategorie „Unnützes Wissen“ 😀 Hab aber mit mehr gerechnet… Insgesamt einfach mal nett zu wissen, kann man bestimmt gut auf Parties mit angeben 🙂

    KingCrunch

    13 Apr 12 at 10:09

  2. Doch immer noch an die viertausend?

    Die Zahl scheint trotz der Verbannung so mancher Extension nach Sibi^W PECL ziemlich konstant zu bleiben, vor etwa 10 Jahren als wir die interne Struktur des Manuals umgestellt haben (Operation Bananasplit, ein unbeabsichtigter aber sehr erfolgreicher DoS auf den PHP CVS server damals) waren es auch so irgendwas zwischen 3500 und 4000 AFAIR …

    hartmut

    13 Apr 12 at 10:15

  3. @KingCrunch: Wieso bin ich nie auf Parties eingeladen, auf denen man mit diesem Wissen angeben kann?

    Dennis

    13 Apr 12 at 10:23

  4. Mit short tags kann man auf solchen Parties wohl eher auch nicht angeben 🙁

    Ansonsten nette Sache, hat sicher Spaß gemacht das zu schreiben

    Daniel

    13 Apr 12 at 11:10

  5. @Dennis, die Frage sollte lauten auf man auf so eine Party gehen will

    Martin

    13 Apr 12 at 11:11

Leave a Reply

You can add images to your comment by clicking here.