2016-07-18 4 views
12

Unterstützt PHP 7 strikte Typisierung für Ressourcen? Wenn das so ist, wie?PHP 7 und strenge "Ressource" -Typen

Zum Beispiel:

declare (strict_types=1); 

    $ch = curl_init(); 
    test ($ch); 

    function test (resource $ch) 
    { 

    } 

Die oben wird den Fehler geben:

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of resource, resource given

A Var_dump auf $ch zeigt es Ressource (4, curl), zu sein, und das Handbuch sagt curl_init() Gibt eine Ressource zurück.

Ist es überhaupt möglich, die test() Funktion genau zu schreiben, um die $ch variable zu unterstützen?

Antwort

19

PHP hat keine type hint for resources weil

No type hint for resources is added, as this would prevent moving from resources to objects for existing extensions, which some have already done (e.g. GMP).

aber Sie is_resource() innerhalb der Funktion/Methode Körper verwenden können, das übergebene Argument, um zu überprüfen und damit umgehen, wie gebraucht. Eine wiederverwendbare Version wäre eine Behauptung wie folgt sein:

function assert_resource($resource) 
{ 
    if (false === is_resource($resource)) { 
     throw new InvalidArgumentException(
      sprintf(
       'Argument must be a valid resource type. %s given.', 
       gettype($resource) 
      ) 
     ); 
    } 
} 

, die Sie dann in Ihrem Code wie das verwenden könnte:

function test($ch) 
{ 
    assert_resource($ch); 
    // do something with resource 
} 
6

resource ist kein valid type, daher wird angenommen, dass es sich um einen Klassennamen gemäß den guten alten PHP/5-Hinweisen handelt. Aber curl_init() gibt keine Objektinstanz zurück.

Soweit ich weiß gibt es keine Möglichkeit, eine Ressource anzugeben. Es wäre wahrscheinlich nicht so nützlich, da nicht alle Ressourcen identisch sind: Eine durch erzeugte Ressource wäre für oci_parse() unbrauchbar.