PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP Entwicklung und Softwaredesign (http://www.selfphp.de/forum/forumdisplay.php?f=14)
-   -   In einer Klasse auf andere Klassen zugreifen (http://www.selfphp.de/forum/showthread.php?t=22926)

ghost120 05.03.2010 15:15:46

In einer Klasse auf andere Klassen zugreifen
 
Hallo,

ich beschäftige mich gerade ein bisschen mit OOP.
Jetzt hab ich mal auf die schnelle ein Beispiel geschrieben, weil ich mir einfach nicht sicher bin ob das so richtig ist, bzw. ob man es besser machen könnte....
Und zwar, in der test.php will ich auf alle Funktionen Zugriff haben und in den einzelnen Klassen auch.

test.php
PHP-Code:

<?php

include("testCore.php");

testCore::getTest()->getParamFromTestCore();

?>

testCore.php
PHP-Code:

<?php

require("testClass.php");

class 
testCore {
    
    private static 
$test;
    
    function 
initTest() {
        
self::$test = new testClass;    
    }
    
    public function 
getTest() {
        if(
self::$test === nullself::initTest();
        return 
self::$test;    
    }
    
    function 
showSomething() {
        return 
'Ausgabe...';    
    }
    
}

?>

testClass.php
PHP-Code:

<?php

class testClass {
    
    function 
getParamFromTestCore() {
        return 
testCore::showSomething;    
    }
    
}

?>

Die Funktionen und Namen sind jetzt nicht wirklich sinnvoll, aber wie gesagt, es soll auch nur ein Beispiel sein.
Also ich will im Core alle Klassen laden und dann in den einzelnen Klassen Zugriff auf die anderen haben.
Also wenn ich jetzt im Core noch die DB und TPL Klasse laden würde, hätte ich in der TestClass.php Zugriff auf diese Klassen.
Und ich dachte mir, aufrufen tu ich das ganze dann über den Core.
Aber ich denke mir halt, die beste Lösung ist es sicher auch nicht, also falls jemand Vorschläge hat, wäre ich sehr dankbar.

Eine andere Möglichkeit wäre auch noch, die ganzen Klassen in der test.php zu laden und dann wie folgt aufzurufen:

$db->getRow('query...');
$tpl->assign('...');

Allerdings habe ich ja dann in den Klassen wieder keinen Zugriff darauf.

Danke

lg Alex

urvater 05.03.2010 17:07:22

AW: In einer Klasse auf andere Klassen zugreifen
 
Hier erst einmal der Link zur Sichtbarkeit in OOP.
Allerdings ist es sinnlos Klassen zu schreiben und dann auf deren Methoden innerhalb einer einzigen anderen Klasse zuzugreifen. Umsetzen könntest du es per extends aber wie schon geschrieben ist es nicht gerade sinnvoll.

Nimm das EVA Prinzip: Hier hast du Klassen, die für die Eingabe, Verarbeitung und die Ausgabe zuständig sind. Eingabe und Ausgabe benötigen keinen Zugriff auf die DB, da dafür die Verarbeitung zuständig ist.

Dein Problem kannst du leicht per Model View Controller erledigen lassen. Im Controller wird festgelegt, welches Model die Verarbeitung mit welchen Daten übernimmt und diese wiederum im View ausgegeben oder halt an den Controller zurück, damit dieser anhand des Ergbnisses den richtigen View setzen kann.

Eine Klasse, die auf alle Funktionen aller anderen Klassen zugreifen kann ist zum Beispiel aus folgendem Grund sinnlos:
Du hast eine Klasse, die sich um die Prüfung der Formulardaten kümmert.
Eine weitere kümmert sich um die Anfragen an die DB.
Eine dritte besitzt alle Funktionen um ein PDF nach deinen Wünschen erstellen zu können.
Deine 4. Klasse kann nun auf seine eigenen und auf die aller anderen zugreifen. Allerdings soll sie gerade nur "Hallo Welt" als P-TAG ausgeben. Wozu benötigt sie den nun die anderen Funktionen?

ghost120 05.03.2010 18:00:48

AW: In einer Klasse auf andere Klassen zugreifen
 
Hallo,

danke erstmal für deine Antwort.
Eigentlich stimmt es schon, dass ich in einer Klasse nicht auf alle Funktionen und andere Klassen zugreifen brauche, dass Problem ist nur, dass es in bestimmten Klassen doch nötig ist, z.B. in der Login Klasse, hier brauch ich doch Zugriff auf die DB Klasse und evtl. auf weitere Klassen, wie würde man das hier lösen?

Außerdem wollte ich meine Klassen nun so schreiben, dass ich sie in Zukunft auch weiterverwenden kann, natürlich wäre da meine Lösung eine äußerst Dumme, da ich ohne den Core umzubauen alle anderen Klassen benötigen würde.

MVC habe ich mir schon angeschaut, ich wollte auch versuchen ein bisschen was in diese Richtung zu machen, aber das geht eben leider nicht so schnell.
Ich hab mir auch schon diverse PHP-Frameworks angesehen (CodeIgniter, CakePHP, Zend),
Zend gefiel mir von der Funktionen her zwar am besten,
aber da brauch ich noch mehr Zeit um mich einzuarbeiten, bei CakePHP waren die Möglichkeiten meiner Meinung nach nur begrenzt, daher wollte ich erstmal mein aktuelles Projekt ohne ein Framework coden,
da ich hierbei auch sicher mehr lerne.

Daher würde ich mich sehr freuen, wenn mir jemand ein paar Vorschläge gibt, wie ich das am besten löse.

Danke

lg Alex

urvater 05.03.2010 21:34:01

AW: In einer Klasse auf andere Klassen zugreifen
 
Schau dir mal das Tutorial an: Peter Kropff
Es wird dir sicher weiter helfen.

ghost120 06.03.2010 13:56:51

AW: In einer Klasse auf andere Klassen zugreifen
 
Hallo,

danke ich habe mir das nun durchgelsen, also wenn ich das richtig verstehe, meinst du ich sollte meine Klassen, die z.B. DB Zugriff brauchen mit extends von der DB Klasse erben lassen, oder?
Ist das denn die beste Möglichkeit, oder gibts noch eine andere?
Außerdem ist dann immer die Frage, was mache ich wenn ich später noch Zugriff auf weitere Funktionen aus anderen Klassen brauche, soll ich die dann alle Erben lassen?

Danke

urvater 06.03.2010 15:08:14

AW: In einer Klasse auf andere Klassen zugreifen
 
Nein ich würde nicht alle benötigten Klassen einbinden. Im Tutoriel schreibt der Autor auch gleich am Anfang, daß er es selbst nicht so machen würde. Es ist halt nur zum Verstehen als Beispiel geschrieben worden.

Die Frage ist doch eigentlich, wie und wann willst/musst du welche Klasse nutzen. Nehmen wir als Beispiel ein Login nach Absenden der Userdaten(User,Pass).
Als erstes müssen die Formulardaten geprüft werden. Hierfür hast du eine Klasse FormCheck.
Dann müssen diese Daten mit der DB abgeglichen werden. Dafür hast du eine Klasse SQLQuery erstellt.
Als letztes erfolgt die Ausgabe ob der Login erfolgreich war oder nicht.

Wenn du das ganze als CMV umsetzen willst benötigst du noch eine Klasse Cotroller und eine Klasse Model. Der Cotroller muss die Klassen FormCheck und SQLQuery und deren Methoden nicht kennen. Die Klasse Model benötigt wiederum beides um die Daten überhaupt und sicher verarbeiten zu können. Da Model auf die DB vermutlich jedes mal zurück greifen muss wäre extends SQLQuery sicher nicht verkehrt. Da dieses Model vermutlich aber nicht nur Formulardaten verarbeiten muß würde hier ein new FormCheck reichen um diese beiden Felder zu prüfen, da wir ja nur das Ergebnis der Prüfung für die weitere Verarbeitung benötigen.

Du brauchst also nicht eine Klasse, die alles kann sondern je nach Bedarf verschiedene Klassen, die je nach Aufgabe, daß gewünschte Ergebnis liefern. Ich hoffe mal, daß ich das halbwegs verständlich rüber gebracht habe.

ghost120 06.03.2010 15:41:18

AW: In einer Klasse auf andere Klassen zugreifen
 
Hallo,

danke für deine Antwort, ich hab das ungefähr verstanden, also wenn ich das jetzt als MVC umsetzen würde, dann würde ich die benötigten Klassen im Model einbinden, der Controller würde dann die ganzen Usereingaben an das Model weitergeben, welches die Daten verarbeiten würde und die Ausgabe zurück geben würde, damit der Controller die Daten ausgeben kann.
Allerdings weiß ich nicht genau, wie ich die Klassen in den Controller einbinden würde, kannst du mir da bitte noch ein Beispiel geben?

Danke

urvater 06.03.2010 22:06:27

AW: In einer Klasse auf andere Klassen zugreifen
 
In diesem Tread wurde ein Tutoriel zu einem Framework verlinkt.
Ich rate dir diese/ Beispiel/e nur zum üben zu benutzen. Einige Funktionen sind dort veraltet und generell wird kaum auf Sicherheit und Fehlerbehandlungen eingegangen.
Um sich aber einen Überblick zu verschaffen bzw. für das Verständnis ist es recht gut geeignet.


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:31:59 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.