Klassenabstraktion | Logik

lockcat

Erfahrenes Mitglied
Hallo Community,

hin und wieder versuche ich mein Wissen in PHP weiter zu bringen. Ich mache dieses nicht beruflich sondern nur rein Privat für mich :D

Gehen wir davon aus ich habe diese Funktion

PHP:
public function fetchServer($id)
    {
        $stmt = $this->pdo->prepare("SELECT `id`, `serverName`, `ip` FROM `server` WHERE id = :id");
        $stmt->execute(['id' => $id]);
        $stmt->setFetchMode(PDO::FETCH_CLASS, "App\\Server\\ServerModel");
        $server = $stmt->fetch(PDO::FETCH_CLASS);

        return $server;

    }

Ich übergebe die Datenbank Ergebnisse an einem Model "App\\Server\\ServerModel"

PHP:
<?php

namespace App\Server;

use ArrayAccess;

class ServerModel implements ArrayAccess
{
    public $id;
    public $serverName;
    public $ip;

    /**
     * Whether a offset exists
     * @link http://php.net/manual/en/arrayaccess.offsetexists.php
     * @param mixed $offset <p>
     * An offset to check for.
     * </p>
     * @return boolean true on success or false on failure.
     * </p>
     * <p>
     * The return value will be casted to boolean if non-boolean was returned.
     * @since 5.0.0
     */
    public function offsetExists($offset)
    {
        return isset($this->$offset);
    }

    /**
     * Offset to retrieve
     * @link http://php.net/manual/en/arrayaccess.offsetget.php
     * @param mixed $offset <p>
     * The offset to retrieve.
     * </p>
     * @return mixed Can return all value types.
     * @since 5.0.0
     */
    public function offsetGet($offset)
    {
        return $this->$offset;
    }

    /**
     * Offset to set
     * @link http://php.net/manual/en/arrayaccess.offsetset.php
     * @param mixed $offset <p>
     * The offset to assign the value to.
     * </p>
     * @param mixed $value <p>
     * The value to set.
     * </p>
     * @return void
     * @since 5.0.0
     */
    public function offsetSet($offset, $value)
    {
        $this->$offset = $value;
    }

    /**
     * Offset to unset
     * @link http://php.net/manual/en/arrayaccess.offsetunset.php
     * @param mixed $offset <p>
     * The offset to unset.
     * </p>
     * @return void
     * @since 5.0.0
     */
    public function offsetUnset($offset)
    {
        unset($this->$offset);
    }
}

Nun meine Frage:

Da ich später nicht nur ein Model nutzen möchten sondern vllt. auch UserModel, ForumModel usw. habe ich mir gedacht, da ja der Code im Model 90% generisch ist einfach ein AbstractModel zu erstellen. So spare ich mir einfach viel schreibarbeit. Ist dies Sinnig? bin ich da auf ein Holzweg?

Ich muss dazu sagen ich lerne das ganze in OOP grade erst und komme auch oft durcheinander. Ich beschreibe mich selbst noch als Anfänger....

LG,
Lockcat
 
Hi

was soll in diesem AbstractModel dann sein?

Btw., DB-Ergebnisse an ein Model "übergeben" klingt falsch ... gerade das Model (und nicht Controller und View) soll für die gesamte Datenaufbewahrung zuständig sein.
 
Hi,

Ich sitze Grade nicht mehr am PC... Am Smartphone ist es nicht so leicht zu schreiben bzw an Hand von Beispieln. Ich versuche es einfach mal...


Übergeben ist auch falsch, falsch ausgedrückt ~ da ich gerne die abfrage als Objekt behandeln daher "ArrayAccess" nun benötigt dieses implements einige Funktionen. Nun habe ich mir gedacht, da es für mich generisch ausschaut es einfach abstrakt zu programmieren. Jedes Model wo ich nun "ArrayAccess" benötige, vererbe ich es einfach.

Ich Bitte, wenn man meine Logik Grade nicht verstehen nicht gleich die DonnerKeule raus zu holen. Für mich ist es garnicht so leicht zu erklären ~ ich verstehe Grade etwas in der Umsetzung. Viel mehr kann ich sogar mit meiner Logik total falsch liege
 
Also, es spricht natürlich nichts dagegen, gemeinsame Methoden zwischen Klassen zu teilen.

In PHP wären aber evt. Traits dafür mehr angebracht (im Wesentlichen die Möglichkeit, Code in mehrere Klassen "einzufügen", ohne dabei eine Vater-Kind-Beziehung zu signalisieren)
 
Nicht schlecht, das kannte ich noch gar nicht. Jedoch muss ich erstmal damit rumspielen.

Ich habe es jetzt für mich zum üben in der Abstrakten Schreibweise gelöst.
Zudem muss ich mich einmal korrigieren, ich nannte oben ein "AbstractModel" ich meinte ein Repository. Ich meinem Kopf lief an dem Abend einiges schief :D MVC sitzt hoffentlich nun richtig im Kopf

PHP:
<?php

namespace App\Core\Abstracts;

use PDO;

abstract class AbstractRepository
{
    private $pdo;

    function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    abstract public function getTableName();

    abstract public function getModelName();


    public function all()
    {
        $table = $this->getTableName();
        $model = $this->getModelName();
      
        $stmt = $this->pdo->query("SELECT * FROM `$table` ");
        $entries= $stmt->fetchAll(PDO::FETCH_CLASS, $model);
      
        return $entries;
    }

    public function find($id)
    {
        $table = $this->getTableName();
        $model = $this->getModelName();
      
        $stmt = $this->pdo->prepare("SELECT * FROM `$table` WHERE id = :id");
        $stmt->execute(['id' => $id]);
      
        $stmt->setFetchMode(PDO::FETCH_CLASS, $model);
        $entrie= $stmt->fetch(PDO::FETCH_CLASS);
      
        return $entrie;

    }
}

PHP:
<?php

namespace App\Server;


use App\Core\Abstracts\AbstractRepository;

class ServerRepository extends AbstractRepository
{

    public function getTableName()
    {
        return "server";
    }

    public function getModelName()
    {
        return "App\\Server\\ServerModel";
    }

}
 
Zurück