Ankündigung

Einklappen
Keine Ankündigung bisher.

Variablen anhand ihrer Referenz löschen?

Einklappen

Neue Werbung 2019

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

  • Variablen anhand ihrer Referenz löschen?

    Ich habe eine Funktion, die eine Variable prüft.
    Die zu prüfende Variable wird als Referenz übergeben und soll unter bestimmten Bedingungen, gelöscht werden.
    Nun funktioniert folgendes aber nicht:
    Code:
    function checkType(&$var){
        //Prüfung der Variablen: [...]
        if($blnReturn == FALSE){
            unset($var);    
        }
    }
    $int = 500;
    checkType($int);
    if(isset($int)){
        echo 'int: '.$int.'
    ';
    }
    Code:
    int: 500
    Die nächste Möglichkeit an die ich denke, ist das Löschen über der den $GLOBALS-Array.
    Code:
    function checkType(&var,$key){
        //Prüfung der Variablen: [...]
        if($blnReturn == FALSE){
            unset($GLOBALS[$key]);    
        }
    }
    $int = 500;
    checkType($int);
    if(isset($int)){
        echo 'int: '.$int.'
    ';
    }
    Das funktioniert zwar, sieht mir aber doch noch etwas unschön aus. Gibt es vielleicht eine schönere Möglichkeit dafür?[/php]


    //Edit sagt: Die [php]-Tags funktionieren nicht, da wird nur
    Code:
        
        
        
    
    
    PHP-Code:
    (php-code
    ausgegeben, darum das ganze hier in den [code]-Tags.
    Programming PHP


  • #2
    Beim 1. Beispiel muss es &$var statt &var heißen, hat das keinen Parse-Error verursacht? *sich-wunder*

    Wozu möchtest du eigentlich Variablen löschen? Vielleicht ist deine Struktur nur unsauber und wir können dir bessere Vorschläge geben.

    Kommentar


    • #3
      Wie so oft wirkt ein Blick in die Doku Wunder...

      Zitat von php.net/unset
      If a variable that is PASSED BY REFERENCE is unset() inside of a function, only the local variable is destroyed. The variable in the calling environment will retain the same value as before unset() was called.

      Kommentar


      • #4
        Zitat von Zergling
        Beim 1. Beispiel muss es &$var statt &var heißen, hat das keinen Parse-Error verursacht? *sich-wunder*
        Ups, war ein Schreibfehler hier im Forum, im Code war es korreckt.

        Zitat von Zergling
        Wozu möchtest du eigentlich Variablen löschen? Vielleicht ist deine Struktur nur unsauber und wir können dir bessere Vorschläge geben.
        Tja, gute Frage. In meinem "Projekt" habe ich es regelmäßig mit einigen GET- und POST-Variablen zu tun.
        Um sie zu Prüfen (leer/nicht leer, Wert erlaubt, Typ erlaubt) habe ich eine recht umfangreiche Funktion (ca. 165 Zeilen), die neben dem Prüfen auch Type-Konventionen durchführt. Die jedesmal aufzurufen dürfte nicht umbedingt sehr schnell sein. Den Wert zu löschen und das ganze mit empty zu prüfen ist auch nicht möglich, denn die Variablen dürfen durchaus den Wert 0 haben.
        Sie immer mit einem superMegaLangemStandartWert zu belegen sieht doch recht unschön aus. Also will ich sie löschen um im nachhinein mit isset prüfen zu können, ob sie existieren.
        Programming PHP

        Kommentar


        • #5
          Zitat von karl-150
          Wie so oft wirkt ein Blick in die Doku Wunder...

          Zitat von php.net/unset
          If a variable that is PASSED BY REFERENCE is unset() inside of a function, only the local variable is destroyed. The variable in the calling environment will retain the same value as before unset() was called.
          Das hilft leider nicht.
          Das ganze kurz mit unset() zu testen, war ja kein Problem. Und das Nachschlagen in der Referenz war auch kein Problem. Mir geht es nur darum, Alternativlösungen zu finden, und die stehen so nicht direkt in der Referenz.
          Programming PHP

          Kommentar


          • #6
            Das verstehe ich nicht so ganz, ich habe eine statische Validate-Klasse, die prüft oder konvertiert, z.B. isUINT() oder toUINT() (für unsigned integer, meistens für eine ID)
            Ich prüf das halt per

            isset($_POST['id']) && Validate::isUINT($_POST['id'],/* $autoConvert = */ false)

            und da brauch ich eigentlich nie ein unset, höchstens mal ein emty()-Check.
            Und 165 Zeilen krieg ich selbst für String-, E-Mail- oder PLZ-Tests nicht zusammen.

            Zeig doch mal konkrete Codeblöcke..

            Kommentar


            • #7
              Die Funktion hat drei Parameter. Die Variable $var, den Typ, den sie nach der Konvertierung haben soll, und den Parameter $blnNull, mit dem angegeben wird, ob die Variable als leer zählt, wenn sie entweder >= 0 oder '' ist.
              Das (für mich) schöne an dieser Funktion ist halt, das jede Typ-Konvertierung genau festgelegt ist und bei bedarf geändert werden kann.
              Würde ich das ganze in eine Klasse mit verschiedenen Methoden schreiben, würde es vielleicht auch kürzer werden, aber im Moment bin ich mit einer Funktion ganz glücklich.
              Die gesamte Funktion:
              PHP-Code:
                  define('CB_NULL'TRUE); //Can Be 0
                  
              define('CNB_NULL'FALSE); //Can Not Be 0
                  
              function checkType(&$var$strTyp$blnNull CB_NULL){
                           
              $strVarTyp gettype($var); //Ursprungstyp
                           
              $blnReturn FALSE;
                           
              //Verzweigung je nach gewünschtem Typ
                           
              switch($strTyp){
                               case 
              'boolean':
                                    switch(
              $strVarTyp){
                                        case 
              'boolean':
                                             
              $blnReturn TRUE;
                                             break;

                                        case 
              'integer':
                                             
              $var $var TRUE FALSE;
                                             
              $blnReturn TRUE;
                                             break;

                                        case 
              'double':
                                             
              $var $var TRUE FALSE;
                                             
              $blnReturn TRUE;
                                             break;

                                        case 
              'string':
                                             if(
              $var == '' AND $blnNull == CNB_NULL){
                                                     break;
                                             }
                                             
              $var = ($var == 'true' OR $var == 'TRUE') ? TRUE FALSE;
                                             
              $blnReturn TRUE;
                                    }
                                    break;

                               case 
              'integer':
                                    switch(
              $strVarTyp){
                                        case 
              'boolean':
                                             
              $var = (int) $var;
                                             if(
              $blnNull == CNB_NULL AND $var == 0){
                                                         
              $blnReturn FALSE;
                                             }
                                             else{
                                                 
              $blnReturn TRUE;
                                             }
                                             break;

                                        case 
              'integer':
                                             if(
              $blnNull == CNB_NULL AND $var <= 0){
                                                         
              $blnReturn FALSE;
                                             }
                                             else{
                                                 
              $blnReturn TRUE;
                                             }
                                             break;

                                        case 
              'double':
                                             
              $var = (int) $var;
                                             if(
              $blnNull == CNB_NULL AND $var <= 0){
                                                         
              $blnReturn FALSE;
                                             }
                                             else{
                                                 
              $blnReturn TRUE;
                                             }
                                             break;

                                        case 
              'string':
                                             if(
              $var == '' AND $blnNull == CNB_NULL){
                                                     break;
                                             }
                                             
              $var = (int) $var;
                                             if(
              $blnNull == CNB_NULL AND $var <= 0){
                                                         
              $blnReturn FALSE;
                                             }
                                             else{
                                                 
              $blnReturn TRUE;
                                             }
                                             break;
                                    }
                                    break;

                               case 
              'double':
                                    switch(
              $strVarTyp){
                                        case 
              'boolean':
                                             
              $var = (double) $var;
                                             if(
              $blnNull == CNB_NULL AND $var == 0){
                                                         
              $blnReturn FALSE;
                                             }
                                             else{
                                                 
              $blnReturn TRUE;
                                             }
                                             break;

                                        case 
              'integer':
                                             
              $var = (double) $var;
                                             if(
              $blnNull == CNB_NULL AND $var <= 0){
                                                         
              $blnReturn FALSE;
                                             }
                                             else{
                                                 
              $blnReturn TRUE;
                                             }
                                             break;

                                        case 
              'double':
                                             if(
              $blnNull == CNB_NULL AND $var <= 0){
                                                         
              $blnReturn FALSE;
                                             }
                                             else{
                                                 
              $blnReturn TRUE;
                                             }
                                             break;

                                        case 
              'string':
                                             if(
              $var == '' AND $blnNull == CNB_NULL){
                                                     break;
                                             }
                                             
              $var = (double) $var;
                                             if(
              $blnNull == CNB_NULL AND $var <= 0){
                                                         
              $blnReturn FALSE;
                                             }
                                             else{
                                                 
              $blnReturn TRUE;
                                             }
                                             break;
                                    }
                                    break;

                               case 
              'string':
                                    switch(
              $strVarTyp){
                                        case 
              'boolean':
                                             switch(
              $var){
                                                 case 
              TRUE:
                                                      
              $var 'true';
                                                      break;
                                                 default:
                                                     
              $var 'false';
                                             }
                                             
              $blnReturn TRUE;
                                             break;

                                        case 
              'integer':
                                             if(
              $var == AND $blnNull == CNB_NULL){
                                                     break;
                                             }
                                             
              $var = (string) $var;
                                             
              $blnReturn TRUE;
                                             break;

                                        case 
              'double':
                                             if(
              $var === AND $blnNull == CNB_NULL){
                                                     break;
                                             }
                                             
              $var = (string) $var;
                                             
              $blnReturn TRUE;
                                             break;

                                        case 
              'string':
                                             if(
              $var == '' AND $blnNull == CNB_NULL){
                                                     break;
                                             }
                                             else{
                                                 
              $blnReturn TRUE;
                                             }
                                             break;
                                    }
                                    break;
                           }
                           switch(
              $blnReturn){
                               case 
              FALSE:
                                    
              //Und hier liegt halt dann das Problem, wo ich die Variable igrendwie löschen will.
                                    
              unset($var);
                           }
                           return 
              $blnReturn;
                  } 
              Programming PHP

              Kommentar


              • #8
                Wenn du nichts ändern willst, verweise ich auf karl-150's Hinweis

                Warum aber übergibst du die Variable als Referenz UND aber schmeißt sie als Rückgabewert zurück (return)?

                Kommentar


                • #9
                  Zitat von Zergling
                  Wenn du nichts ändern willst, verweise ich auf karl-150's Hinweis
                  Dann werde ich es wohl mit einem übergebenen key machen und dann über den $GLOBALS-Array löschen.
                  Warum aber übergibst du die Variable als Referenz UND aber schmeißt sie als Rückgabewert zurück (return)?
                  return schmeißt die Variable $blnReturn zurück, die true ist, wenn die Variable bestehen bleibt, oder false, wenn sie gelöscht wurde.

                  Dank euch für eure Hilfe
                  Programming PHP

                  Kommentar


                  • #10
                    Sorry hab mich verlesen.

                    Kommentar

                    Lädt...
                    X