Kleines Brainlag in meinem Framework

  • PHP

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Dodo.

    Kleines Brainlag in meinem Framework

    Moin,


    ich update gerade mein eigenes Framework und möchte es noch mehr an OOP und sauberer machen.

    Der Aufbau ist ganz einfach, man kann Module Klassen schreiben die dann aufgerufen werden z.B.

    home/run.php

    PHP-Quellcode

    1. class module {
    2. public function run($action) {
    3. return "Hallo Welt!";
    4. }
    5. }


    index/run.php

    PHP-Quellcode

    1. class index {
    2. public function run()
    3. $mdl = new module();
    4. echo $mdl->run("start");
    5. }
    6. }


    So ist es momentan, jedoch möchte ich es individueller gestalten, so das jedes Modul auch das Index Modul sein könnte, hierzu muss ich allerdings immer den gleichen Namen der Module haben, also statt class index auch class module. Dies geht natürlich nicht, dann kommt der PHP Error

    Cannot redeclare class module


    Ich habe nun versucht das Index Modul innerhalb einer anderen Klasse zu includen, aber auch dies klappt leider nicht. Hat jemand eine Idee wie ich das realisieren könnte?
    Im Prinzip werden immer 2 Module geladen, einmal das Index Module, welches dann z.B. das Index-Template läd, dann wird das dynamische Module für den Content geladen, welches dann in das Index-Template eingefügt wird.

    * Topic verschoben *

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nikeee13“ ()

    Ich habe jetzt nicht zu 100% verstanden, was du machen willst, allerdings könntest du das Ganze mittels Vererbung lösen.
    So könntest du beispielsweise eine abstrakte Methode run() anbieten, die die anderen Klassen überschreiben können.
    Nein das hilft mir nichts, ich habe halt 2 PHP Dateien die jeweils immer eingebunden werden. Einmal das Index Modul welches das Indes-Template läd und halt alles was auf der Indexseite immer gezeigt wird, wie Navigation usw.
    Dann wird URL Abhängig der Content geladen. Der Aufbau soll immer gleich sein

    Quellcode

    1. module/
    2. - user/
    3. - - templates/
    4. - - run.php
    5. - index/
    6. - - templates/
    7. - - run.php
    8. - home/
    9. - - templates/
    10. - - run.php


    es werden also immer 2 Module eingebunden, weil eins davon ja das Index Modul ist, welches das umgebende Index-Template darstellen muss. Ich möchte allerdings dass ein Modul immer gleich aussieht, also vom PHP Code her

    PHP-Quellcode

    1. <?
    2. class modul {
    3. public function run() {
    4. }
    5. }
    6. ?>


    via XML Datei werden die Module "installiert" also gesetzt ob sie Installiert sind und welches Modul als Index Modul fungieren soll und somit bei jedem Seiten aufruf immer geladen wird. Wenn ich das so mache habe ich aber eben das problem wenn ich einmal die index/run.php include und dann noch die user/run.php dass dann dort 2 mal die Klasse "module" existiert, und da kommt von PHP ja völlig zurecht dann ein Error.

    Dodo schrieb:

    Vererbung würde nicht funzen, weil ja in jedem Modul auch die selben Funktionen vorhanden sind und dann kollidiert es dort.
    Du definierst eine Basisklasse, in der genau diese Methoden (abstrakt) vorgegeben sind. Dann kannst du von dieser Klasse ableiten und die Funktionen überschreiben.
    Warum sollte da irgendwas kollidieren?
    Von meinem iPhone gesendet
    Stimmt die Kollidieren nicht, allerdings bringt mir eine Basisklasse auch nichts, weil die normalen Klassen immernoch gleich heißen, hätte ich nun z.B. die Basisklasse

    moduleEx.php

    PHP-Quellcode

    1. <?
    2. class moduleEx{
    3. public $tpl;
    4. public function moduleEx($modulePath) {
    5. $this->tpl = new template(zfw::$func->combine($modulePath, "template/"));
    6. }
    7. public function _default() {
    8. }
    9. ?>


    und nun meine eigentlichen Module

    /home/run.php

    PHP-Quellcode

    1. <?php
    2. class module extends moduleEx{
    3. public function _default() {
    4. return $this->start();
    5. }
    6. public function start() {
    7. eval("\$content = \"".$this->tpl->get("start")."\";");
    8. return $content;
    9. }
    10. }
    11. ?>


    und das Index Modul

    /index/run.php

    PHP-Quellcode

    1. <?php
    2. class module extends moduleEx{
    3. public function run($content) {
    4. eval("\$output = \"".$this->tpl->get("index")."\";");
    5. $this->tpl->display($output);
    6. }
    7. }
    8. ?>


    Habe ich immernoch das Problem das 2 Klassen mit selben Namen existieren.

    Edit:
    Implementiert werden die Klassen in meinem Framework etwa so

    PHP-Quellcode

    1. $indexModul = "index";
    2. $contentModul = $_GET['module'];
    3. include("module/".$contentModul."/run.php");
    4. $module = new module("module/".$contentModul); // übergibt den Modulpfad zum laden der Templates
    5. $content = $module->$_GET['do']; // entsprechende Funktion aufrufen was im Modul getan werden soll z.B. overview()
    6. include("module/".$indexModul."/run.php");
    7. $index = new module("module/".$indexModul); // hier sieht man dass nochmaliges Deklarieren von modul nicht funktioniert
    8. $index->run($content);


    Momentan löse ich es so, dass ich die Index Klasse aich "index" nenne, damit ich sie über

    PHP-Quellcode

    1. $index = new index("module/".$indexModul);

    einbinden kann. Das ist für mich aber nicht sauber. Will ich nun nämlich ein anderes Modul als Index haben, müsste ich dort in der run.php auch den Klassennamen ändern. Dies möchte ich nicht, sondern ich will nur über die Variable $indexModul festlegen welches Modul nun der Index ist. Das Content Modul wird ja über die URL geladen.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Dodo“ ()

    Bringt leider nicht viel. Da nicht die Instanzierung schwierigkeiten bereitet, sondern das Einbinden beim Include kracht es schon weils nicht 2 Klassen mit selben Namen geben kann

    PHP-Quellcode

    1. //normales Content Modul
    2. class Module {
    3. }
    4. // index Modul
    5. class Module {
    6. }


    Aber egal, es gibt keine Möglichkeit, ich werde es so lassen, dass das Index Modul eben anderen Klassennamen haben muss.
    Hmm..
    Okay aber ich würde dir noch meine Konventionen vorstellen.:)

    funktionen immer klein schreiben am anfang.
    datentyp vor variablen schreiben, z.b. $intUserid oder $strUsername oder $objConnection (diese fangen ebenfalls klein an).
    "propertys" in einer klasse mit protected $objProperty, function getProperty() und function setProperty() machen.
    if( bla )
    {
    }
    else
    {
    }
    also nicht so
    if ( bla) {
    } else
    { }

    Okay?:D
    Typenspezifische Variablen mache ich i.d.R. nie in PHP und die Schreibweise mit der geschweiften Klammer in der nächsten Zeile bei If-Bedignung und Funktionen usw. find ich extrem grässlich, es lässt sich verdammt bescheiden lesen. Aber leider hat sich dieses System weit verbreitend eingebürgert.