Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Syntax-Frage: Kein Semikolon am Methodenende zulässig - warum?

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Syntax-Frage: Kein Semikolon am Methodenende zulässig - warum?

    Hallo,

    zu folgendem habe ich gesucht, aber nur wenig bis gar nichts darüber gefunden (und wenn, dann waren es Antworten wie "das ist so gewollt"):

    Man darf in Klassendefinitionen am Ende einer Methode KEIN Semikolon setzen.

    Bei Funktionsdefinitionen z.B. in einer Library MUSS man das aber.

    Ich finde das undurchgängig bis lästig und suche nach einem Grund, damit ich's wenigstens verstehe ...

    Im Moment bringe ich eine größere Menge an Funktionen aus einer Library in Klassen ein und garantiert übersehe ich eines oder mehrere Semikolon am Ende von Funktionen. Geht das anderen auch so?

    Weiss jemand (ausser dem totschlag-Argument oben), warum das unzulässig ist?

    Ist es wirklich "einfach so, weil es so ist"?
    Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.

  • #2
    Zitat von jwka61 Beitrag anzeigen
    Man darf in Klassendefinitionen am Ende einer Methode KEIN Semikolon setzen.

    Bei Funktionsdefinitionen z.B. in einer Library MUSS man das aber.
    Was? Du setzt niemals ein Semikolon nach einem Methodenblock (es sei denn du machst Interfaces oder abstrakte Methoden)

    PHP-Code:
    function blub() { echo "hello"; } blub(); // hello 
    funktioniert doch wunderbar
    [URL="http://goo.gl/6Biyf"]Lerne Grundlagen[/URL] | [URL="http://sscce.org/"]Schreibe gute Beispiele[/URL] | [URL="http://goo.gl/f2jR7"]PDO > mysqli > mysql[/URL] | [URL="http://goo.gl/jvfSZ"]Versuch nicht, das Rad neu zu erfinden[/URL] | [URL="http://goo.gl/T2PU5"]Warum $foo[bar] böse ist[/URL] | [URL="http://goo.gl/rrfzO"]SQL Injections[/URL] | [URL="http://goo.gl/Q81WJ"]Hashes sind keine Verschlüsselungen![/URL] | [URL="http://goo.gl/2x0e2"]Dein E-Mail Regex ist falsch[/URL]

    Kommentar


    • #3
      Das Syntax-Schema in PHP ist relativ einfach.

      Ein Anweisungsendebegrenzer ( ; ) ist nur dann nötig wenn die Anweisung eine Inline-Definition ist ( Abstrakte Methoden, Interface-Methoden, Closure, im Grunde jeder Funktionsaufruf ) oder sie keine geschweiften Klammern ( zum Einschluss von Anweisungen in einen eignen Scope ) benötigt.
      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

      Kommentar


      • #4
        ok. Scheint missverständlich formuliert:

        In der Funktionslib:
        PHP-Code:
        function fn()
        {
        }; 
        // hier MUSS ein Semikolon stehen 
        In der Klassendefinition:
        PHP-Code:
        class {
            
            function 
        fn()
            {
            }
        // hier DARF KEIN Semikolon stehen, sonst Parse error
        }; // hier DARF, muss aber nicht ein Semikolon stehen 
        Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.

        Kommentar


        • #5
          @Troy:
          NÖTIG versus ERLAUBT!

          Nach meinem Geschmack wäre es in der Klassendefinition zwar nicht NÖTIG, sollte aber - in Anlehnung an die Funktionsdefinition - ERLAUBT sein ...
          Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.

          Kommentar


          • #6
            Zitat von jwka61 Beitrag anzeigen
            In der Funktionslib:
            PHP-Code:
            function fn()
            {
            }; 
            // hier MUSS ein Semikolon stehen 
            Das ist schlicht und ergreifend falsch. Es kann eines da stehen, muss aber nicht. Warum das überhaupt erlaubt ist, entzieht sich meiner Kenntnis.
            Ich habe noch keine bibliothek gesehen, die es macht (weil es eben einfach unnötig ist)
            [URL="http://goo.gl/6Biyf"]Lerne Grundlagen[/URL] | [URL="http://sscce.org/"]Schreibe gute Beispiele[/URL] | [URL="http://goo.gl/f2jR7"]PDO > mysqli > mysql[/URL] | [URL="http://goo.gl/jvfSZ"]Versuch nicht, das Rad neu zu erfinden[/URL] | [URL="http://goo.gl/T2PU5"]Warum $foo[bar] böse ist[/URL] | [URL="http://goo.gl/rrfzO"]SQL Injections[/URL] | [URL="http://goo.gl/Q81WJ"]Hashes sind keine Verschlüsselungen![/URL] | [URL="http://goo.gl/2x0e2"]Dein E-Mail Regex ist falsch[/URL]

            Kommentar


            • #7
              class ist ein keyword das einen scope eröffnet, dieser Scope kann mit ; beendet werden ( brauch es aber nicht ). scopes die von class eröffnet werden gehören nicht dem standard-scope an und dulden keine ; nach beenden eines Scopes innerhalb der Klassendefinition. Klingt kompliziert und im bezug auf das was sonst so erlaubt ist unlogisch, ist aber so.

              KISS. Wo du ; nicht angeben brauchst, lass es. Functions ( nicht Closures ) und Classes können darauf verzichten.
              [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

              Kommentar


              • #8
                PHP-Code:
                abstract class foo{
                   abstract function 
                func2();    // funktionsdeklaration: die funktion wird bekanntbemacht
                                                 // nur bei abstrakten klassen oder interfaces möglich
                                                 // sie kann so nicht aufgerufen werden, weil nicht bekannt ist, was sie tut

                   
                public  function func1(){ }   // funktionsdefinition: die funktion wird bekanntbemacht und ausprogrammiert

                   
                public function bar(){
                      echo 
                'hallo';              // anweisung innerhalb einer funktionsdefinition
                   
                }

                   echo 
                'hallo';     // anweisung auserhalb einer funktionsdefinition
                                     // nicht erlaubt innerhalb von klassen.

                   
                ;    // (leere) anweisung auserhalb einer funktionsdefinition
                        // natürlich auch nicht erlaubt innerhalb von klassen.
                }


                function 
                func1(){ }   // funktionsdefinition
                ;                     // (leere) anweisung

                function foo();   // funktionsdeklaration
                                  // hier nicht erlaubt, da nicht innerhalb einer abstrakten klasse oder interface. 
                semilon beendet eine deklaration oder anweisung.
                eine funktionsdefinition ist mit der schließenden geschweiften klammer beendet.

                das was du die ganze zeit machst ist nur eine funktionsdefinition + eine leere anweisung.
                das anweisungen in klassen außerhalb von funktionsdefinitionen nicht erlaubt sind gibt das natürlich einen syntaxfehler.

                PHP-Code:
                class bar{}; // klassendefinition + leere anweisung
                function bar{}; // funktionsdefinition + leere anweisung 
                liebe Grüße
                Fräulein Dingsda

                Kommentar


                • #9
                  Gut vorgekau..äh erklärt.
                  [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                  Kommentar


                  • #10
                    ok, danke für die Ausführungen.

                    Ganz logisch finde ich's trotzdem noch nicht, auch mit dem, was ich hier jetzt gelesen habe - wie gesagt, ich habe mich an der Tatsache gestossen, dass es NICHT ERLAUBT ist und mit einem error endet während ich das sonst nirgends festegstellt habe ...

                    Werde mal meine Semikolon-Setzerei überdenken. Hatte bisher immer geglaubt, es wäre sauberer, am Ende eines Statemenmts, am Ende einer Definition etc. eines zu setzen ... und habe das auch immer fleissig z.B. bei if, foreach etc. gemacht ...
                    Ich muss PHP im Kontext Home Automation nutzen (Vorgabe Hersteller und nicht zu ändern). Da kommt es leider ggf. auf ms an. Deshalb manche "seltsame" Frage.

                    Kommentar


                    • #11
                      Für solche Fälle gibts Ratiopharm und Coding Standards: http://pear.php.net/manual/de/standards.php

                      Halt dich an den "strict" und alles ist im lot, was du da nicht siehst, machst du auch nicht.
                      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                      Kommentar


                      • #12
                        Ich kenne jetzt natürlich nicht alle Programmiersprachen die so existieren aber mir fallen keine ein, bei denen du nach einem Codeblock ein Semikolon setzt... Andere Sache ist die Definition (NICHT Implemetierung) der Methode (anhand C++)
                        Code:
                        class test {
                          public:
                            void doSomething(std::string* str); //Semikolon hier
                        }
                        
                        void test::doSomething(std::string* str){
                            std::cout << str.c_str() << std::endl;
                        } // KEIN Semokolon hier
                        [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

                        Kommentar


                        • #13
                          in Lisp ist das semikolon ein kommentar, möglicheweise hat er es daher.

                          Kommentar


                          • #14
                            In Javascript ist das i.d.R. auch recht sinnvoll, auch wenn Semikolons dort vielfach optional sind und Ausdrücke meist vom Zeilenende beendet werden.

                            Ganz logisch finde ich's trotzdem noch nicht, auch mit dem, was ich hier jetzt gelesen habe - wie gesagt, ich habe mich an der Tatsache gestossen, dass es NICHT ERLAUBT ist und mit einem error endet während ich das sonst nirgends festegstellt habe ...
                            Es ist logisch, Du legst nur eine falsche Denkgrundlage zu grunde. Wie dingsda bereits geschrieben hat:

                            PHP-Code:
                            function foo {
                              
                            //xy
                            }; 
                            ist eben ein Funktionsblock, gefolgt von einer leeren Anweisung. Genauso kannst Du

                            PHP-Code:
                            function foo {
                              
                            //xy
                            };;;;

                            ;;

                            ;;;;; 
                            schreiben. Das Semiokolon gehört damit nicht zum Funktionsblock.
                            [COLOR="#F5F5FF"]--[/COLOR]
                            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                            [COLOR="#F5F5FF"]
                            --[/COLOR]

                            Kommentar


                            • #15
                              Hallöchen,

                              Zitat von tr0y Beitrag anzeigen
                              class ist ein keyword das einen scope eröffnet, dieser Scope kann mit ; beendet werden ( brauch es aber nicht ).
                              Das Semikolon nach einer Klassendefinition wird allerdings auch hier als leere Anweisung interpretiert. Es besteht also keinerlei Zusammenhang mit der Klassendefinition, auch wenn dies so aussehen mag - der Geltungsbereich ist bereits geschlossen. Letztlich logisch, denn auch auf eine Klassendefinition können prozedurale Anweisungen folgen.

                              Zur Ergänzung: es gibt einen Fall, da ist das Semikolon (logischerweise) nach der schließenden geschweiften Klammer Pflicht:
                              PHP-Code:
                              $callback = function(){

                              }; 
                              // Pflicht 
                              Viele Grüße,
                              lotti
                              [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                              Kommentar

                              Lädt...
                              X