Objektorientierte ID-Verwaltung in PHP

Es gibt viele Fälle, bei denen man eindeutige Zahlen zum Identifizieren von Daten hat. In MySQL gibt es hierfür die Kennzeichnung „auto_increment“. Dabei werden die IDs automatisch erhöht, wenn ein neuer Datensatz hinzugefügt wird. Aber für PHP gibt es nichts in der Richtung. Deshalb habe ich für mein Framework eine Komponente namens FW_Tool_ID geschrieben.

Der ID-Generator umfasst nur wenige Zeilen und kann IDs mit einem beliebigen Startwert erhöhen. Momentan wird nur die Schrittweite 1 unterstützt. Das könnte man aber problemlos erweitern. Der Code lautet folgendermaßen:

class FW_Tool_ID
{
  private $current_id = 0;

  private $formerIDs = array();

  public function setID($id)
  {
    $validator = new FW_Validator_Type_Integer(array("to_check" => $id));
    if($validator->isValid())
    {
      $this->current_id = $id;
      $this->formerIDs[] = $id;
    }
    else
    {
      throw new FW_Tool_Exception("Invalid ID given: ".$id);
    }
    return $this;
  }

  public function idExists($id)
  {
    return in_array($id, $this->formerIDs);
  }

  public function reset()
  {
    $this->setID(0);
    return $this;
  }

  public function getID()
  {
    return $this->current_id;
  }

  public function next()
  {
    $this->setID($this->getID()+1);
    return $this;
  }
}

Der Konstruktor ist parameterlos. Mithilfe von setID kann man eine ID setzen. Beim Aufruf der Methode next() wird die ID um 1 erhöht und eine Referenz auf den ID-Generator wird zurückgegeben. Wenn man getID() aufruft, wird die aktuelle ID zurückgegeben.

Alle IDs werden in einem Array mitgeloggt. So kann man durch den Aufruf von idExists(5) beispielsweise überprüfen, ob die ID 5 existiert. Möchte man den Generator wieder auf 0 setzen, ruft man einfach reset() auf.

Verwendung

Anwenden kann man die Klasse wie folgt.

$generator = new FW_Tool_ID();
$generator->setID(1000); //Wir wollen, dass die IDs bei 1000 anfangen
echo $generator->next()->getID(); //Ausgabe: 1001

Viel Spaß damit!

1 Star2 Stars3 Stars4 Stars5 Stars (1 Stimme, durchschnittlich 3,00 / 5)
Loading...


6 Kommentare zu “Objektorientierte ID-Verwaltung in PHP”

  1. […] Objektorientierte ID-Verwaltung in PHP […]

  2. Hallo,

    habe mir die kleine Klasse hier mal angeschaut und finde das geht besser. Ich finde es auch nicht schön das du eigentlich keine Kommentare in solchen Codeschnippseln schreibst. Desweiteren bindest du hier eine Validatorklasse ein die gar nicht nötig ist und keiner kann den Code wirklich verwenden weil keiner weis was sich hinter der eingebundenen Klasse verbirgt. Wobei ich das dann auch nicht so gemacht hätte sondern in in From von Type Hinting.

    Ich habe auch ma eine kleine Klasse geschrieben, vieleicht packst die in einen Code Block für die Formatierung.

    Danke und schöne Grüße Daniel

    Datei in der die Klasse geschrieben steht

    /*
    *
    * ID Generator Klasse
    *
    */
    class IdGeneratorClass{

    private $id;
    private $lastId;
    private $idArray;

    public function __construct(){}

    /*
    *
    * setzen einer id wenn es eine einzelne feststehende zahl ist
    *
    */
    public function setID($id){

    $this->id = $id;
    }

    /*
    *
    * wenn die datzen aus einem array kommen mit prüfung ob übergebener parameter ein array ist
    *
    */
    public function setIdArray($idArr = array()){

    if(!is_array($idArr)){

    throw new Exception(‚this Parameter is not array‘);
    } else {

    $this->idArray = $idArr;
    }
    }

    /*
    *
    * ermitteln des höchsten wertes des arrays
    *
    */
    public function searchMaxInt(){

    $maxId = max($this->idArray);
    $this->id = $maxId;
    }

    /*
    *
    * prüfen ob übergebene zahl eine integer zahl ist bevorsie freigegeben wird
    *
    */
    public function checkValidInt(){

    if(!is_int($this->id)){

    throw new Exception(‚this ID ist not integer‘);
    } else {

    $this->lastId = $this->id;
    }
    }

    /*
    *
    * erhaltene id um eins erhöhen
    *
    */
    public function countIdToNext(){

    $this->lastId += 1;
    }

    /*
    *
    * fertige generierte id ausgeben für weiteres verarbeiten
    *
    */
    public function getId(){

    return $this->lastId;
    }
    }

    So wird die Klasse dann eingesetzt

    error_reporting(E_ALL | E_STRICT);
    ini_set(‚display_errors‘, TRUE);

    require_once(‚IdGeneratorClass.php‘);

    /*
    *
    * wenn ein array übergeben wird
    *
    */
    $newId_1 = new IdGeneratorClass();

    $werte = array(1, 7, 78, 5);

    $newId_1->setIdArray($werte);
    $newId_1->searchMaxInt();
    $newId_1->checkValidInt();
    $newId_1->countIdToNext();

    $id_1 = $newId_1->getId();

    echo $id_1.“;

    /*
    *
    * wenn eine einzelwert übergeben wird
    *
    */
    $newId_2 = new IdGeneratorClass();

    $newId_2->setID(45);
    $newId_2->checkValidInt();
    $newId_2->countIdToNext();

    $id_2 = $newId_2->getId();

    echo $id_2;

  3. Bei der Geschichte mit dem Validator muss ich dir Recht geben. Beim Rest allerdings nicht. PHP unterstützt kein Type-Hinting von integern – Wie hätte ich das also machen sollen? 😉

    Deine Klasse finde ich persönlich nicht schön, aber das ist Geschmackssache. Besonders das mit checkValidInt() verstehe ich nicht. Es kann ja im Prinzip nie was anderes als ein int drin sein.

    MfG
    Simon

  4. Hallo,

    da eine ID eindeutig sein sollte, würde ich eine statische Klasse daraus machen oder Dein „Singleton-Pattern verwenden. 😉

    Gruss Renato

  5. Das wäre doch total schwachsinnig und würde nichts bringen 😉 Ich muss nur prüfen, ob ich die generierte ID schonmal in der DB (oder wo auch immer habe), und dafür ist die Klasse nicht zuständig.

  6. Hy,

    warum nicht >>Eindeutige und zufällige Hashes mit PHP generieren (OOP-Klasse)<< für die DB verwenden?

    Ich finde es besser wenn die Anwendung zur Laufzeit die ID schon kennt!

    mfg heiko

Hinterlasse einen Kommentar!

Time limit is exhausted. Please reload the CAPTCHA.

»Informationen zum Artikel

Autor: Simon
Datum: 20.12.2009
Zeit: 22:22 Uhr
Kategorien: Codeschnipsel
Gelesen: 6027x heute: 3x

Kommentare: RSS 2.0.
Diesen Artikel kommentieren oder einen Trackback senden.

»Meta