Moin mein Bärchen :),
<mein-senf>
- Properties in der Model-Klasse setzen à la
$user -> username = $_POST['username']; $user -> email = $_POST['email']; $user -> password = password_hash( $_POST['password'], PASSWORD_DEFAULT );
Sowas versuche ich zu vermeiden. Es ist zwar möglich, aber es gibt ganz ganz selten den Fall wo du dich fragst "wo wird eigentlich 'username' gesetzt" (vielleicht steht ja was falsches drin). Bei dieser Umsetzung musst du nach den Stellen im Code suchen.
Deshalb würde ich IMMER get/set verwenden um etwas in ein Objekt zu bekommen. Denn wenn du dich jetzt fragst wo wird das aufgerufen, haust du einfach ein "backtrace" in den Code und schaust nach. Eventuell willst du auch mehr machen so z.B. nicht nur das Passwort übergeben sondern innerhalb der set-Methode auch gleich das Passwort verschlüsseln. Das geht auch Problemlos. Sprich der Code ist erweiterbar.
- Eine Funktion in der Model-Klasse haben, welche die Daten bei Bedarf lädt, z.B.
public function loadData( array $data ): void { foreach ( $data as $key => $value ) if ( property_exists( $this, $key ) ) $this -> { $key } = $value; }
Das wäre eine Ergänzung zu den set/get Methoden um den Aufruf möglichst schlank zu halten.
- Schon bei der Instanziierung der Model-Klasse die Properties mithilfe eines Constructors definieren lassen:
$user = new User( $_POST );
public function __construct( $body ) { foreach ( $body as $key => $value ) $this -> $key = $value; $this -> password = password_hash( $this -> password, PASSWORD_DEFAULT ); }
Das wäre wie Version 2 nur im Konstruktor. Hier hatte ich öfters das Problem, dass bevor ich etwas im Konstruktor gesetzt habe ich noch eine Logik "vorher" haben möchte. Sprich, ein setzen vor dem Konstruktor. Deshalb bin ich kein Freund von zu großer Logik im Konstruktor. Wichtige Dinge ja, große Berechnungen auf keinen Fall. Hier tendiere ich zu einem setzen der Werte via Konstruktor (sofern diese zwingend benötigt werden) und einem Aufrufen einer Methode für die Logik z.B. init().
Hier nochmal meine "Ideallösung" im Ganzen:
public function setMail( $strMail )
{
$this->strMail = $strMail;
return $this;
}
public function getMail()
{
return $this->strMail;
}
public function setData( $arData )
{
if( isset($arData["mail"]) )
{
$this->setMail( $arData["mail"] );
}
}
public function init()
{
//--- mach irgendwas
}
Kann natürlich alles noch durch Typisierung erweitert werden. Da bin ich aber gar kein so großer Freund von.
</mein-senf>
Gruß
T-Senf