Ich habe ein Projekt, das ich mit struktureller Programmierung erstellt habe, die ich als ein objektorientiertes Projekt in der "bestpractices" Weise umgestalten möchte. Ich werde wahrscheinlich der einzige sein, der dieses Projekt benutzt, es ist nicht wirklich für andere gedacht. Aber ich könnte es anderen als Beispiel für Exzellenz zeigen;)PHP-Projektstruktur
Meine Fragen sind ziemlich allgemein, aber ich hoffe, das ist in Ordnung.
Ich denke darüber nach, es auf drei Arten aufgeteilt zu haben; Backend (die Hauptklasse), Frontend (Get und Posts Check, Call Class Funktionalität), Visual (mit Twig Templating). Mein Projekt verwendet eine externe Integration für die IPS-Forum-Software (die Benutzersitzungen werden dort gespeichert). Siehe unten für meine Code-Idee, wie man das strukturiert.
Meine Fragen:
- Ist meine allgemeine Struktur mit der Klasse ok von "Frontend" wie folgt getrennt?
- Ist meine Idee, das Mitglied Lookup/Behandlung von IPS außerhalb der Klasse ok, wie ich später zu anderen Element-Funktionalität im Frontend wechseln können, ohne mit Backend zu verwirren? Setzen Sie das Member-Objekt von wo aus in die Klasse, und stellen Sie sicher, dass die Klasse mindestens immer verwendet wird.
- Sollte ich die Mitgliedsdaten als Parameter an die Klasse (Konstrukt) senden, oder es wie jetzt beibehalten und eine öffentliche Klassenvariable vom Frontend setzen?
- Sollte meine Klasse Ausnahmen auf Fehler werfen oder true/false zurückgeben und eine Fehlermeldung setzen?
- Sollte das Frontend auch eine Klasse sein? Die Hauptklasse erweitern?
- Das Setzen von Fehlermeldungen in __construct ist ok, oder sollte das anderswo gemacht werden?
- Soll die MyProject-Klasse in mehrere Klassen aufgeteilt werden? Das aktuelle Projekt im Strukturcode ist 10000 Zeilen, die neue Klasse könnte etwa die Hälfte sein, da ich eine Menge Visual-Rendering-Sachen wegnehme. Vielleicht Klassen für MyProjectDisplayData und MyProjectCreateData und so?
- Wenn Antwort auf 7 ja ist, sollte ich eine Kernklasse für Nachrichten, db und allgemeine Funktionalität haben, die die anderen spezifischen Klassen "erweitert"?
- Gibt es noch etwas, was man anders machen könnte?
myproject_class.php:
namespace MySpace;
use \PDO;
use \PDOException;
use \Exception;
class MyProject {
public $projectdata;
public $errormessages;
public $ips_member;
function __construct() {
//set up vars for error messages
$this->errormessages["database_queryfailed"] = "Query failed";
$this->errormessages["general_missingdata"] = "Missing data";
$this->errormessages["handling_something"] = "Some error";
}
public function displaySomeData ($id) {
if ($id == ""){
throw new Exception($this->$errormessages["general_missingdata"]);
}
try{
$sql = "GET SOME DATA FROM DB";
//PDO execute
}catch (PDOException $e) {
throw new Exception($this->$errormessages["database_queryfailed"] . " SQL: " . $sql);
}
$this->projectdata = array();
$this->projectdata["one"] = "cool";
$this->projectdata["two"] = "verycool";
if ($someerror){
throw new Exception($this->$errormessages["handling_something"]);
}
}
public function createSomeData(){
try{
$sql = "INSERT SOME DATA IN DB";
//PDO execute
}catch (PDOException $e) {
throw new Exception($this->$errormessages["database_queryfailed"] . " SQL: " . $sql);
}
}
}
Frontend index.php:
require_once 'vendor/autoload.php';
require_once 'myproject_class.php';
require 'forum/init.php';
//forum initialize
\IPS\Session\Front::i();
$ips_member = \IPS\Member::loggedIn();
//load class
try {
$myproj = new MySpace\MyProject();
$myproj->ips_member = $ips_member;
} catch (Exception $e) {
die($e->getMessage()); //not die, but handle in some way
}
//check get or post var to decide what to do
if ($_GET["dowhat"] == "display"){
try {
$myproj->displaySomeData($_GET["id"]);
} catch (Exception $e) {
die($e->getMessage()); //not die, but handle in some way
}
}
//twig rendering
$loader = new Twig_Loader_Filesystem('template');
$twig = new Twig_Environment($loader);
$template = $twig->load('myproject.html');
echo $template->render(array('projectdata' => $myproj->projectdata, 'member' => $ips_member));
Vielen Dank für Ihre Hilfe!
diese Frage gehört besser auf https://codereview.stackexchange.com/ – MikeT