Ankündigung

Einklappen
Keine Ankündigung bisher.

Magische methoden

Einklappen

Neue Werbung 2019

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

  • Magische methoden

    Hallo allerseits,

    Vorweg, ich bin ein ziemlicher Noob im OOP - bitte habt etwas Gnade.

    folgendes Vorhaben: ich will ein kleines Templatesystem bauen - OOP learning.
    Nun scheitere ich schon so ziemlich am Anfang - genauer beim "loop".

    Ich will das ganze so aufbauen:
    index.php
    PHP-Code:
    <?php
    require('template.php');
    $tpl = new Template('default.html');

    $tpl->title 'Test';
    $tpl->nav[] = ['item' => 'Home'];
    $tpl->nav[] = ['item' => 'About'];

    echo 
    $tpl->html();
    "title" & "nav" sind variablen - welche ich mit __set() und __get() in die Klasse zurück übergebe:
    template.php
    PHP-Code:
    <?php
    class Template  {
        protected 
    $path,
        
    $values = array();

        public function 
    __construct(string $path) {
            
    $this->path $path;
        }

        public function 
    html() : string {
            if(!
    file_exists($this->path))
                return 
    "Error loading template file $this->path";

            
    $output file_get_contents($this->pathFILE_USE_INCLUDE_PATH);

            foreach(
    $this->values as $key => $value) {
                
    $tag "{".$key."}";
                
    $output str_replace($tag$value$output);
            }

            return 
    $output;
        }

        public function 
    __set($key$value) {
            
    $this->values[$key] = $value;
        }

        public function &
    __get($name) {
            return 
    $this->$name;
        }
    }
    Jetzt passiert jedoch folgendes, wo ich mir grad die Zähne daran ausbeiße.
    "$tpl->nav[]" wird nicht in die $values übernommen, ein Auszug wie das ganze jetzt ausschaut:
    PHP-Code:
    Template Object (
        [
    path:protected] => default.html
        
    [values:protected] => Array
            (
                [
    title] => Test
            
    )

        [
    nav] => Array
            (
                [
    0] => Array
                    (
                        [
    item] => Home
                    
    )

                [
    1] => Array
                    (
                        [
    item] => About
                    
    )
            )

    Ich weiß nicht weiter - wie bekomme ich das "nav-array" in die $values ?
    Mit ArrayAccess habe ich es auch versucht - lt. Google-Recherche - jedoch erfolglos.

    Danke im voraus für eure Hilfe.

  • #2
    Von magischen Gettern und Settern solltest du dich am besten gleich wieder verabschieden, da diese den Code schlechter lesbar machen und keine mir bekannte IDE damit umgehen kann.

    Kommentar


    • #3
      MOD: Verschoben von PHP-Fortgeschritten
      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


      • #4
        Deine __get-Implementierung ist falsch:

        PHP-Code:
        public function &__get($name) {
          return 
        $this->$name// !!

        [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

        Kommentar


        • #5
          Zitat von hellbringer Beitrag anzeigen
          Von magischen Gettern und Settern solltest du dich am besten gleich wieder verabschieden, da diese den Code schlechter lesbar machen und keine mir bekannte IDE damit umgehen kann.
          Danke für den Tipp, mir geht es hier jedoch mehr ums Verständnis und Handhabung der Funktionen - und um OOP besser kennenzulernen.

          Zitat von lottikarotti Beitrag anzeigen
          Deine __get-Implementierung ist falsch:

          PHP-Code:
          public function &__get($name) {
          return 
          $this->$name// !!

          Super, danke für den Tipp - habe es nun geschafft das das Array auch in die $values enthalten ist.
          PHP-Code:
          public function &__get($name) {
                  if(!isset(
          $this->values[$name]))
                      
          $this->values[$name] = NULL;

                  return 
          $this->values[$name];
              } 
          Danke nochmal

          Kommentar


          • #6
            Zitat von Mirkec Beitrag anzeigen
            Danke für den Tipp, mir geht es hier jedoch mehr ums Verständnis und Handhabung der Funktionen - und um OOP besser kennenzulernen.
            Magische Getter und Setter sind eine Eigenheit von PHP und nichts was zu OOP zählt. Wenn du OOP lernen willst, solltest du sie am besten ignorieren.

            Kommentar


            • #7
              Natürlich zählt es zu OOP, es sind Methoden. Und das nicht verwenden zu sollen ist Quatsch.
              PHP-Manual ¡ mysql_* ist veraltet ¡ Debugging: Finde DEINE Fehler selbst ¡ Passwort-Hashing ¡ Prepared Statements

              Kommentar


              • #8
                Zitat von Ulfikado Beitrag anzeigen
                Natürlich zählt es zu OOP, es sind Methoden.
                Es sind magische Methoden und das ist eine Eigenheit von PHP.

                Zitat von Ulfikado Beitrag anzeigen
                Und das nicht verwenden zu sollen ist Quatsch.
                So wie global und eval()?

                Kommentar


                • #9
                  Es ist korrekt, dass magische Methoden eine Eigenheit von PHP sind.
                  Allerdings sind es in diesem Fall nur Getter und Setter. Diese Art von Methoden sind keineswegs eine Eigenheit von PHP und im OOP Kontext weit verbreitet.

                  Das Problem, das der TE hat, beruht im Kern nicht auf die Verwendung von magischen Methoden.
                  Dennoch ist der Hinweis aus #6 völlig korrekt.
                  Competence-Center -> Enjoy the Informatrix
                  PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                  Kommentar


                  • #10
                    Zitat von Arne Drews Beitrag anzeigen
                    Allerdings sind es in diesem Fall nur Getter und Setter.
                    Es sind magische Getter und Setter und das ist eine Eigenheit von PHP.

                    "Richtige" Getter und Setter wären getFoo(), setFoo($value), usw.

                    Properties (wie sie meist genannt werden) mit eigenen Gettern und Settern sehen wieder anders aus.

                    JavaScript: get foo(); set foo(value);
                    C#: public string Foo { get; set; }

                    Etwas Vergleichbares gibt es bei PHP nicht. Also wenn man OOP vernünftig lernen will, sollte man sich das eher bei anderen Sprachen abschauen und nicht bei PHP. PHP ist was OOP anbelangt mehr oder weniger noch in den Kinderschuhen, mit PHP 7 vielleicht auch schon im Teenager-Alter.

                    Kommentar


                    • #11
                      Das ist mir klar. Ich wollte darauf hinaus, dass der TE das gleiche Problem hätte, wenn seine Getter und Setter eben nicht magisch, sondern gewöhnliche Methoden wären.
                      Competence-Center -> Enjoy the Informatrix
                      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                      Kommentar


                      • #12
                        Zitat von Arne Drews Beitrag anzeigen
                        Das ist mir klar. Ich wollte darauf hinaus, dass der TE das gleiche Problem hätte, wenn seine Getter und Setter eben nicht magisch, sondern gewöhnliche Methoden wären.
                        Nein, weil dann würde er den Variablennamen nicht als Parameter übergeben, sondern die IDE (und spätestens PHP) würde ihm eine deutliche Fehlermeldung vor die Nase werfen, dass die Methode nicht existiert. Das ist eben der große Vorteil, wenn man auf so magischen Mist verzichtet. Fehler scheinen schon frühzeitig in der IDE auf. Und falls er es doch mal in Produktivcode schafft, gibt es eine leicht nachvollziehbare Fehlermeldung am Server.

                        Kommentar

                        Lädt...
                        X