2016-07-18 148 views
12

PHP 7 supporta la tipizzazione rigorosa delle risorse? Se é cosi, come?PHP 7 e rigidi tipi di "risorsa"

Ad esempio:

declare (strict_types=1); 

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

    function test (resource $ch) 
    { 

    } 

È possibile che questo darà l'errore:

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

Un var_dump su $ch rivela essere risorsa (4, curl), e il manuale dice curl_init() restituisce una risorsa.

È possibile digitare rigorosamente la funzione test() per supportare lo $ch variable?

risposta

19

PHP non dispone di un type hint for resources perché

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).

Tuttavia, è possibile utilizzare is_resource() all'interno del corpo della funzione/metodo per verificare l'argomento passato e gestire in base alle esigenze. Una versione riutilizzabile sarebbe un'affermazione come questa:

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

che si potrebbe poi utilizzare all'interno del codice del genere:

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

resource non è un valid type, quindi si presume che sia un nome di classe secondo i vecchi hint di tipo PHP/5. Ma curl_init() non restituisce un'istanza di oggetto.

Per quanto ne so non c'è modo di specificare una risorsa. Probabilmente non sarebbe così utile in quanto non tutte le risorse sono identiche: una risorsa generata da fopen() sarebbe inutile per oci_parse().