php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.11.2008, 11:19  
Neuer Benutzer
 
Registriert seit: 22.11.2007
Beiträge: 15
Luka
Standard Methode einer anderen Klasse aufrufen

Hi,

ich programmiere gerade meine 2. Klasse, stehe also noch am Anfang. (Hoffe es gehört dennoch hier rein und nicht zu den Einsteigern)

Ich habe eine MySQL Klasse und eine AbstractSQL Klasse die von der MySQL Klasse erbt. Wenn ich also ein Query abschicke, geht das über diese AbstractSQL Klasse. Die beiden Klassen habe ich so im Internet gefunden und finde den Ansatz eigentlich auch ganz gut.

Wenn ich nun im Script auf die DB zugreifen möchte benutze ich folgenden Code:
PHP-Code:
$abstract = new AbstractSQL ($dbhost,$dbuser,$dbpass,$dbname);
$query "select * FROM user";
$res $abstract -> checkQuery ($query); 
Nun habe ich als nächstes eine Login Klasse geschrieben. Natürlich muss ich nun über die Login Klasse die AbstractSQL Klasse ansprechen, damit ich in der Datenbank die Userdaten überprüfen kann. Der Part oben fliegt also aus dem Script raus und muss ja irgendwie in der Login Klasse wieder auftauchen.

Also, ich rufe in meinem Script ja meine Klasse auf und instanziere das Objekt.

PHP-Code:
$login = new LoginHandler(); 
In meiner Login Klasse komme ich dann irgendwann zu der Methode:
PHP-Code:
function checkLoginData() 
Wie benutze ich nun den oben genannten Code um auf die AbstractSQL Klasse zuzugreifen?
Ich bin mir sicher das Ihr Rat wisst, ich drehe mich hier leider im Kreis. Freue mich über jeden Tip.

Vielen Dank im Voraus. Gruss Luka

PS: Bin einen Schritt weitergekommen:
PHP-Code:
 $query "select * FROM user";
         
$res AbstractSQL::checkQuery($query); 
Er geht nun in die AbstractSQL Klasse, dort verursacht er jedoch ein Problem mit der Elterklasse. Er kann scheinbar nicht auf die Elterklasse zugreifen, also gibt es wohl Probleme mit der Vererbung. (Call to undefined method ) Hat jemand eine Idee?

Geändert von Luka (08.11.2008 um 11:45 Uhr).
Luka ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.11.2008, 12:00  
Erfahrener Benutzer
 
Benutzerbild von tomtaz
 
Registriert seit: 17.06.2008
Beiträge: 1.762
PHP-Kenntnisse:
Fortgeschritten
tomtaz ist einfach richtig netttomtaz ist einfach richtig netttomtaz ist einfach richtig netttomtaz ist einfach richtig netttomtaz ist einfach richtig nett
tomtaz eine Nachricht über ICQ schicken tomtaz eine Nachricht über Skype™ schicken
Standard

Versuch es mit Singleton.

Heist also, erstelle in der SQL Klasse eine statische funktion zb.: init

PHP-Code:

class AbstractSQL extends SQL
{
  static 
$init NULL;

  static public function 
Init$dbhost$dbuser$dbpass$dbname )
  {
    if ( 
self::$init === NULL )
    {
      
self::$init = new AbstractSQL ($dbhost,$dbuser,$dbpass,$dbname);
    }
   return 
self::$init;
  }

In der funktion kannst du dann via:
PHP-Code:
function test( )
{
  
$db AbstractSQL::init();
  
$db->Sendquery( ... );
}

auf deine SQL Klasse zugreifen 
__________________
Mfg Tomtaz
"Es soll jetzt diese Erfindung geben.... Kugel oder so heißt die. Ist so eine Art Suchmaschine..."
tomtaz ist offline   Mit Zitat antworten
Alt 08.11.2008, 12:11  
Neuer Benutzer
 
Registriert seit: 22.11.2007
Beiträge: 15
Luka
Standard

Hi tomtaz,

habe ich gerade ausprobiert, aber das interessiert das script wohl wenig.

Ich habe mir mal etwa ausgeben lassen aus der Elternklasse im Konstruktor, das funktionierte. Also ist die Klasse richtig eingebunden.

Die Funktion ist protected, dachte das liegt daran, aber auch wenn ich es auf public setze geht es nicht.

Es soll also so aussehen

"LoginHandler" Klasse benutzt Methode von "AbstractSQL extends MySQL", diese ruft Methode von "MySQL" Klasse auf und in genau der letzten Phase hängt es.
Luka ist offline   Mit Zitat antworten
Alt 08.11.2008, 15:24  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Luka,

da du noch am Anfang stehtst gleich der Hinweis, dass

Zitat:
AbstractSQL extends MySQL
wenig sinnvoll ist. Eine abgeleitete Klasse muss immer spezieller sein, sprich eben nicht mehr abstrakt.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 08.11.2008, 17:15  
Neuer Benutzer
 
Registriert seit: 22.11.2007
Beiträge: 15
Luka
Standard

Hallo dr.e.,

ich habe die beiden Klassen von der Peter kropff Seite, er spricht dort zwar auch davon das die Abstrakt Klasse dort nicht wirklich Sinn macht, aber ich finde das es eigentlich super funktioniert. Du kannst ja mal einen Blick darauf werfen.

Peter Kropff - Tutorials - Objektorientierte Programmierung mit PHP5 - Anfängertutorial 3 - Die MySQL-Klasse Teil 1

Ich bin jetzt wirklich überfragt und völlig festgefahren. Wie bekomme ich das nur zum Laufen?
Luka ist offline   Mit Zitat antworten
Alt 08.11.2008, 17:26  
Erfahrener Benutzer
 
Benutzerbild von byFd
 
Registriert seit: 06.11.2008
Beiträge: 154
byFd befindet sich auf einem aufstrebenden Ast
Standard

Ich hab das Tutorial grad mal überflogen und ich glaube er erstellt diese "AbstractSQL" Klasse nur weil er Vererbung zeigen möchte.
Diese Klasse macht meiner Meinung nach absolut keinen Sinn und abstrakt ist sie erst recht nicht.
Diese checkQuery funktion braucht man ja auch nicht unbedingt.

Eine Singleton Implementierung könnte man hier machen, damit es immer nur ein SQL Objekt gibt, muss man aber nicht, Alternativ könntest du ein Objekt deiner SQL Klasse im Konstruktor deiner Login Klasse übergeben und dann dieses benutzen.
byFd ist offline   Mit Zitat antworten
Alt 08.11.2008, 17:32  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

Mal ganz davon abgesehen, dass Dr.E natürlich recht hat, das ist wirklich kein gutes Beispiel für sinnvolle Vererbung und der Name "AbstractSQL" ist zudem noch suboptimal gewählt...:

Warum versuchst du plötzlich die checkQuery()-Methode als statische Methode aufzurufen?
Du hast im Prinzip zwei Möglichkeiten:
Entweder du übergibst deiner LoginHandler-Klasse ein AbstractSQL-Objekt:
PHP-Code:
$abstract = new AbstractSQL(....);
$loginHandler = new LoginHandler($abstract); 
Dazu musst du natürlich deinen Konstruktor entsprechend anpassen...

Oder du erzeugst eben in der LoginHandler-Klasse selbst ein neues AbstractSQL-Objekt...oder du holst es dir ähnlich wie tomtaz vorgeschlagen ...
__________________
Today you...Tomorrow me.
agrajag ist offline   Mit Zitat antworten
Alt 08.11.2008, 18:09  
Neuer Benutzer
 
Registriert seit: 22.11.2007
Beiträge: 15
Luka
Standard

Mmh ok, also seid Ihr der Meinung, dass ich die Abstract Klasse weglassen soll, wenn ich das richtig verstehe. Schade eigentlich,das sah in meinen Augen ganz gut aus. Ich rufe einfach nur 1 Methode auf egal ob für einen SELECT oder ein INSERT, die Abstract SQL hat ja entschieden was es sein soll.

Kann ich das denn wirklich nicht einsetzen?

Ich habe nun mal mein script so geändert

Im Script erst:
PHP-Code:
new MySQL ($dbhost,$dbuser,$dbpass,$dbname); 
dann
PHP-Code:
$login = new LoginHandler(); 
und in der Login Klasse

PHP-Code:
$query "select * FROM user";
$res MySQL::doSelect($query); 
So funktioniert es dann auch. Ist das dann nun sauber programmiert? Ich übergebe übrigens kein Object direkt an meine Login Klasse, auch im Konstruktor habe ich nichts verändert.

Natürlich musste ich die Methode on MySQL noch von protected auf public setzen, sonst hätte ich ja nicht darauf zugreifen können.

Ist das dann alles OK?
Luka ist offline   Mit Zitat antworten
Alt 08.11.2008, 18:17  
Erfahrener Benutzer
 
Benutzerbild von byFd
 
Registriert seit: 06.11.2008
Beiträge: 154
byFd befindet sich auf einem aufstrebenden Ast
Standard

du kannst die Klasse natürlich trotzdem benutzen, theoretisch könntest du die checkquery funktion auch in der ersten klasse implementieren...

Sauber ist das ganze insofern nicht, als das du die doSelect methode statisch aufrufst, obwohl sie nicht dafür vorgesehen ist. funktioniert auch nur weil PHP einfach die letzte geöffnete verbindung nimmt und du ja vorher new MYsql gemacht hast.
byFd ist offline   Mit Zitat antworten
Alt 08.11.2008, 18:20  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo Luka,

Zitat:
Ist das dann alles OK?
Das kommt auf den Betrachtungswinkel an. Für mich persönlich ist das weit von gutem Softwaredesign entfernt, da Aufgaben von Komponenten vermischt werden, keine klare Trennung zwischen Datenbank-Abstraktion und Datenschicht vollzogen wird, ...

Grundsätzlich funktioniert dein Code natürlich, du solltest jedoch darauf achten, die verschiedenen Aufgaben sauber in Komponenten / Klassen zu verpacken und diese allgemeingültig einsetzbar zu gestalten (Regel No. 4).
Da Komponenten in den meisten Fällen einen Status tragen, solltest du statische Addressierungen vermeiden. In der doSelect() ist es ratsam die Datenbank-Verbindung zur Verfügung zu haben um die Query ausführen zu können.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
statische Eigenschaft einer unbekannten Klasse aufrufen Zergling-new PHP-Fortgeschrittene 30 05.01.2010 20:04
funnktion aus klasse aufrufen nieselfriem PHP Tipps 2008 3 05.01.2008 14:35
mehr als eine Klasse einbinden Alpha Centauri PHP-Fortgeschrittene 4 13.04.2006 20:56
Wert einer Variable in einer anderen Funtion übernehmen seven-12 PHP Tipps 2005-2 7 14.06.2005 00:36
[Erledigt] PHP5 - Vererbung: Aufrufen einer Methode der Oberklasse PHP-Fortgeschrittene 2 25.04.2005 13:01
Methode dynamisch (per Name) aufrufen PHP Tipps 2005 6 10.03.2005 14:07
Methode aus einer anderen Methode aufrufen PHP Tipps 2005 3 02.03.2005 10:07
[Erledigt] Problem mit Übergabe einer Klasse in PHP4 PHP-Fortgeschrittene 10 08.01.2005 21:00
[Erledigt] Instanz bilden innerhalb einer Klasse PHP Tipps 2004 7 11.12.2004 12:58
Funktion einer Klasse über Link aufrufen? MortakArtos PHP Tipps 2004-2 4 18.11.2004 12:05
Klasse holt sich die Klasse PHP-Fortgeschrittene 9 07.10.2004 11:53
[Erledigt] Brauche Hilfe bei meiner ersten Klasse PHP-Fortgeschrittene 9 24.09.2004 17:09
Klassenobjet in anderer Klasse benutzen inu PHP Tipps 2004 6 19.09.2004 10:58
OOP: offizielle php funktion als methode einer klasse ... PHP Tipps 2004 4 17.09.2004 04:24
Klasse ändern UniQ PHP Tipps 2004 5 24.08.2004 14:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php methode aufrufen, http://www.php.de/php-fortgeschrittene/48849-methode-einer-anderen-klasse-aufrufen.html, php klasse aufrufen, php klassen aufrufen, andere klasse aufrufen, php klasse auf andere klasse zugreifen, methode anderer klasse aufrufen, methode aufrufen php, funktion aus anderer klasse aufrufen php, php funktion in anderer klasse aufrufen, auf methode einer anderen klasse zugreifen, php methode aus anderer klasse aufrufen, php funktion anderer klasse aufrufen, klassen aufrufen php, php funktion aus anderer klasse aufrufen, methoden aufrufen php, php funktion einer anderen klasse aufrufen, methode anderer klasse, methode einer anderen klasse aufrufen, php in einer klasse auf eine andere klasse zugreifen

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:37 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum