hotti: Array-Indexnamen nicht mehr quoten müssen

hi,

ausgehend davon, dass an der Stelle $arr['foo']; für 'foo' ohnehin ein String erwartet wird, wär's doch schön, wenn eine Schreibweise $arr[foo]; genügen würde. Gibt es irgendwo eine Konfigurations-Einstellung mit der das voreingestellt werden kann?

Noch besser dann auch sowas:

  
$currency = array( de => 'Euro', en => 'Pfunde', us => 'Dollar');  

Bitte mal um Hinweise, auch wenns nicht geht ;)
Horst

--
Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  1. Hello,

    ausgehend davon, dass an der Stelle $arr['foo']; für 'foo' ohnehin ein String erwartet wird, wär's doch schön, wenn eine Schreibweise $arr[foo]; genügen würde. Gibt es irgendwo eine Konfigurations-Einstellung mit der das voreingestellt werden kann?

    Noch besser dann auch sowas:

    $currency = array( de => 'Euro', en => 'Pfunde', us => 'Dollar');

      
    Und was möchtest Du als nächstes?  
    Vielleicht eine Schreibweise, in der Variablenbezeichner nicht mehr mit einem '$' eingeleitet werden müssen?  
      
      
      
      
    Liebe Grüße aus dem schönen Oberharz  
      
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
     ☻\_  
    /▌  
    / \ Nur selber lernen macht schlau  
    <http://bergpost.annerschbarrich.de>
    
    1. Noch besser dann auch sowas:

      $currency = array( de => 'Euro', en => 'Pfunde', us => 'Dollar');

      
      >   
      > Und was möchtest Du als nächstes?  
      > Vielleicht eine Schreibweise, in der Variablenbezeichner nicht mehr mit einem '$' eingeleitet werden müssen?  
      >   
      >   
        
      prima Idee, kriegen Programmiersprachen doch auch hin!hundertundelf  
        
      Gruß  
      Kalk
      
  2. Hi,

    ausgehend davon, dass an der Stelle $arr['foo']; für 'foo' ohnehin ein String erwartet wird, wär's doch schön, wenn eine Schreibweise $arr[foo]; genügen würde.

    Nein, weil das an der Stelle nicht von der Konstante foo zu unterscheiden wäre.

    Gibt es irgendwo eine Konfigurations-Einstellung mit der das voreingestellt werden kann?

    Du kannst höchstens am error_reporting schrauben, so dass es dir dafür keine Meldung “use of undefined constant foo, assuming 'foo'” mehr ausgibt.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. hi,

      ausgehend davon, dass an der Stelle $arr['foo']; für 'foo' ohnehin ein String erwartet wird, wär's doch schön, wenn eine Schreibweise $arr[foo]; genügen würde.

      Nein, weil das an der Stelle nicht von der Konstante foo zu unterscheiden wäre.

      Hab vor einer halben Stunde das auch in der Doku gelesen. Nunja ;)

      Gibt es irgendwo eine Konfigurations-Einstellung mit der das voreingestellt werden kann?

      Du kannst höchstens am error_reporting schrauben,

      Noi, da wird meinereinerseits nichts geschraubt ;)

      @Tom: So abwegig ist der Gedanke nicht. In Perl isses so, dass an $hash{$key}; grundsätzlich ein Scalar in $key erwartet wird, wobei Perl auch nicht zwischen Numbers und Strings unterscheidet. Das Quoten kann in Perl also komplett entfallen, außer es sind Unlauts dabei ;)

      Viele Grüße,
      Hotti

      1. Hello,

        @Tom: So abwegig ist der Gedanke nicht. In Perl isses so, dass an $hash{$key}; grundsätzlich ein Scalar in $key erwartet wird,

        Das glaube ich nicht. Es wird mMm ein Bezeichner eines Skalars erwartet.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hello,

          @Tom: So abwegig ist der Gedanke nicht. In Perl isses so, dass an $hash{$key}; grundsätzlich ein Scalar in $key erwartet wird,

          Das glaube ich nicht. Es wird mMm ein Bezeichner eines Skalars erwartet.

          ein Symbol? Nein.

          glaubs mir,

            
          $hash{foo};  
          $hash{'foo'};  
          # außer es sind scharfe Esse drin  
          $hash{'Schmeißfliege'} = 'tot';  
          
          

          ergibt dasselbe.

          Btw., PHP, was mich der Sache näherbringt, ist mysqli_fetch_object, damit geht dann eine Schreibweise like $res->url, wenn 'url' der Feldname bzw. AS ist. Ich habe demnächst (morgen) eine wilde Wüsterei mit Array's in PHP zu schreiben, das würde mir mit Perl locker von den Fingern gehen, aber in PHP ists noch etwas ungewohnt ;)

          Horsti

          1. Hi,

            Btw., PHP, was mich der Sache näherbringt, ist mysqli_fetch_object, damit geht dann eine Schreibweise like $res->url, wenn 'url' der Feldname bzw. AS ist.

            ja, da hat jemand Code geschrieben, der entsprechende Member des Objekts erzeugt.

            Ich habe demnächst (morgen) eine wilde Wüsterei mit Array's in PHP zu schreiben, das würde mir mit Perl locker von den Fingern gehen, aber in PHP ists noch etwas ungewohnt ;)

            Schreib Dir doch einen Konverter Perl-Hashes -> PHP-Arrays. Du musst ja nur Code generieren, den Du mit Copy&Paste übernehmen kannst.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. hi,

              Schreib Dir doch einen Konverter Perl-Hashes -> PHP-Arrays.

              Ja, sowas hab ich schon ;)

              Du musst ja nur Code generieren, den Du mit Copy&Paste übernehmen kannst.

              Es gibt Einiges, was konsolidiert werden kann. Was in Perl normales Handwerkzeugs ist (z.B. Hash-Slices) verbricht PHP in Funktionen, die explizit aufgerufen werden müssen (z.B. array_merge, array_combine), daran werde ich nichts ändern, solange ich PHP Code schreibe, der auch für die Kollegen lesbar sein soll ;)

              Viele Grüße,
              Horst Heizer

      2. In Perl isses so, dass an $hash{$key}; grundsätzlich ein Scalar in $key erwartet wird, wobei Perl auch nicht zwischen Numbers und Strings unterscheidet.

        Du hattest eigentlich über die unmaskierten Bezeichner als Hashkey geredet. Diese unterliegen denselben Beschränkungen wie Barewords! Das macht viel aus.

        Eine Einschränkung hast du genannt, Umlaute. Ich generalisiere das mal auf die Unicodezeichenklasse IDC. Diese Einschränkung wird aufgehoben durch die Verwendung des Pragmas utf8, ist also kein Problem in der Praxis.

        Die zweite Einschränkung sind Leerzeichen. Das ist einleuchtend.

        Die dritte Beschränkung umfasst Bezeichner, die mit Zahlen anfangen, z.B. enthält folgendes Programm einen Syntaxfehler:

          
        my %a = (9j => undef);  
        
        

        Man mag daraus schlussfolgern, dass es aus Gründen der Konsistenz es guter Stil ist, gleich alle Bezeichner zu maskieren. So verwundert es nicht, dass in PHP die für den Parser verantwortlichen Leute die Verwendung von Maskierungszeichen für Hashkeys erzwingen, wie in anderen Sprachen auch. Barewords sind nämlich immer ein Ärgernis/Stolperfalle in Perl, siehe auch Misparsing von Klassennamen als Subs oder Globs in Methodenaufrufen.

        1. hi,

          danke fpr Deine Info's!!!

          [..] Barewords sind nämlich immer ein Ärgernis/Stolperfalle in Perl,

          Nicht doch, nicht immer, was mit $x{foo} = 1; im Code steht, ist absolut eindeutig, da sind Schweifies um das {foo} und mehr brauchts nicht, ein $x{'foo'} = 1; macht den Code auch nicht besser lesbar und Verwechslungen mit Barewords sind an der Stelle ausgeschlossen ;)

          Es geht aber auch sowas in Perl: $a{uc 'a'} = 1; und Array's dürfen auch mal drin sein @a{qw(foo bar baz)} = (1,2,3); und überhaupt ist qw() eine ganz feine Sache, die in PHP total vermisse ;)

          Hotti

          --
          Lieber Bargeld als Barcode.
  3. hi,

    ho,

    ausgehend davon, dass an der Stelle $arr['foo']; für 'foo' ohnehin ein String erwartet wird, wär's doch schön, wenn eine Schreibweise $arr[foo]; genügen würde. Gibt es irgendwo eine Konfigurations-Einstellung mit der das voreingestellt werden kann?

    Nö, aber du kannst "anonyme" Objekte benutzen. Die sparen zwar nix bei der Erzeugung ...

      
    $obj = (object) array (  
        'foo' => 'fred',  
        'bar' => 'barney'  
    );  
    
    

    ..., wohl aber beim Zugriff ...

      
    echo $blurb->dum;  
    
    

    Noch besser dann auch sowas:

    $currency = array( de => 'Euro', en => 'Pfunde', us => 'Dollar');

      
    Hier ein (nicht wirklich schöner) Vorschlag:  
      
    ~~~php
      
    class assoc {  
        static function make() {  
            return new static();  
        }  
      
        function __get($var) {  
            // fuer eine genauer zielende Fehleranzeige  
            //if (!property_exists($this, $var)) {  
            //    throw new Exception("Undefined property '$var'");  
            //}  
            return $this->$var;  
        }  
      
        function __call($name, $args = null) {  
            if (is_array($args)) {  
                $this->$name = current($args);  
            }  
            else {  
                $this->__call = $name;  
            }  
            return $this;  
        }  
    }  
    
    

    Das kannst du dann so anwenden:

      
    // Objekt erzeugen  
    $currency = assoc::make()  
    // und Unfug zuweisen  
        ->de('Teuro')  
        ->en('Kilo/2')  
        ->dd('Kosakendollar')  
        ->__call('häh?');  
      
    // und ohne Funktionsaufruf wieder abfragen  
    var_dump($currency->en);  
    var_dump($currency->us);  
    
    

    Das Ganze hat auch noch laufzeittechnische Änderungen (im Gegensatz zum Array-Zugriff) zur Folge. Aber wenn du mit einer vernünftigen Scriptsprache hättest arbeiten wollen, wärst du sicher bei Perl geblieben. ;-)

    1. hi,

      $obj = (object) array (
          'foo' => 'fred',
          'bar' => 'barney'
      );

        
      Wow, der (cast) Operator ;) Das sieht gut aus, danke!!!  
        
      
      > Hier ein (nicht wirklich schöner) Vorschlag: [..]  
        
      Guck ich mir an, danke Dir!!!  
        
      
      > Das Ganze hat auch noch laufzeittechnische Änderungen (im Gegensatz zum Array-Zugriff) zur Folge. Aber wenn du mit einer vernünftigen Scriptsprache hättest arbeiten wollen, wärst du sicher bei Perl geblieben. ;-)  
        
      Leider kann ich mir das an der Stelle nicht aussuchen. Und überhaupt ists so, dass ich täglich irgendwelche 'Basteleien' vorgesetzt kriege, aus denen ich 'was machen' soll, aber wenn ich dann so nebenbei frage, warum z.B. die Tabellen nicht normalisiert sind oder warum ich einen Code schreiben soll, für das, was die DB-Engine selbst erledigen kann oder warum wir nicht einfach einen Trigger nehmen oder auf bewährte Design-Patterns zurückgreifen usw., dann kriege ich haufenweise Antworten auf Fragen, die ich gar nicht gestellt habe ... sorry, das musste ich mal los werden ;)  
        
      Viele Grüße,  
      Hotti  
      
      
    2. function __get($var) {
              // fuer eine genauer zielende Fehleranzeige
              //if (!property_exists($this, $var)) {
              //    throw new Exception("Undefined property '$var'");
              //}
              return $this->$var;
          }

        
      Das \_\_get() kann man getrost weglassen. Es würde eh nur aufgerufen, wenn die angefragte Property-Variable nicht existiert.  
        
      Also:  
        
      ~~~php
      class assoc {  
          static function make() {  
              return new static();  
          }  
        
          function __call($name, $args = null) {  
              if (is_array($args)) {  
                  $this->$name = current($args);  
              }  
              else {  
                  $this->__call = $name;  
              }  
              return $this;  
          }  
      }