PHP 7 en strikte “resource”-typen

Ondersteunt PHP 7 strikt typen voor bronnen? Zo ja, hoe?

Bijvoorbeeld:

   declare (strict_types=1);
    $ch = curl_init ();
    test ($ch);
    function test (resource $ch)
    {
    }

Het bovenstaande geeft de foutmelding:

Fatale fout: Uncaught TypeError: Argument 1 doorgegeven aan test() moet een instantie van resource zijn, resource opgegeven

Een var_dump op $chonthult dat het resource(4, curl)is, en de handleiding zegt curl_init ()retourneert een resource .

Is het überhaupt mogelijk om de functie test()strikt in te typen om de $ch variablete ondersteunen?


Antwoord 1, autoriteit 100%

PHP heeft geen type hint voor bronnenomdat

Er wordt geen typehint voor bronnen toegevoegd, omdat dit het verplaatsen van bronnen naar objecten voor bestaande extensies zou voorkomen, wat sommigen al hebben gedaan (bijv. GMP).

U kunt echter is_resource()gebruiken in de hoofdtekst van de functie/methode om het doorgegeven argument te verifiëren en behandel het indien nodig. Een herbruikbare versie zou een bewering als deze zijn:

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 je dan zo in je code zou kunnen gebruiken:

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

Antwoord 2, autoriteit 22%

resourceis geen geldig typedus het wordt verondersteld een klassenaam te zijn volgens de goede oude PHP/5 type hints. Maar curl_init()retourneert geen objectinstantie.

Voor zover ik weet is er geen manier om een ​​bron op te geven. Het zou waarschijnlijk niet zo handig zijn aangezien niet alle bronnen identiek zijn: een bron gegenereerd door fopen()zou nutteloos zijn voor oci_parse().

P.S. Als u de bron in de hoofdtekst van de functie wilt controleren, kunt u get_resource_type()gebruiken (met is_resource()om fouten te voorkomen), zoals in:

is_resource($ch) && get_resource_type($ch) === 'curl'

Other episodes