Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Sinnvoller Einsatz von Konstanten unter php

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Sinnvoller Einsatz von Konstanten unter php

    Hallo zusammen,

    die Konstanten sind ein Thema, das bei mir bisher ziemlich untergegangen ist, lassen sich doch viele Probleme lösen, ohne darüber nachzudenken.

    Mich würde nun mal interessieren wann und warum ihr in welchen Fällen Konstanten einsetzt und warum!?


  • #2
    Bei Interpretersprachen wie PHP benutze ich Konstanten garnicht.
    Einzige Ausnahme: register_globals=off kann nicht sichergestellt werden und ich brauche etwas wie bei phpBB
    if ( !defined('IN_PHPBB') )
    {
    die("Hacking attempt");
    }
    Konstanten können auch bei register_globals=on nicht über den URL gesetzt werden.

    Kommentar


    • #3
      Sobald jemand anders mit codet und du kein bock hast dumme fragen zu beantworten, warum auf einmal etwas nicht mehr funktioniert.
      weil er variabeln überschrieben hat, die er nicht hätte überschreiben sollen.

      das erspart sehr viel arbeit und schont die nerven *g*

      Kommentar


      • #4
        Konstanten sind eben konstant und ändern sich nicht.
        Ich benutze sie eigentlich recht oft, für formatierte Pfadangaben (wo liegt das Projekt absolut, etc.), für den Debug-Schalter (DEBUG_ON = true, gibt am Ende jeder Datei alle benutzten SQL-Befehle aus) und für Default-Argumente bei Funktionen und Methoden.
        Da sind Namen einfach geeigneter als Strings oder nichtssagende Zahlen.

        Ich kann heut Abend ja mal meine inc.constants.php posten, hab sie leider nicht parat.

        Einen riesen Nachteil von Konstanten ist aber, dass sie, wenn sie nicht existieren aber aufgerufen werden, einfach als String interpretiert werden.
        if (DEBUG_ON) ist also wahr, auch wenn DEBUG_ON garnicht als Konstante deklariert ist. Da muss dann immer überprüft werden (defined) ob die Konstante überhaupt existiert: if (defined('DEBUG_ON') && DEBUG_ON)

        Link zum Manual: http://de3.php.net/manual/de/language.constants.php

        Kommentar


        • #5
          Hey das mit der Interpretation als Strings wusste ich nicht. Gut, dass du es sagst.

          Ich verwende Konstanten meistens für MySQL-Daten:
          MYSQL_HOST, MYSQL_STANDARD_DB,MYSQL_USER etc.
          und oft für wiederkehrende reguläre ausdrücke.
          Beispielsweise beim Kontaktformular die email, bzw. telefonnummer oder so
          PHP-Code:
          <?php
          if(!defined("FORM_TELEFON"))
              
          define("FORM_TELEFON""/^[0-9\/\+\- ]+$/i");
          ?>
          Fynder - http://www.fynder.de - Tutorials zum Thema Technik

          Kommentar


          • #6
            Und was bringt das?

            Kommentar


            • #7
              1.) Ich muss das Rad nicht jedesmal neu erfinden, sondern habe eine Datenbank für reguläre ausdrücke. (Klar ich könnte die einfach aus anderen Scripten kopieren, aber ich find es so einfacher)

              2.) Bei einem sehr langen Regulären Ausdruck geht die Übersicht des Codes nicht verloren, sondern dieser wird ausgelagert.

              3.) Wenn ich eine Verbesserung an einem Regulären ausdruck mache oder einen Fehler korrigiere, gilt die Automatisch für alle Scripte, wo er genutzt wird und ich muss nicht 10 Scripte anpassen.

              4.) Im Code sieht man direkt, wofür ein regulärer Ausdruck steht und muss sich das nicht herleiten. (Ich finde FORM_TELEFON ist einfacher zu erkennen als /^[0-9\/\+\- ]+$/i. Letzeres könnte alles Mögliche sein. Beispielsweise Fax oder Postleitzahl)

              (Die Regeln gelten für mich, nicht unbedingt für jeden. Ich möchte jetzt keine Grundsatzdiskusion anfangen
              Fynder - http://www.fynder.de - Tutorials zum Thema Technik

              Kommentar


              • #8
                Fax ist aber ein schlechtes Beispiel

                Ich möchte jetzt keine Grundsatzdiskusion anfangen
                Ich würde gern deine (Bruchpilot) Argumente hören, die gegen den Einsatz von Konstanten sprechen. Oder meintest du speziell dieses (tatsächlich sinnlose) Konstrukt:

                PHP-Code:
                <?php
                if(!defined("FORM_TELEFON"))
                    
                define("FORM_TELEFON""/^[0-9\/\+\- ]+$/i"); ?>

                Kommentar


                • #9
                  Die Deklaration von Konstanten nimmt beim Parsen des Skripts mehr Zeit in Anspruch als die von Variablen:

                  http://www.phpfriend.de/forum/ftopic32027.html#214238
                  http://www.phpfriend.de/forum/ftopic...10.html#214342

                  Kommentar


                  • #10
                    2500 Versuche, Unterschied 0,007 Sekunden.
                    Ich finde solche minimalen Geschwindigkeitsunterschiede nicht relevant. Aber gut zu wissen.

                    Kommentar


                    • #11
                      Zitat von Zergling
                      Ich finde solche minimalen Geschwindigkeitsunterschiede nicht relevant.
                      Da hast du Recht.. ich auch nicht (ich mache auch Gebrauch von Konstanten), wobei auf langsameren System der Unterschied größer ist.

                      Achso.. und um die Frage zu beantworten:
                      Ich verwende Konstanten eigentlich nur zum Speichern von Pfadangaben oder für Einstellungen meines Mini-Debugers.

                      Kommentar


                      • #12
                        Meine Hauptkritik bei Interpretersprachen ist recht einfach beschrieben. Es bringt keine Vorteile und produziert solche "Rückfälle" wie
                        PHP-Code:
                        <?php
                        error_reporting
                        (E_ALL);
                        ini_set('display_error'true);

                        define('xyz'123);

                        function 
                        foo() {
                            
                        define('xyz'456);
                        }

                        class 
                        Bar {
                            public function 
                        __construct() {
                                
                        define('xyz'789);
                            }
                        }


                        foo();
                        $b = new Bar;
                        ?>
                        Die Technik (Datenhaltung, Lookup usw) dahinter ist genau das selbe wie zB bei $GLOBALS. Brauche ich nicht.

                        Zitat von Zergling
                        2500 Versuche, Unterschied 0,007 Sekunden.
                        Ich finde solche minimalen Geschwindigkeitsunterschiede nicht relevant. Aber gut zu wissen.
                        Was genau hast Du wie getestet?
                        Ich sag's gleich: 0,007 Sekunden liegt in aller Regel weit,weit,weit innerhalb der Messungenauigkeit und die allermeisten Testprozeduren sind größter Quatsch und komplett unaussagekräftig.

                        Kommentar


                        • #13
                          Zitat von Bruchpilot
                          Was genau hast Du wie getestet?
                          Pffff... das ist fast ein Jahr her. Das war reiner Zufall, dass ich mit der Forensuche einen eigenen Beitrag gefunden habe, ich wusste garnicht mehr, dass ich sowas mal gepostet habe.

                          Kommentar


                          • #14
                            Dein Beispiel verstehe ich nicht, Bruchpilot.
                            Dass man eindeutige Konstanten definiert ist selbstverständliche Voraussetzung.
                            Nicht umsonst gibts dafür auch PEAR-Empfehlungen, wie eine Konstante zu schreiben ist.

                            Ist wohl wieder mal Geschmackssache

                            Kommentar


                            • #15
                              Dass man eindeutige Konstanten definiert ist selbstverständliche Voraussetzung.
                              Und was ist nun der Nutzen gegenüber der neurlichen (alten) Fehlerquelle?
                              Warum soll ich etwas ohne Nutzen aber potentieller Gefahr einsetzen?
                              Die Aussage "Damit es einen festen, unveränderlichen Wert hat" kann ich bei Interpretersprachen einfach nicht nachvollziehen. Da hat kein Stück Code den anderen zu "bevormunden". Das geht gerade mal noch bei Compilersprachen gut ....und selbst da ist es aus der Mode gekommen bzw mit klaren Sichtbarkeitsregeln versehen (und ggf in die Klassen verschoben worden) worden.

                              Kommentar

                              Lädt...
                              X