Ankündigung

Einklappen
Keine Ankündigung bisher.

Typ resource prüfen auch geschlossene

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Typ resource prüfen auch geschlossene

    Für Test's und Debuggig möchte ich eine Variable prüfen, ob diese eine (auch geschlossene) Resource enthält.
    Dafür möchte ich nicht den Weg über var_dump() und die Output-Control-Funktionen gehen.
    PHP-Code:
    $resource fopen('test.txt','r');
    fclose($resource);
    var_dump($resource); //resource(4) of type (Unknown) 
    Eine Prüfung mit is_resource() liefert leider für eine geschlossene Resource false.
    is_resource() ist keine strikte Typprüfungsmethode: sie gibt FALSE zurück, wenn var eine Variable mit einer Ressource ist, die geschlossen wurde.
    Die Funktion gettype() liefert für eine geschlossene Resource "unknown type", auch keine sichere Sache.

    Im Netz ist noch zu finden, @get_resource_type() zu nutzen, die NULL im Fehlerfall liefert.
    Ohne Fehler-Kontroll-Operator wird jedoch wenn keine Resource übergeben wird eine lästige Warnung geworfen.
    Einen Fehler zu provozieren ist zudem auch keine schöne Lösung.
    Zudem werden trotz Fehler-Kontroll-Operator die Fehler intern gespeichert was ich für meine konkrete Anwendung nicht gebrauchen kann.

    Hier meine aktuelle Lösung:
    PHP-Code:
    function isResource($v){
      if(
    is_resource($v)) return true;
      
    $code strtoupper(var_export($v,true));
      return 
    $code==="NULL" AND $v !== NULL;

    Bevor ich das einbaue möchte ich folgende Fragen klären:

    - Ist das sicher oder habe ich einen/mehrere Fälle übersehen?
    - Gibt es eine bessere Lösungen?

    LG jspit
    ​​​​​​​

  • #2
    Das schliessen einer ressource verhält sich ähnlich wie unset zu einer Variablen, Was nicht da ist kann nicht geprüft werden..

    Kommentar


    • #3
      Da kann man mit PHP ab Version 7 auch noch nen bischen mehr tricksen.

      PHP-Code:
      function isOrWasResource$value )
      {
         try
         {
            
      get_resource_type$value );
            return 
      true;
         }
         catch ( 
      Throwable $ex ) { return false; }

      get_resource_type erwartet etws das eine gültige Resource ist oder war. Im Fehlerfall (ist/war keine Resource) triggert das eine Ausnahme mit der man Arbeiten kann. Wenn DU das aber in irgend nem High Performance Umfeld brauchst würde ich davon Abraten da ausgelöste Ausnahmen numal wie alles einen gewissen Speicherplatz beantspruchen.

      Kommentar


      • #4
        Zitat von protestix Beitrag anzeigen
        Das schliessen einer ressource verhält sich ähnlich wie unset zu einer Variablen, Was nicht da ist kann nicht geprüft werden..
        Der Vergleich hinkt für mein Verständnis mächtig.
        Die Variable existiert ja noch ist ist auch noch vom Typ resource, hat jedoch keine Resourcentyp mehr (sozusagen nur noch eine leere Hülle).
        var_dump zeigt dies ja auch richtig. Siehe 1.Codesnippet #1.

        Hier ist nochmal ein ausführlicher Test (Hab da die Funktion noch mal geringfügig geändert, die oben gezeigte besteht den Test ebenso).
        Es ist dort finde ich ganz gut der Unterschied von einer geschlossenen Resource und einer nichtexistenten Variable zu erkennen.

        Messier 1001 : Seit wann wirft get_resource_type eine Exception? Wäre fatal, wenn mit PHP 7 da so einige Corefunktionen undokumentiert ihr Verhalten ändern.
        Kann das nicht nachvollziehen.
        PHP-Code:
        <?php
        function isOrWasResource$value )
        {
           try
           {
              
        get_resource_type$value );
              return 
        true;
           }
           catch ( 
        Throwable $ex ) { return false; }
        }  

        $result isOrWasResource("test");
        var_dump($result); //bool(true)

        Kommentar


        • #5
          http://php.net/manual/de/language.errors.php7.php
          PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

          Kommentar


          • #6
            Und?
            Das betrifft aber nur Fehler, keine Warnungen. get_resource_type liefert aber im Fehlerfall NULL zurück und generiert eine Warnung und keinen Fehler:
            PHP-Code:
            $handle 23//int, keine resource
            $typ get_resource_type($handle);
            var_dump($typ);  //NULL 
            Ausgabe (PHP 7.0.11):
            Warning: get_resource_type() expects parameter 1 to be resource, integer given in /var/www/virtual
            NULL

            Die Aussage im Manual
            This function will return NULL and generate an error if handle is not a resource.
            behaupte ich mal ist falsch und vermutliche Ursache des Mißverständnisses.

            Edit: Fürs Verständnis ein Beispiel wo das Fangen funktioniert:
            PHP-Code:
            try
             {
               
            //Erzeugt für PHP <7 ein Fatal-Error
               
            $rv notexist();
             }
            catch (
            Throwable $e) { 
               echo 
            "Sorry: ".$e->getMessage();
             }

            //Ausgabe
            //Sorry: Call to undefined function notexist() 
            Online Sandbox

            LG jspit

            Kommentar


            • #7
              Kann nicht begreifen, was du am Ende da habe wilst, aber vieleicht so was?...
              PHP-Code:
               if ( isset ( $resource ) AND stristrprint_r($resourcetrue), 'Resource' ) ) echo 'is Resource'
              Signaturrrrrrr

              Kommentar


              • #8
                print_r erkennt auch eine geschlossene Resource als solche im Gegensatz zu is_resource() und ich kann die Information weiterverarbeiten ohne den Ausgabepuffer zu bemühen.
                Damit dürfte sich einiges vereinfachen.
                Danke für den Tipp, bin einfach nicht darauf gekommen.

                Zum Hintergrund
                Habe viel mit Resourcen zu tun (Stichwort Sockets). Die Entwickung der Applikation muss zu großen Teilen auf der Zielplattform selbst erfolgen, da nur hier die Umgebung für notwendige Tests
                vorhanden ist.
                Debuggt wird remote per Browser. Dafür habe ich eine eigene Klasse, welche ich stetig weiterentwickle.
                Für mich ist es beim Debuggen wichtig, eine möglichst genaue und umfassende Information über den Zustand einer Variable zu erhalten.
                Dazu gehört eben auch eine Resource richtig zu erkennen und auch Informationen über den Zustand/Status zu bekommen.

                Um dies zu verdeutlichen zeige ich mal ein kleines Testskript, welches ein Debuggen einer Anwendung ermöglicht die Resourcen vom Typ gd (Bildbearbeitung) verwendet:
                PHP-Code:
                <?php
                //Debugging GD Images
                require __DIR__.'/../class/class.debug.php';

                debug::log(true);

                $img imagecreate(80,40);
                ImageColorAllocate($img02550);
                debug::write('imagecreate',$img);

                $textColor ImageColorAllocate ($img000);
                ImageString ($img41010'T E S T'$textColor); 
                debug::write('ImageString',$img);

                if(!
                debug::isOn()) {
                  
                header ("Content-type: image/png");
                  
                ImagePNG($img);
                }
                imagedestroy($img);
                debug::write('imagedestroy',$img);
                Mit debug::log(true) kann ich Schritt für Schritt die Erstellung der Grafik verfolgen.
                Mit debug::log(false) werden alle Debugausgaben unterdrückt und die fertige Grafik erscheint direkt im Browser als Bild.
                Mit der aktuellen Betaversion wird hier schon bei der Ausgabe im Browser eine geschlossene Resource richtig dargestellt:

                debug_gd_image.png

                LG jspit


                Kommentar


                • #9
                  Ups sorry ich hätte das nicht so spät abends probieren sollen. Ich war fest überzeugt das das ne Exception wirft. DU hast naturlich Recht!

                  Kommentar

                  Lädt...
                  X