Ankündigung

Einklappen
Keine Ankündigung bisher.

[erledigt] Wert aus Object in Object auslesen

Einklappen

Neue Werbung 2019

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

  • [erledigt] Wert aus Object in Object auslesen

    Hallo,
    beim spielen mit einem Suncalc PHP-Script komme ich gerade nicht weiter.
    Folgendes ist Sache:
    Ein Wert (date) soll aus einem Object/Array ausgegeben werden.
    Der gewünschte Wert wird aus dem Object/Array nur ausgegeben, wenn dieses/dieser vorher als var_dump ausgegeben wird.
    Fehlt die Zeile var_dump, oder steht hinter der Abfrage--Zeile, wird der gewünschte Wert nicht ausgegeben.

    Das Object/Array (Anfangs-Schnipsel):
    Code:
    object(SunCalc)#3 (4) {
      ["date"]=>
      object(DateTime)#4 (3) {
        ["date"]=>
        string(26) "2017-01-19 11:40:40.000000"
        ["timezone_type"]=>
        int(3)
        ["timezone"]=>
        string(3) "UTC"
      }
      ["lat"]=>
      float(48.85)
      ["lng"]=>
      float(2.35)
      ["times":"SunCalc":private]=>
      array(6) {
        [0]=>
        array(3) {
          [0]=>
          float(-0.833)
    ...
    Hier ist schon eine erste Frage: Wie ist die korrekte Bezeichnung dafür.
    1.) Object
    2.) Array
    3.) Object in Array
    4.) Array in Object
    5.) Object in Object
    6.) Object in Object mit Array?
    ....

    Mein PHP-Schnipsel:
    PHP-Code:
    $suncalc = new SunCalc(new DateTime(), 48.852.35);
    $suncalc_date $suncalc->date->date;
    echo 
    "Date: $suncalc_date";
    echo 
    "<pre>";
    echo 
    var_dump($suncalc);
    echo 
    "</pre>"
    Wenn die var_dump Zeile in zweiter Zeile steht, funktioniert es.
    Was mach ich falsch? Bzw., wie wird es richtig gemacht?

    Das PHP-Script zur Referenz als Ganzes: https://github.com/gregseth/suncalc-...er/suncalc.php

  • #2
    Dreh mal dein error_repoting auf, dann bekommst du von PHP sogar einen Hinweis:

    Notice: Undefined property: DateTime::$date in ...

    Bitte beachten: Fachfragen zu bestimmten Softwareprodukten
    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


    • #3
      Wie kommst du auf $suncalc->date->date? Du hast $suncalc, das ist ein Objekt vom Typ SunCalc. Dann greifst du auf die Variable $date zu, das liefert dir ein DateTime-Objekt zurück. DateTime hat aber kein Property mit dem Namen "date", d.h. du müsstest bei entsprechenden error_reporting hier einen Fehler bekommen.

      Kommentar


      • #4
        Warum willst du einen Wert, welchen du bei der Erstellung der Objektinstanz mit new DateTime() übergibst, nochmal aus dem Objekt holen?
        Aber egal, Tropi hat schon die richtige Antwort geliefert. Für eine Ausgabe brauchst du dann noch DateTime::format.

        PHP-Code:
        $suncalc = new SunCalc(new DateTime(), 48.852.35);
        echo 
        "Date:".$suncalc->date->format("d.m:Y H:i"); 
        Edit: Anmerkung:
        Hab mal kurz in die SunCalc reingeschaut. In der Datei jede Menge (globale) Funktionen, es wird var anstelle von public benutzt was noch aus PHP4-Zeiten stammt, dagegen wird auch die kurze Arraynotation benutzt (Ab php 5.4). Schon merkwürdig.

        Kommentar


        • #5
          Ihr habt echt Ahnung! und ich kapier mal wieder gar nichts...
          Zitat von hausl Beitrag anzeigen
          Dreh mal dein error_repoting auf, dann bekommst du von PHP sogar einen Hinweis:
          Heißt das soviel wie: Es ist noch gar kein "Datum" vergeben, mit dem die Werte berechnet werden können?
          Aber wie kommt das Datum in das Object/Array bei var_dump? und wieso krieg ich es nicht wieder (ohne var_dump) raus?

          Ich würde das alles gerne vestehen. zB wieso alles mit "echo var_dump" funktioniert, und ohne nicht.
          Ich habe jetzt mal ein "$date = date("Y-m-d H:i:s");" an den Anfang gesetzt.
          Das Auslesen der Werte krieg ich dennoch nicht hin.

          Zitat von Tropi Beitrag anzeigen
          Wie kommst du auf $suncalc->date->date?
          Dadurch:
          ["date"]=>
          object(DateTime)#4 (3) {
          ["date"]=>
          string(26) "2017-01-19 11:40:40.000000"
          Zitat von Tropi Beitrag anzeigen
          Du hast $suncalc, das ist ein Objekt vom Typ SunCalc. Dann greifst du auf die Variable $date zu, das liefert dir ein DateTime-Objekt zurück. DateTime hat aber kein Property mit dem Namen "date", d.h. du müsstest bei entsprechenden error_reporting hier einen Fehler bekommen.
          OK, "error_reporting" wieder einschalten ... ich dachte nicht, dass es soooooooo schlimm ist.

          Ich wollte nur ein bisschen mit diesem Script spielen, bzw. mit den Werten, die es ausspuckt.
          Aber wie krieg ich die Werte aus diesen Objects/Arrays?

          Am Ende des Scripts steht dieses Beispiel:
          PHP-Code:
          $test = new SunCalc(new DateTime(), 48.852.35);
          print_r($test->getMoonIllumination()); 
          Die moon-illumination Werte lese ich so aus:
          PHP-Code:
          $moonillumination $suncalc->getMoonIllumination();
          $moonfraction $moonillumination[fraction];
          $moonphase $moonillumination[phase];
          $moonangle $moonillumination[angle];
          echo 
          "Fraction: $moonfraction";
          echo 
          "Phase: $moonphase";
          echo 
          "Angle: $moonangle"
          Das error_reporting schimpft:
          Notice: Use of undefined constant fraction - assumed 'fraction' ...
          Notice: Use of undefined constant phase - assumed 'phase' ...
          Notice: Use of undefined constant angle - assumed 'angle' ...
          Und die Werte werden (ohne var_dump) angezeigt:
          Fraction: 53.61
          Phase: 73.85
          Angle: 193.62
          In der Readme steht dann noch dieses:
          SunCalc :: getMoonIllumination()
          Returns an array with the following properties:
          Damit weiß ich nichts anzufangen.

          Sorry, ich kapier es nicht.

          EDIT:
          Zitat von jspit Beitrag anzeigen
          PHP-Code:
          $suncalc = new SunCalc(new DateTime(), 48.852.35);
          echo 
          "Date:".$suncalc->date->format("d.m:Y H:i"); 
          Danke dafür!

          Kommentar


          • #6
            Zitat von psoido Beitrag anzeigen
            Aber wie kommt das Datum in das Object/Array bei var_dump? und wieso krieg ich es nicht wieder (ohne var_dump) raus?
            Weil DateTime eine PHP-interne Klasse ist. Korrektere Info, worauf du bei einem Objekt zugreifen kannst, sagt dir die Reflection (in der Konsole aufzurufen)
            Code:
            php --rc DateTime
            ergibt (gekürzt)
            Code:
            Class [ <internal:date> class DateTime implements DateTimeInterface ] {
            
              - Constants [11] {
                ...
              }
            
              - Static properties [0] {
              }
            
              - Static methods [3] {
                ...
              }
            
              - Properties [0] {
              }
            
              - Methods [15] {
                ...
              }
            }
            wie man sieht, keine (PHP) Properties definiert

            Kommentar


            • #7
              Zitat von Dormilich Beitrag anzeigen
              Weil DateTime eine PHP-interne Klasse ist. Korrektere Info, worauf du bei einem Objekt zugreifen kannst, sagt dir die Reflection (in der Konsole aufzurufen)
              Ich glaub, ich hab es jetzt kapiert. Der Hint mit "->format" hat's gebracht. Mir taugt ->format(Datetime::ATOM). und dann mit strtotime in Unix Timestamp. zum Rechnen.
              feine Sache. ich danke sehr!

              Diesen error konnt ich fix auch noch fixen, dank eines anderen Themas hier im Forum:
              Notice: Use of undefined constant fraction - assumed 'fraction' ...
              Notice: Use of undefined constant phase - assumed 'phase' ...
              Notice: Use of undefined constant angle - assumed 'angle' ...
              Siehe hier: https://www.php.de/forum/webentwickl...716#post235716
              no comment

              Kommentar


              • #8
                Zitat von psoido
                Mir taugt ->format(Datetime::ATOM). und dann mit strtotime in Unix Timestamp. zum Rechnen.
                ->format('U') gibt es dir auch gleich als Unix-Timestamp aus.
                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


                • #9
                  Zitat von hausl Beitrag anzeigen
                  ->format('U') gibt es dir auch gleich als Unix-Timestamp aus.
                  perfekt! getestet und für gut befunden.

                  Kommentar


                  • #10
                    Okay, ich hab den entsprechenden Output bei var_dump() offenbar übersehen. Dieses Verhalten (das "date" als Property angezeigt wird) ist ein Bug: https://bugs.php.net/bug.php?id=49382
                    Wie du das vermeiden kannst wurde schon gesagt - das nur als Ergänzung, das du eigentlich eh am richtigen Weg warst.

                    Kommentar


                    • #11
                      Nur als Info noch: Der PHP-Bug geht sogar so weit, das man nach var_dump() auch "plötzlich" auf die Eigenschaft zugreifen kann. https://www.php.de/forum/webentwickl...-nach-var_dump
                      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


                      • #12
                        ein Bug ... na toll.
                        Aber immerhin! Mit <div style="display:none;"><?php echo var_dump($var); ?></div> lässt sich auch schön pfuschen.

                        Kommentar


                        • #13
                          Zitat von hausl Beitrag anzeigen
                          Nur als Info noch: Der PHP-Bug geht sogar so weit, das man nach var_dump() auch "plötzlich" auf die Eigenschaft zugreifen kann.
                          Lesendes Zugreifen geht auch ohne var_dump. hellbringer hat es kürzlich erst gezeigt.

                          Kommentar


                          • #14
                            Den meinst du? https://www.php.de/forum/webentwickl...77#post1494977
                            Mir ging es nur wegen dem Bug noch als Info.
                            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