Lustgies Programmiergefrickel mit PHP

Im ckl-net geht es voran: Gestern saß ich den kompletten Tag vor dem Notebook und habe ein paar Klassen für das Zend Framework geschrieben.
Das eine Package (Ckl_Grabber_Tvinfo) grabbt das aktuelle Fernsehprogramm von http://www.tvinfo.de, das andere Package (Ckl_Calendar) erzeugt über einen bestimmten Datumsbereich einen Kalendar. Der Kalendar lässt sich soweit einschränken, dass über Handler nur bestimmte Datumsangaben zugelassen werden. Diese Handler sind eigenständige Klassen und müssen das Interface Ckl_Calendar_Handler_Interface implementieren.
Wie dem auch sei: den letzten der drei Handler, die ich gestern programmierte, sollte nur Daten zulassen, die über eine Anzahl von Tagen in einem bestimmten Wochenabstand statt finden. Wörtlich gesprochen: “Alle 2 Wochen soll für 3 Tage dies und das statt finden.”.
Mit Hilfe der Zend_Date-Klasse hatte ich den Ansatz zur Lösung des Problems auch relativ schnell heruntergetippert. Sah dann so aus:

    private function generateDates($aDateStart, $aDateEnd, $aDays, $aWeekDistance)
    {
        $currentDate = $aDateStart;
        $sourceDate = $aDateStart;
        $dayCounter = 1;

        while ($aDateEnd->isLater($currentDate)) {
            array_push($this->_arrDates, $currentDate->toString());

            if ($dayCounter < $aDays) {
                $currentDate->addDay(1);
                $dayCounter++;
            } else {
                $currentDate = $sourceDate;
                $currentDate->addWeek($aWeekDistance);
                $sourceDate = $currentDate;
                $dayCounter = 1;
            }
        }
    }

An sich ist der Code soweit ok: solange das Enddatum größer als dem ggw. Datum ist, wird das Datum gespeichert. Bei Erreichen der Tagesanzahl (in unserem Beispiel oben: 3 Tage) wird das letzte Ausgangsdatum genommen und der Wochenabstand (2 Wochen) auf addiert.
Leider funktioniert der Code nicht so, wie er sollte: Nach der zweiten Erhöhung der Woche ist der Ausgangswochentag falsch gewesen.
Nach einigem Überlegen fand ich dann den Fehler: Sowohl $currentDate als aus $sourceDate sind *keine* Kopien von $aDateStart, sondern Referenzen. Ein böser Fehler, der mir in PHP4 nicht hätte passieren können.
Der funktionierende Code sieht nun so aus:

    private function generateDates($aDateStart, $aDateEnd, $aDays, $aWeekDistance)
    {
        // Objekte ***muessen*** geklont werden. Ansonsten funktioniert das nicht.
        $currentDate = clone $aDateStart;
        $sourceDate = clone $aDateStart;
        $dayCounter = 1;

        while ($aDateEnd->isLater($currentDate)) {
            array_push($this->_arrDates, $currentDate->toString());

            if ($dayCounter < $aDays) {
                $currentDate->addDay(1);
                $dayCounter++;
            } else {
                $currentDate = clone $sourceDate;
                $currentDate->addWeek($aWeekDistance);
                $sourceDate = clone $currentDate;
                $dayCounter = 1;
            }
        }
    }

Sobald mein Embedded-Board aufgesetzt ist, sind die Klassen im Subversion-Repo des ckl-nets verfügbar.

Leave a reply

Your email address will not be published.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>