Klassen, Objekte, Methoden,xyz *rambam* Wofür braucht man das^^

Acriss

Gesperrt
Hi,

ich habe schon öfters von Klassen usw gelesen, nur voll kein PLan wofür man das braucht.

Kann mir da jemand bitte etwas zu erläutern? Wäre sehr nett...danke :)
 
Ok,

ich habe mir das durchgelesen, und das meiste verstanden.
Nur wofür ich das beim Programieren brauche, ist mir immer noch nicht klar geworden.
Das Autobeispiel war auf jeden Fall schonmal ganz gut :)

Kann jemand vllt mal ein Beispiel fürs Programmieren schreiben?
Also einen Code, und erläutern WARUM er gebrauchgt wird und WAS er macht :)
 
Das Thema "Waum OOP" kommt hier im Forum glaube ich alle 2-3 Monate mal auf. Bei einer der letzten Diskussionen habe ich mich auch beteiligt und versucht dies zu verdeutlichen, warum es aus meiner Sicht Sinn macht.

Der Thread handelt von OOP in einem Browsergame, ist dann aber mehr ins Allgemeine und nachher auf ein Shopsystem etwas abgewichen, wenn du magst, kannst du diesen mal lesen http://www.tutorials.de/forum/php/285385-klassen-fuer-browsergames.html

In dem Thread habe ich unter anderem auch folgenden Link gepostet http://tut.php-quake.net/klassen.html , hier wird nochmal einfach erklärt, was Klassen sind und wofür und anhand eines Beispiels den mit unter grössten Vorteil von OOP erklärt, die Kapselung von Code/Daten und damit mehr Struktur im Code und codeablauf (zumindest meiner Meinung die grössten Vorteile).

Ansonsten würde ich raten OOP zumindest zu verstehen und auch wenn es sich blöd anhört, zumindest sich damit anzufreunden. Die PHP Entwickler gehen stark in diese Richtung mit neuen Modulen (Bsp: SimpleXML, PDO oder sogar DateTimeZones) sind Objektorientiert in PHP implentiert.

Gruss
 
Ich kann deine Position verstehen, da ich bis vor einem Jahr auch nur prozedural programmiert habe (also ohne Einsatz von eigenen Klassen bzw. nur ein paar Funktionen).

Es sieht nach mehr Arbeit aus. Und wenn man die Planung und Entwurfsphase für die Klassen rechnet, ist es das auch. Allerdings nur in der Entwicklung der Klassen, also sozusagen der Werkzeuge die du für dein Projekt brauchst. (Falls du jedes mal überhaupt neue Werkzeuge entwerfen musst)

Sobald das einmal getan ist, lebst du voller Freude ;)

Danach erleichterst du dir viel, je nach dem was du für eine Klasse geschrieben hast.
Z. B. eine für User.

Statt auf jeder Seite deine Datei zur Überprüfung des Login einzubinden schreibst du einfach:
PHP:
<?php
require_once 'user.class.php';
$user = new MyUserClass;
if($user->validateLogin($_POST) === true)
{
  $user->registerLogin();
}
else
{
  $user->showLogin();
}
?>
Fehlt natürlich einiges und es würde jetzt noch Methoden geben um z. B. auf die Profildaten des Users auszulesen oder alle Kommentare die er jemals gemacht hat.
 
Meiner Erfahrung nach muss man sich mit OOP einfach eine Weile auseinandersetzen bis es "Klick" macht und man das Konzept und die Vorteile verinnerlicht hat, am Anfang kommt es einem meistens etwas unnütz vor. Also nur Mut ;)
 
Ok,

danke für die Seite, ich habe jetzt mal meine erste Klasse geschrieben :)

Auch wenn ich denke das die niz bringt, die beiden Funktionen alleine hättens auch getam ^ ^

PHP:
<?php

class Autofabrik
	{
         //Alle Variablen die gebraucht werden
         var $reifen;
         var $tueren;
         var $sitze;
         var $ps;
         var $kombi;
         var $max_kmh;
         var $farbe;
         var $anzahl;
         var $limit;

         //Wie soll das Auto aussehen?
         function create_car($farbe, $ps, $kombi, $max_kmh, $sitze = 5, $tueren = 4, $reifen = 4)
         	{
                 $return_msg = "Sie haben folgende Produktion gew&auml;hlt: \r\n";
                 if ($kombi == true)
                 	{$return_msg .= "Sie bauen einen ".$farbe."en Kombi, ";}
                 else
                 	{$return_msg .= "Sie bauen ein ".$farbe."es Auto, ";}
                 $return_msg .= "mit ".$sitze." Sitzen und ".$tueren." T&uuml;ren. Au&szlig;erdem hat es ".$reifen." Reifen.\r\n";
                 $return_msg .= "Die h&ouml;chstgeschwidigkeit betr&auml;gt ".$max_kmh." km/h mit immerhin ".$ps." PS!!\r\n";
                 $this->reifen = $reifen;
                 $this->tueren = $tueren;
                 $this->sitze = $sitze;
                 $this->ps = $ps;
                 $this->kombi = $kombi;
                 $this->max_kmh = $max_kmh;
                 $this->farbe = $farbe;
                 return $return_msg;
                 }

         //Wieviele Modelle bis wann
         function auftrag($limit, $anzahl = 1000)
         	{
                 return "Sie haben ".$anzahl." Modelle in auftrag gegeben, die m&uuml;ssen bis ".$limit." fertig sein!";
                 $this->anzahl = $anzahl;
                 $this->limit = $limit;
                 }
         }

$porsche = new Autofabrik();
print $porsche->create_car("rot", 345, false, 265, 2, 2);
print $porsche->auftrag("01.08.2009", 250000);


Dazu:
*Gibt es Verbesserungsvorschläge?
*Gibt es ein gutes Beispiel, wo man lieber Klasen als Funktionen verwenden sollte?
*Kann man, wenn die Funktionen keine bzw optionale Parameter hat, nur eine neue Klasse definieren, und fie Funktionen werden alle ausgeführt?
 
Wie du schon selber sagst, das Konstrukt ist im Moment noch nicht sinnvoll und um mal die Aussage von Felix Jacobi mit einzubinden, ist Planung wichtig.

In deinem Beispiel wird in einer Autofabrik nur 1 Auto hergestellt wofür es nur 1 Auftrag gibt.
Um bei diesen Beispiel zu bleiben:
In einer Autofabrik werden zig Autos hergestellt und es gibt x Aufträge. Ein Auto ist ein "Objekt" für sich, das in dem "Objekt" Autofabrik hergestellt wird. Also müsste man dies voneinander trennen, aber dennoch den Bezug zueinander herstellen. Der Bezug zwischen einem Auto und einer Autofabrik ist, das es ein Auto nur gibt, wenn es eine Autofabrik gibt, also ist die Autofabrik die Grundklasse und das Auto eine in der Autofabrik aufgerufene Klasse (hoffe das versteht man). Mal ein kleines Beispiel zur verdeutlichung, das ist jetzt nur runtergetippt und wird sicherlich nicht funktionieren. Ob es logisch korrekt ist, kann ich auch nicht versprechen (da muss man wiederrum genau planen vorher ;) )

Zuerst mal die Klasse für ein Auto
PHP:
class auto
{
  var $farbe = 'black';
  var $motor = '3,2l 300PS';

  public function __construct($farbe = FALSE, $motor = FALSE)
  {
      $this->farbe = empty($farbe) ? $this->farbe : $farbe;
      $this->motor = empty($motor) ? $this->motor : $motor;
  }
}
In dieser auto Klasse können wir ein Auto erstellen. Es kann optional eine andere Farbe haben oder einen anderen Motor. Standardmässig ist das auto schwarz und hat den 3,2l 300PS Motor.
Nun zur Klasse Autofabrik. Oben habe ich gesagt, das ein Auto abhängig ist von der Autofabrik, also erzeugen wir in der Klasse Autofabrik eine Instant der Klasse Auto.
PHP:
class autofabrik
{
   var $anzahlAutos;
   var $anzahlAuftraege;
   var $statusFabrik;
   var $autos;
   public function __construct()
   {
       $this->statusFabrik = 'keine Aufträge';
   }
   
   public function createCar()
   {
      $this->anzahlAutos++;
      $this->autos[$this->anzahlAutos] = new auto();
      $this->statusFabrik = 'Produziere Autos';
   }
}
Hier wird beim Initialisieren der Autofabrik der Status der Fabrik gesetzt.
Nun kann man ein Auto erstellen, z.B. mit
PHP:
$fabrik = new autofabrik();
$fabrik->createCar();
Wie man sieht, kriegt man nun Struktur in den Code rein.
Um das Beispiel noch etwas zu erweitern, mit dem Punkt der Auftäge, den du eingebracht hast.
Erstmal überlegen, wo pass dieser Auftrag in den Ablauf rein.
Grundlegend haben wir wieder unsere Autofabrik. Ein Auftrag wird an eine Autofabrik übergeben und erst dann wird ein Auto gebaut. Es kann mehrere Aufträge geben, wo mehrere Autos produziert werden.
Also ist ein Auto abhängig von einem Auftrag und der Auftrag wird an die Autofabrik übergeben.

Die Klasse Auto bleibt nun erstmal so. Die Klasse Autofabrik schreiben wir etwas um.
PHP:
class autofabrik
{
   var $anzahlAuftraege;
   var $statusFabrik;
   var $auftraege;
   public function __construct()
   {
       $this->statusFabrik = 'keine Aufträge';
   }

   public function newAuftrag($anzahlAutos, $farbe, $motor)
   {
       $this->anzahlAuftraege++;
       $this->auftraege[anzahlAuftraege] = new auftrag($anzahlAutos, $farbe, $motor);
       $this->statusFabrik = 'Aufträge vorhanden';
       return $this->anzahlAuftraege;
   }
   public function produziereAutos($auftragsNummer)
   {
       
       if(is_object($this->auftraege[$auftragsNummer])
       {
           $this->auftraege[$auftragsNummer]->fuehreAuftragAus();
           $this->statusFabrik = 'Produziere Autos nach Auftrag';
       }
   }
}
Nun die Klasse Aufträge, die in der Autofabrik aufgerufen wird
PHP:
class auftrag
{
    var $anzahl;
    var $farbe;
    var $motor;
 
    public function __construct($anzahlAutos, $farbe, $motor)
    {
        $this->farbe = $farbe;
        $this->motor = $motor;
        $this->anzahl = $anzahlAutos;
    }

   public function fuehreAuftragAus()
   { 
      FOR($i = 1; $i <= $this->anzahl; ++$i)
      {
           $this->auto[$i] = new Auto($farbe, $motor);
      }
   }
}

So, jetzt bauen wir Autos.
Wir erstellen eine "autofabrik" und geben dann einen Auftrag an diese Autofabrik. Dann starten wir die produktion der Autos in der Autofabrik für diesen Auftrag.

PHP:
$fabrik = new autofabrik();
$auftragsNummer = $fabrik->newAuftrag(100, 'gelb', '1,8l 90 PS');
$fabrik->produziereAutos($auftragsNummer);
// weitere Auftraege
$andereAuftragsNummer = $fabrik->newAuftrag(20, false, false);
$fabrik->produziereAutos($andereAuftragsNummer);

(hoffe das stimmt so alles von der Logik)

Okay, nun das war jetzt nur ein Beispiel und es ist bei weitem nicht gut. Wir können noch nicht den Status eines Auftrags auslesen oder auf ein Auto eines bestimmten Auftrags. Zudem fehlen viele Sicherungsfunktionen (bsp: wird eine Anzahl an Autos an den Auftrag übergeben).
Was man aber hoffentlich erkennen kann ist, das die Instanzen der Aufträge voneinander getrennt sind und das ist was OOP ausmacht und oft geschrieben wird, man kann realitätsnaher "coden". Es kann sichergestellt werden, das mein Auftrag mit gelben Autos nicht schwarze produziert.

Zu deiner Frage, wo macht es Sinn.
Theorethisch überall. Beispiel Userverwaltung. Jeder User soll abgekapselt sein von den anderen Usern, also jeder User ist eine Instanz von einer Klasse "user".
Oft wird es bei Datenbankverbindungen eingesetzt. Meine DB Abfrage wird in eine Instanz der Klasse "dba" geschickt und ich erhalte dafür die Ergebnisse.
Wenn ich weitere Abfragen an die DB senden möchte, die aber abhängig sind von der Ergebnissen der vorherigen DB abfrage (verschachtelte Abfragen) erzeugt man eine weitere Instanz der Klasse "dba" und die beiden Abfragen stören sich nicht gegenseitig (verschiedene mysql ressource handles).

okay, das war es erstmal.
Wie man vielleicht erkennt, bin ich ein Fan von OOP und prozeduales Programmieren fällt mir zunehmend schwerer (hört sich blöd an, ich weiss).
Wenn man tiefergehend sich damit beschäftigt hat und wie oben geschrieben wurde "es klick gemacht hat", macht es nur noch Spass und mit "Design Patterns" und den vielen Möglichkeiten möchte man es nicht mehr missen.

Viel Spass beim lernen, es lohnt sich! (Meine Meinung nach)

Gruss
 
Zuletzt bearbeitet:
Zurück