mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Fr 29.03.2024 15:36 Benutzername: Passwort: Auto-Login

Thema: [php] Grundlagen OOP - extends vom 17.01.2008


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> [php] Grundlagen OOP - extends
Autor Nachricht
fuchsbau
Threadersteller

Dabei seit: 15.08.2005
Ort: .//root
Alter: 40
Geschlecht: Männlich
Verfasst Do 17.01.2008 14:46
Titel

[php] Grundlagen OOP - extends

Antworten mit Zitat Zum Seitenanfang

Ich benutze in meinem Projekt eine Klasse, die die Kommunikation mit der Datenbank übernimmt. Sie connectet wenn notwendig, übernimmt mysql_num_rows, verwaltet Fehlermeldungen etc.

Nun habe ich eine weitere Klasse, die in einigen Methoden die Datenbank benutzt.

Nun meine Frage:

Was ist der sauberere Weg bzw. die gängige Variante bei der Verwendung der letzteren Klasse, die ja immer die Funktionen der Datenbanken benötigt?

Code:
include('includes/classes/db.inc.php');
include('includes/classes/rubriken.inc.php');


und in der Klasse Rubriken dann eben ein neues Objekt aus der Datenbankklasse bauen und dieses verwenden

ODER

Code:
class Rubriken extends Db...


und dann eben die vererbten Funktionen der Db-Klasse verwenden.

Ergibt die Frage Sinn? * Ööhm... ja? * Und wenn ja, wie ist die Antwort? Grins


Zuletzt bearbeitet von fuchsbau am Do 17.01.2008 14:48, insgesamt 2-mal bearbeitet
  View user's profile Private Nachricht senden
Pixelpole

Dabei seit: 25.10.2004
Ort: Trier
Alter: 37
Geschlecht: Männlich
Verfasst Do 17.01.2008 14:56
Titel

Antworten mit Zitat Zum Seitenanfang

du könntest im konstruktor deiner klasse eine referenz auf die instanz übergeben * Keine Ahnung... *

//edit

hier noch ein Codebeispiel:

Code:

class testclass {
   public $test = "01";
   public $test2 = "02";
}

class testclass2 {
   public $test_reference;
   
   public function __construct(&$test_reference) {
      $this->test_reference = $test_reference;      
   }
   
   public function getTestReference() {
      return $this->test_reference;
   }
}

$test1 = new testclass();
$test2 = new testclass2($test1);

$test1->test = "sdgs";

print_r($test2->getTestReference());


Zuletzt bearbeitet von Pixelpole am Do 17.01.2008 15:01, insgesamt 1-mal bearbeitet
  View user's profile Private Nachricht senden
Anzeige
Anzeige
fuchsbau
Threadersteller

Dabei seit: 15.08.2005
Ort: .//root
Alter: 40
Geschlecht: Männlich
Verfasst Do 17.01.2008 15:08
Titel

Antworten mit Zitat Zum Seitenanfang

referenz übergeben heißt? und was wäre da der vorteil bezüglich variante 1? weil wenn beide klassen sowieso includet sind? mmh. Menno!

//ok, du warst schneller mit deinem edit ^^


Zuletzt bearbeitet von fuchsbau am Do 17.01.2008 15:12, insgesamt 1-mal bearbeitet
  View user's profile Private Nachricht senden
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Do 17.01.2008 15:08
Titel

Antworten mit Zitat Zum Seitenanfang

Das ergibt echt keinen Sinn, da es sich bei der Eltern-Kind-Beziehung nicht um eine "is-a" (ist-ein)-Beziehung handelt. Das wäre bspw. im Lehrbuch der Fall:

class ford extends auto => Is-A-Beziehung liegt vor (Ein Ford ist ein Auto)

class rubrik extends db => Is-A-Beziehung liegt NICHT vor (Eine Rubrik ist keine Datenbank)

Vererbung ist in den meisten Fällen nicht sinnvoll bzw. nicht gewünscht, man sollte dieses Feature also nicht auf Teufel komm 'raus überstrapazieren.

In deinem Fall könntest du, wie bereits erwähnt, ein DB-Objekt an deine konkrete Instanz weitergeben (man spricht von "Delegation"). Delegation ist der Vererbung ähnlich, wenn du alle Methoden, die du aus der DB-Klasse benötigst, erneut in deiner Rubriken-Instanz deklarierst, in Ihnen aber die entspr. Methoden des DB-Objekts aufrufst. Ist zwar umständlich, aber der einzig saubere Weg.

Wahrscheinlich wirst du aber nicht umhin kommen, deine Klassenstruktur nochmal zu überdenken. Es wäre bspw. sinnvoll, eine abstrakte Modellklasse zu schreiben, die allgemeine Datenbankoperationen übergibt, und dann deine einzelnen Datenmodelle davon abzuleiten. Dann hättest du auch eine sinnvolle is-a-Beziehung:

class rubrikmodel extends model {...}
class rubrik {hält alle Eigenschaften und Methoden, die nix mit dem Datenmodell zu tun haben}

Zitat:
public function __construct(&$test_reference) {
$this->test_reference = $test_reference;
}


Seit PHP5 brauchste Objekte nicht mehr mit dem Refernenzoperator zu übergeben, da jede Objektvariable sowieso nur eine Referenz ist.

Du übergibst einen Zeiger auf eine Referenz, was u.U. zu seltsamen Ergebnissen führen kann. Du kannst übrigends mittlerweile den Objekttyp durch Typehints erzwingen:

Code:
function __construct(testclass $test_reference) {
      $this->test_reference = $test_reference;     
}


Nochwas zu OOP in PHP:
Es gibt mittlerweile recht landläufige Codingstandards, die (genau wie in Java) bspw. empfehlen, Klassennamen immer mit anfänglichem Großbuchstaben und in Camelcaps zu schreiben, $objektVariablen klein und in Camelcaps (nix Unterstrich), $lokale_variablen klein und evtl. mit Unterstrich(en), KONSTANTEN in Versalien und mit Unterstrich(en), funktions_namen() klein und mit Unterstrich, methodenNamen() klein und in camelCaps.

Schaut mal auf die Zend-Frameworkseite oder die PEAR-Coding-Standards. Ist natürlcih im Einzelfall immer noch Geschmackssache.


Zuletzt bearbeitet von bacon am Do 17.01.2008 15:16, insgesamt 3-mal bearbeitet
  View user's profile Private Nachricht senden
fuchsbau
Threadersteller

Dabei seit: 15.08.2005
Ort: .//root
Alter: 40
Geschlecht: Männlich
Verfasst Do 17.01.2008 15:29
Titel

Antworten mit Zitat Zum Seitenanfang

bacon hat geschrieben:
Nochwas zu OOP in PHP:
Es gibt mittlerweile recht landläufige Codingstandards, die (genau wie in Java) bspw. empfehlen, Klassennamen immer mit anfänglichem Großbuchstaben und in Camelcaps zu schreiben, $objektVariablen klein und in Camelcaps (nix Unterstrich), $lokale_variablen klein und evtl. mit Unterstrich(en), KONSTANTEN in Versalien und mit Unterstrich(en), funktions_namen() klein und mit Unterstrich, methodenNamen() klein und in camelCaps.


na dann hab ich doch alles richtig gemacht, nicht? Grins

janee, danke euch zweien, ich guck nochmal drüber.

grüße
.//fuchsbau
  View user's profile Private Nachricht senden
Pixelpole

Dabei seit: 25.10.2004
Ort: Trier
Alter: 37
Geschlecht: Männlich
Verfasst Do 17.01.2008 15:33
Titel

Antworten mit Zitat Zum Seitenanfang

bacon hat geschrieben:

Seit PHP5 brauchste Objekte nicht mehr mit dem Refernenzoperator zu übergeben, da jede Objektvariable sowieso nur eine Referenz ist.


Ach ich steck immernoch viel zu sehr in php4 drin Ooops

Hab ich so nem Assikunden mit php4 Server zu verdanken der alle gut gemeinten ratschläge doch mal die phpversion zu wechseln in den Wind schiesst Menno!
  View user's profile Private Nachricht senden
 
Ähnliche Themen Grundlagen der Internetgestaltung
PHP Grundlagen lernen
Flash Grundlagen
Banner - Theoretische Grundlagen
gesetzliche grundlagen gesucht
[Suche] Buchtipp Web Grundlagen
Neues Thema eröffnen   Neue Antwort erstellen
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.