• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Oop

skype90

Mitglied
Hallo ,

Ich bin gerade beim Thema objekt orientierte programmierung in Php vorerst will ich los werden das ich ein php neuling bin.

Die Aufgabe lautet :

Aufgabe:

Erstellen Sie die Klasse "student"
Diese Klasse hat die Eigenschaft:

  • Geschlecht
  • Alter in Jahren
  • Hauptfach
Und es gibt die Methoden

  • hat Geburtstag (Alter steigt i.d.R. um 1 Jahr) und eine Ausgabe auf dem Bildschirm erscheint mit dem entsprechenden Alter
  • wechselt Hauptfach und eine Ausgabe auf dem Bildschirm erscheint, welches das alte Fach war und welches das neue Fach ist.
Leiten Sie 2 Objekte ab:

  1. Objekt: Susi S., Alter 22, Hauptfach Englisch
  2. Objekt: Alfred A., Alter 24, Hauptfach Ameisenkunde
Lassen Sie Alfred 2 mal Geburtstag haben und Susi das Fach wechseln nach Latein


OK ich habe es weit geschafft bloß , ich muss nur hinkriegen dass das alte fach von Alfred agezeigt wird und das neue das er weschelt und ich weiß nicht wie ich das hinbekomme ich habe an eine switch funktion in der wechselt_hauptfach gedacht aber ich habe keine ahnung wie ich das hinbekomme ich bitte um hilfe

Das ist der code:

PHP:
<?php

class student {

    var $geschlecht;
    var $alter = 0;
    var $hauptfach;
    var $name;


    function Hat_geburtstag(){

    $this->alter++;

    echo "$this->name ist $this->alter alt";

    }

    function wechselt_hauptfach(){


    }
}

$student = new student;

$student->name = "Susi";
$student->geschlecht = "weiblich";
$student->hauptfach = "englisch";
$student->alter = "22";

$student->hat_geburtstag();



$student1 = new student;

$student1->name = "Alfred";
$student1->geschlecht = "m&auml;nnlich ";
$student1->hauptfach = "Ameisenkunde";
$student1->alter = "24";

$student1->hat_geburtstag();
$student1->hat_geburtstag();

?>
 
Du lässt das Hauptfach einmal ausgeben, bevor du die Funktion zum wechseln aufrufst und einmal nach dem wechseln. Wenn du das vorherige Hauptfach nach dem wechseln noch wissen willst, musst du dies auch in einer Variablen speichern.
 
Da ist nichts kompliziertes dran.
PHP:
echo $student1->hauptfach;
$student1->hauptfach = "Ameisenkunde";
echo $student1->hauptfach;
oder
PHP:
$hauptfach_alt = $student1->hauptfach;
$student1->hauptfach = "Ameisenkunde";
echo $hauptfach_alt;
echo $student1->hauptfach;
 
Also statt da veraltetes PHP4-OOP zu schreiben würde ich doch lieber PHP5-OOP schreiben. In deinem Fall ist wohl alles Puplic.
 
Ich bin zwar kein PHP Fachmann, aber auch dort sollte man sich ein paar Regeln angewöhnen, die in der OO Programmierung üblich sind. Konventionen erleichtern das Lesen von fremden (und eigenen) Code.

1. Ein Konstruktor beginnt immer mit einem Grossbuchstaben.
2. Wenn du streng OOP programmieren willst, sollten alle Eigenschaften privat sein und nicht auf aussen sichtbar. Das ist eines der Grundparadigmen der Objektorientierten Programmierung, dass du von aussen nicht die Eigenschaften eines Objektes ändern darfst.
(es gibt Sprachen wo das nicht so streng gehandhabt wird)
Deshalb solltest du getter und setter definieren, das ist auch sinnvoll, damit dein Objekt z.b. die Gültigkeit eines Wertes überprüfen kann. Hier in deinem Beispiel z.b. ein negatives Alter.
3. Der Ausdruck "Leiten Sie 2 Objekte ab" ist mißverständlich. Entweder hat der Lehrer wenig Ahnung von OOP oder du verstehst etwas falsch. Die Bezeichnung ableiten verwendet man, im zusammenhang der OOP, wenn eine Klasse vererbt wird. In dem Beispiel erzeugst du aber einfach zwei Objekte Student (was meiner Meinuing nach auch so gemeint ist, ich vermute dein Lehrer hat das Begriffproblem)

Das ganze könnte dann z.b. so aussehen:
PHP:
<?php
class Student {

    public static $MAX_AGE = 100;
	
	private $geschlecht;
    private $alter = 0;
    private $hauptfach;
    private $name;
	
	function __construct($n, $a, $g, $f){
		if(isset($n)) $this->set_name($n);
		if(isset($a)) $this->set_alter($a);
		if(isset($g)) $this->set_geschlecht($g);
		if(isset($f)) $this->set_hauptfach($f);
	}

	function get_alter() { return $this->alter;}
	function get_name() { return $this->name;}
	function get_hauptfach() { return $this->hauptfach;}
	function get_geschlecht() { return $this->geschlecht;}

	function set_alter($a) {
		if(!$a || $a < 0 || $a > Student::$MAX_AGE) {
			die("ungültiges Alter: $a");
		}
		$this->alter = $a;
	}
	function set_name($n) {
		if(!$n) {
			die("kein Name!");
		}
		$this->name = $n;
	}
	function set_geschlecht($g = '') {
		$g = strtolower($g);
		if(!$g || ($g != 'weiblich' && $g != 'männlich') ) {
			die("ungültiges Geschlecht: $g");
		}
		$this->geschlecht = $g;
	}
	function set_hauptfach($f) {
		if(!$f) {
			die("Keine Hauptfach!");
		}
		$this->hauptfach = $f;
	}


    function hat_geburtstag(){
		$this->alter++;
		echo "$this->name ist $this->alter alt.\n";
		if($this->alter > Student::$MAX_AGE) {
			echo "$this->name ist wahrscheinlich schon Tot.\n";
		}
    }

    function wechselt_hauptfach($f){
		$this->set_hauptfach($f);
		echo "$this->name hat das Hauptfach: $this->hauptfach.\n";
    }
}

$susi = new Student("Susi", 22, "weiblich", "Englisch");
$alfred = new Student('Alfred', 24, 'männlich', 'Ameisenkunde');

$alfred->hat_geburtstag();
$alfred->hat_geburtstag();
$susi->wechselt_hauptfach('Latein');

?>
 
Hier mal meine Version:
PHP:
<?php
class Person {
    protected $maxAlter = 100;
    protected $amLeben = true;
    protected $alter = 0;
    protected $name = 'Max Mustermann';
    protected $geschlecht = 'w';
    protected $beruf = '';
    public static $population = 0; 

    protected function werdeAelter() {
         $this->amLeben = (++$this->alter <= $this->maxAlter);
         return $this->amLeben;
    }

    public function __construct($name, $geschlecht) {
        self::$population = self::$population + 1;
        $this->maxAlter = 70 + rand(0, 20);

        $this->name = $name;
        $this->geschlecht = $geschlecht;
    }
    
    public function __toString() {
        return "$this->name [Beruf: $this->beruf]";
    }

    public function hatGeburtstag () {
         if (!$this->amLeben) {
              print "$this ist leider schon tot\n";
         } elseif(!$this->werdeAelter()) {
              print "$this ist gestorben\n";
         } else {
              return $this->alter;
         }
         return FALSE;
    }

    public function vielZeitVergeht () {
         $this->alter += 60;
         return $this->alter;
    }

    public function macheLehre($beruf) {
         $this->beruf = $beruf;
    }

    public function getAlter() {
         return $this->alter;
    }

    public function getName() {
         return $this->alter;
    }

    public function getBeruf() {
        return $this->beruf;
    }

    public function setBeruf($beruf) {
        $alt = $this->beruf;
        $this->beruf = $beruf;
        return $alt;
    }

    public function getGeschlecht() {
        return $this->geschlecht;
    }
}

class Student extends Person {
     protected $fach = "Mathe";

     public function __construct($name, $alter, $geschlecht, $fach) {
         parent::__construct($name, $geschlecht);

         $this->alter = $alter;
         $this->fach = $fach;
         $this->beruf = 'Student';
     }

     public function getFach() {
         return $this->fach;
     }

     public function setFach($fach) {
         $alt = $this->fach;
         $this->fach = $fach;
         return $alt;
     }

     public function macheLehre ($beruf) {
         throw new Exception("$this ist Student und kann keine Lehre machen");
     }
}

$susi = new Student('Susi', 22, 'w', 'Wirtschaft');
$alfred = new Student('Alfred', 24, 'm', 'Ameisenkunde');

$susi->hatGeburtstag();
print "$susi ist nun ".$susi->getAlter()." Jahre alt\n";

$susi->hatGeburtstag();
print "$susi ist nun ".$susi->getAlter()." Jahre alt\n";

$alt = $susi->setFach('Geschichte');
print "$susi hat das Fach von $alt zu ".$susi->getFach()." gewechselt\n";

try {
    $alfred->macheLehre("Bäker");
} catch(Exception $error) {
    print "$alfred würde lieber Bäker werden, aber: ".$error->getMessage()."\n";
}

$alfred->vielZeitVergeht();
print "Viel Zeit vergeht und $alfred ist nun ".$alfred->getAlter()." Jahre alt\n";

$alfred->hatGeburtstag();
 
Zurück
Oben