Ankündigung

Einklappen
Keine Ankündigung bisher.

Frage zu Sinn von Namespace

Einklappen

Neue Werbung 2019

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

  • Frage zu Sinn von Namespace

    Hallo zusammen,

    ich bin noch nich so tief in PHP und lerne grade die OOP. Nun bin ich da in dem kapitel namespace angelangt und kämpfe mit dem Verständnis vom Sinn des ganzen. Theoretisch klingt das ja ganz toll aber in der Praxis denk ich mir nur WTF - das is doch unnütz? Da aber das von allen verwendet wird schein ich einfach nur ein Fehler zu haben. Ich geb mal ein kleines Code beispiel und erklär mal was mein Problem ist.

    mein Projekt sieht folgendermassen aus.
    Ich habe zwei Klassen "Page.php". Eine wird beim Anzeigen von PDF Seiten benutzt. Und die andere Klasse kommt beim Paginator zum Einsatz.
    Um das so benutzen zu können habe ich nun den amespace. Die Index.php sieht daher wie folgt aus:
    Verzeichnisstruktur:
    Projektverzeichnis

    index.php
    - Model
    - PDF
    Page.php
    - Paginator
    Page.php

    PHP-Code:
    <php

    require_once './Model/PDF/Page.php';
    require_once 
    './Model/Paginator/Page.php';

    $page1 = new Model\PDF\Page();
    echo 
    $page1->getPage();

    echo 
    "<br>";

    $page2 = new Model\Paginator\Page();
    echo 
    $page2->getPage(); 
    Klasse Page.php (PDF)
    PHP-Code:
    <?php

    namespace Model\PDF;

    class 
    Page {

      private 
    $pdfPage 2;

      function 
    getPage() {
        return 
    $this->pdfPage;
      }

    }

    Klasse Page.php (Paginator)
    PHP-Code:
    <?php

    namespace Model\Paginator;

    class 
    Page {

      private 
    $paginatorPage 1;

      function 
    getPage() {
        return 
    $this->paginatorPage;
      }

    }
    Soweit so schön. Nun will man ja bei der Angabe vom Namespace nicht immer die ganzen Pfade eingeben und dafür gibs das tolle schlüsselwort "USE"
    mit dem man bei der Objekterstellung sich die Pfadangabe sparen kann indem man ein Alias fuer den klassennamen vergeben kann.

    die index.php sieht dann wie folgt aus:
    PHP-Code:
    <?php

    require_once './Model/PDF/Page.php';
    require_once 
    './Model/Paginator/Page.php';

    use 
    Model\PDF\Page as PDFPage;
    use 
    Model\Paginator\Page as PagPage;

    $page1 = new PDFPage();
    echo 
    $page1->getPage();

    echo 
    "<br>";

    $page2 = new PagPage();
    echo 
    $page2->getPage();
    Aber da kann ich doch gleich einfach meine Klassen in PDFPage.php und PagPage.php benennen und spar mir den ganzen Scheiss mit dem Namespace.
    Ich seh den Sinn einfach nicht. Kann mir einer vielleicht ein Gedankenanstoss geben? Ich denk mir halt, wenn das alle benutzen muss da doch ein Grund
    sein der einen signifikanten Vorteil liefert.

    danke schonmal im voraus

  • #2
    Der Sinn von Namespaces ist Namenskollisionen zu vermeiden. Also angenommen Hersteller A hat eine Klasse Page uind Hersteller B hat eine Klasse Page, gäbe es ohne Namespaces eine Kollision. Mit Namespaces:

    \VendorA\Page
    \VendorB\Page

    Klassen umzubenennen wäre sehr unpraktikabel, weil man das dann jedesmal neu mache müsste, wenn man sich den aktuellen Code vom Hersteller holt.

    Desweiteren dienen Namespaces auch als logische Gruppierung von Klassen. Also man hätte zB. den Unter-Namespace Controller für Controller-Klassen, den Unter-Namespace Model für Model-Klassen, usw.

    Häufig entspricht die Namespace-Struktur auch der Ordner-Struktur, was das gesamte Projekt übersichtlicher macht und im Falle von PHP das Autoloading erleichtert.

    Stichwort Autoloading: Wenn du es verwenden würdest, könntest du dir die ganzen require_once sparen.

    Kommentar


    • #3
      Des weiteren kannst Du auch "Helper" Funktionen mit einem Namespace versehen und diese bei deiner View Datei "importieren". Ich mache wie schon Hellbringer gesagt hat Namespace zu Ordnern, somit weiss ich genau, wo genau die Funktion liegt. Wirklich sehr praktisch.

      Kommentar


      • #4
        hellbringer
        Meinst du mit Code holen in Projekten wo mehrere leute im Team arbeitgen? Das würde dann auch für mich Sinn ergeben. Weil dann müssten sich die Mitarbeiter ohne namespace dauernd absprechen wer schon welche Klassennamen benutzt. Ich ging in meinen Überlegungen von Projekten aus, wo nur ein Mitarbeiter involviert ist, aber nun ist mir der Sinn klarer. Autoloader benutz ich natürlich, ich hab nur versucht den Quellcode im Beispiel so einfach wie möglich zu halten. Benutze dazu spl_autoload_register weil autoload javeraltet ist ( http://php.net/manual/de/function.autoload.php )

        Danke auf jeden Fall für eure Anmerkungen. Das hat mir enorm geholfen.

        Kommentar


        • #5
          Also für jeden Mitarbeiter einen Namespace halte ich persönlich für übertrieben, muss aber jeder für seinen Anwendungsfall selber entscheiden, eine technische Einschränkung gibt es da nicht. Bei Abteilungen macht das ggf. schon mehr Sinn (Frontend/Backend/API), aber i.d.R. wird das projektbasiert verwendet. Und mehrere Leute hast du ja schon, wenn du dir mal von Github eine Lib holst. Die soll deinen eigenen Namespace ja schon mal nicht zumüllen.
          [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

          Kommentar


          • #6
            Zitat von graysorn2019 Beitrag anzeigen
            Meinst du mit Code holen in Projekten wo mehrere leute im Team arbeitgen? Das würde dann auch für mich Sinn ergeben. Weil dann müssten sich die Mitarbeiter ohne namespace dauernd absprechen wer schon welche Klassennamen benutzt.
            Noch eine Ebene darüber... er spricht von "Hersteller A und B", das sind eigene Firmen, wo u.U. mehrere Leute an einem Projekt arbeiten. Innerhalb von Firma A kann man sich absprechen, aber übergreifend zu B geht das halt nicht.

            Think big(ger)!

            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

            Kommentar


            • #7
              Zitat von graysorn2019 Beitrag anzeigen
              hellbringer
              Meinst du mit Code holen in Projekten wo mehrere leute im Team arbeitgen?
              Wenn du dir zB ein Update einer Lib holst, musst du jedes Mal alle deine Anpassungen darin machen. "Externen" Code gibt man in der Regel in den /vendor/ Ordner und den rührt man nicht an, den nutzt man nur im Sinne Blackbox.. du steckst was rein und bekommst was raus. Also quasi du Programmierst gegen ein Interface und der Hersteller des Codes kümmert sich bei Updates darum das dieses Nutzung auch später noch funktioniert. (Mehr oder weniger ja nach Minor/Major Update etc etc..)

              Dazu kann es zB auch vorkommen das eine Mailerklasse einen eigenen vendor Ordner hat und auch wieder solche externe Libs nutzt. In Composer kann man dann benötigte Versionsnummern verankern etc etc..
              The string "()()" is not palindrom but the String "())(" is.

              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar


              • #8
                Zitat von graysorn2019 Beitrag anzeigen
                Hallo zusammen,

                ich bin noch nich so tief in PHP und lerne grade die OOP. Nun bin ich da in dem kapitel namespace angelangt und kämpfe mit dem Verständnis vom Sinn des ganzen. Theoretisch klingt das ja ganz toll aber in der Praxis denk ich mir nur WTF - das is doch unnütz?
                Eine weitere Möglichkeit ist, den NS für Ordner-Hierarchien zu verwenden um so ein include_gedöns für immer zu beerdigen. Da kannst Du Dir nen schönen Classloader erstellen, der immer aus dem korrekten Ordner Deine Klassen lädt und brauchst nurnoch einmal ein zentrales require_once im loader. Allein schon das reicht mir um es zu nutzen.
                bitcoin.de <- Meine Freelancerwährung

                Kommentar


                • #9
                  Siehe zb hier: https://www.php-fig.org/psr/psr-4/
                  The string "()()" is not palindrom but the String "())(" is.

                  Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                  PHP.de Wissenssammlung | Kein Support per PN

                  Kommentar

                  Lädt...
                  X