Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Stackable

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Stackable

    Ich habe ein Schönheitsproblem mit der Klasse Stackable.

    So schaut es aktuell aus:

    PHP-Code:
    <?php
       error_reporting
    (~0);
       class 
    Container extends \Stackable
       
    {
          public function 
    setB($h$i$v)
          {
             
    $aV $this['b'];
             
    $aV[$h][$i] = $v;
             
             
    $this['b'] = $aV;
          }
          public function 
    getB($h$i)
          {
             
    $aV $this['b'];
             
             if
             (
                !
    array_key_exists($h$aV) ||
                !
    array_key_exists($i$aV[$h])
             )
                throw new 
    Exception('b');
                
             return 
    $aV[$h][$i];
          }
          public function 
    getAllB()
          {
             return 
    $this['b'];
          }
       }
       
       
    $oC = new Container();
       
    $oC->setB(00100);
       
    $oC->setB(53200);
       
    var_dump($oC->getAllB());
    ?>
    Lieber wärs mir natürlich, wenn ich in der setB-Methode nur so etwas machen müsste:
    PHP-Code:
             $this['b'][$h][$i] = $v
    Erstens habe ich noch nicht verstanden, warum das nicht geht. Und zweites würd ich meine aktuelle Programmierung gern irgendwie anders - direkter gestalten.


  • #2
    $this['b'];
    not very hot.

    Viel mehr kann man bei dieser geistreichen Variablenbenamung auch nicht sagen.
    Fortgeschritten
    nope.
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      PHP-Code:
            public function setB($h$i$v)
            {
               
      $aV $this['b'];
               
      $aV[$h][$i] = $v;
               
               
      $this['b'] = $aV;
            } 
      ich bräuchte ein paar Erklärungen, was du da genau vor hast. An dieser Stelle beispielsweise, lassen wir mal aussen vor, was nikosch bereits angemerkt hat.
      Das da oben ist nicht das selbe wie:
      PHP-Code:
      $this['b'][$h][$i] = $v
      Ich nehme mal an, dein $this soll auf das aktuelle Objekt zeigen. OK, dann brauchst du aber noch ein Member, vom Typ Array so wie das ausschaut.

      Oder ich denk grade völlig am code vorbei
      Die Jatravartiden auf Viltwodl VI können den Kram von dir auch nicht nachvollziehen

      Kommentar


      • #4
        Es geht darum, dem Container Werte zu übergeben. Allerdings keine einzelnen Literale, sondern gleich ein 2-dimensionales Array (das Stück für Stück aufgefüllt wird).

        Das von mir gepostete Programm funktioniert. Ich bin mir nur noch sicher, warum. Vielleicht spielen in Stackable irgendwie die magischen Methoden __get und __set mit.

        Kommentar


        • #5
          Ok, hat sich erledigt. Stackable ist vom Typ Threaded, das ArrayAccess implementiert. Dann gehts nicht anders.

          Kommentar


          • #6
            Dein Source liest sich wie kraut und rüben. Namensgebung ist kein Grund für Buchstabensalat. Ich würde das begradigen.

            Was dein ArrayAccess angeht, das hat ein Interfaces das Methoden liefert die du statt $this als Array zu behandeln nutzen solltest.

            PHP-Code:
            class Container extends Stackable
            {
                public function 
            setB($h$item$value)
                {
                    
            $data $this->offsetGet('b');
                    
            $data[$h][$item] = $value;
                    
            $this->offsetSet('b'$data);
                }

                public function 
            getB($h$item)
                {
                    
            $lowerStage = ! array_key_exists($h$this->offsetGet('b'));
                    
            $upperStage $lowerStage && ! array_key_exists($i$this->offsetGet('b')[$h]);

                    if ( 
            $upperStage ) {
                        throw new 
            LogicException('something goes wrong at b');
                    }

                    
            retrun $this->offsetGet('b')[$h][$i];
                }

                public function 
            getAllB()
                {
                    return 
            $this->offsetGet('b');
                }

            Welchen Sinn und Zweck verfolgt denn dieser Container ? Ich denke das kann man sauberer hinbekommen.
            [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


            • #7
              Dein Source liest sich wie kraut und rüben. Namensgebung ist kein Grund für Buchstabensalat. Ich würde das begradigen.
              Ja, ich weiß, das liest sich blöd. Allerdings ist das keine Erfindung von mir. Ich gehe hier von einem Algorithmus aus, der diese Variablennamen verwendet. Ich verwende die, um leicht einen Bezug zum Algorithmus herstellen zu können.

              Was dein ArrayAccess angeht, das hat ein Interfaces das Methoden liefert die du statt $this als Array zu behandeln nutzen solltest.
              Danke für den Hinweis. Das kann ich auf jeden Fall noch ändern.

              Kommentar


              • #8
                Also bei mir funktioniert das nicht.

                PHP-Code:
                <?php
                   error_reporting
                (~0);
                   class 
                Container extends Stackable
                   
                {
                      public function 
                setB($v)
                      {
                         
                $this->offsetSet('b'$v);
                      }
                   }
                   
                $oC = new Container();
                   
                $oC->setB(1);
                ?>
                Call to undefined method Container:ffsetSet()
                Wurden diese Methoden vielleicht nicht in Threaded oder Stackable implementiert?

                Kommentar


                • #9
                  Warum versuchst du eigentlich Threading unter PHP zu verwenden? Das ist recht ungewöhnlich. Ich treffe häufiger Installationen auf RabbitMQ oder Gearman-Basis an.
                  Standards - Best Practices - AwesomePHP - Guideline für WebApps

                  Kommentar


                  • #10
                    Zitat von veryhot Beitrag anzeigen
                    Also bei mir funktioniert das nicht.

                    PHP-Code:
                    <?php
                       error_reporting
                    (~0);
                       class 
                    Container extends Stackable
                       
                    {
                          public function 
                    setB($v)
                          {
                             
                    $this->offsetSet('b'$v);
                          }
                       }
                       
                    $oC = new Container();
                       
                    $oC->setB(1);
                    ?>
                    Wurden diese Methoden vielleicht nicht in Threaded oder Stackable implementiert?
                    Jede Klasse die ArrayAccess implementiert muss diese Methoden haben: [man]ArrayAccess[/man]
                    [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


                    • #11
                      Die pthread extension biegt einiges um, selbst Sichtbarkeiten werden manipuliert. Vielleicht hilft

                      /*
                      * NOTE
                      * pthreads overrides the dimension read/writers with our own handlers
                      * Our internal handlers are not setup to execute ArrayAccess interfaces
                      * If we did execute ArrayAccess methods, you would pay a high price:
                      * referencing an array in this way would keep switching in and out of the VM to call your handlers,
                      * because these arrays are meant to provide efficiency using the ArrayAccess interface is unsuitable.
                      */
                      https://github.com/krakjoe/pthreads/...kableArray.php
                      DevBlog|3D Online-Shopping|Xatrium

                      Kommentar


                      • #12
                        Warum versuchst du eigentlich Threading unter PHP zu verwenden?
                        Nur so zum Spaß.

                        Kommentar

                        Lädt...
                        X