Hello,
<?php
class Colors
{
private $_serFileName = "myColorsShuffled.ser";
***** Warum die Farben hart codieren in der Klasse?
***** besser wäre es, sie ebenfalls im Datenfile zu halten.
***** sie sind ja nicht "gottgegeben", wie "Ja/Nein", Monatsliste (in einer Sprache), usw.
private $_colors = array("blau", "rot", "grün", "schwarz");
private $_colorsShuffled = array();
private $_nextColor = "";
public function __construct() {
if(!file_exists($this->_serFileName)) {
***** Tocttou-Fehler! *****
$this->_createNewShuffledFile();
***** Verstümmelungsgefahr *****
}
$this->_read();
}
private function _createNewShuffledFile() {
$this->_colorsShuffled = $this->_colors;
shuffle($this->_colorsShuffled);
$this->_write();
}
***** Tocttou-Fehler! ******
private function _write() {
file_put_contents($this->_serFileName, serialize($this->_colorsShuffled));
}
private function _read() {
$this->_colorsShuffled = unserialize(file_get_contents($this->_serFileName));
***** fehlende Fehlerbehandlung. unserialize() könnte false liefern.
***** file_get_contents() könnte auch schon einen Fehler werfen und false liefern
}
***** file_put_contents() und file_get_contents() lassen sich nicht atomar binden
***** sind daher ungeeignet für datenverändernde Operationen im Konkurrenz-Umfeld
public function getNext() {
//~ var_dump($this->_colorsShuffled);
if (count($this->_colorsShuffled) === 0) {
$this->_createNewShuffledFile();
}
$actualColor = array_shift($this->_colorsShuffled);
$this->_write();
return $actualColor;
}
};
$myColors = new Colors();
echo $myColors->getNext();
Geschachtelte Funktionen sind "i-bäh", wenn man eigentlich diskrete Fehlerbehandlung betreiben muss, also die Fehler von Funktionen einzeln auswerten muss, weil sie ggf. reparierbar sind.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
☻\_
/▌
/ \ Nur selber lernen macht schlau
<http://bikers-lodge.com>