OOP PHP, Simple Namensausgabe mit Konstruktor

02/16/2017 16:44 Mad0ck#1
Guten Tag Liebe epvp Comj.

Ich wollte mir oop php etwas aneignen, und habe diesbezüglich ein skript von einem Lehrer bekommen, mit ein paar Beispielen dazu.

Da ich noch relativ am Anfang bin, weiß ich überhaupt nicht, wo hier im folgendem Code das Problem liegt.

PHP Code:
<?php
class Name {
    
// Spezielle Methoden - Magische Methoden
    
private $vorname;
    private 
$nachname;

    
// Beispiel 1 Methoden
    
public function __construct($vorname$nachname) {
        
$this->vorname  $vorname;
        
$this->nachname $nachname
    }

    public function 
getVorname() {
        return 
$this->vorname;
    }

    public function 
getNachname() {
        return 
$this->nachname;
    }
}
?>
Hier habe ich einen Konstruktor definiert, welcher beim erzeugen eines Objektes bswps new Name(); 2 Parameter braucht. Voranme und Nachname.


PHP Code:
<?php
// usikschule  Beispiel 1 vom 15.02.2017

require_once 'class/Name.php';

class 
Lehrer {
    private 
$name;
    private 
$geschlecht;

    public function 
__construct($name$geschlecht) {
        
$this->name $name;
        
$this->geschlecht $geschlecht;
        
    }

    public function 
getGeschlecht(){
        return 
$this->geschlecht;
    }
    public function 
getName() {
        return 
$this->name;
    }    
 }
?>
Nun deklariere ich eine neue Klasse Lehrer in einem neuem .php dokument. Der Konstruktor hier braucht auch wieder 2 paramter nämlich Name und Geschlecht.
Mit getName() , kann ich mir dann den Namen ausgeben lassen.

PHP Code:
<?php

require_once 'class/Lehrer1.php';
require_once 
'class/Name.php';

$personX = new Lehrer(new Name("Max","Muster"), "M");
echo 
$personX->getName();

?>
Im letzen neuen Dokument, erzeuge ich ein neues Objekt aus Lehrer.
Lehrer braucht ja 2 Paramter wegen dem Konstruktor. Weil ich jedoch Vor und Nachname haben will und nicht nur " Max Muster" , erzeuge ich in new Lehrer ein neues Objekt Name.
Name hat 2 Parameter, und Lehrer nun auch 2.

mit echo wollte ich mir nun den Namen ausgeben lassen.
Die get function hätte ich ja deklariert in Lehrer.php.

[Only registered and activated users can see links. Click Here To Register...]
Diese Fehlermeldung kommt.
Das wäre diese Zeile:
PHP Code:
echo $personX->getName(); 
ich verstehe nicht, was da jetzt so falsch daran ist :o

Bitte um Hilfe.

lg
Michi
02/16/2017 17:15 Syc#2
PHP Code:
public function getName() { 
        return 
$this->name
    } 
Da returnst du das Nameobject. Anstatt dessen müsstest du eigentlich die Getter von Name returnen, damit du nen String zurückbekommst.
02/16/2017 17:32 Mad0ck#3
Quote:
Originally Posted by Syc View Post
PHP Code:
public function getName() { 
        return 
$this->name
    } 
Da returnst du das Nameobject. Anstatt dessen müsstest du eigentlich die Getter von Name returnen, damit du nen String zurückbekommst.
ok.
ich habe schon etwas probiert, bevor ich diesen post geschrieben habe.
PHP Code:
public function getName() { 
        return 
$this->vorname
         return 
$this->nachname
    } 
Aber das funktioniert ja auch nicht.
da zeigt es mir nur das erste return an.

Weißte da zufällig wie ich Vor und Nachname bei einer get function zurückliefern kann ?

lg
02/16/2017 17:48 algernong#4
Du kannst einfach deine alte getName() Funktion nehmen und dann $lehrer->getName()->getVorname() bzw. $lehrer->getName()->getNachname() machen.

Ansonsten kann eine Funktion in PHP immer nur ein Wert zurückgeben. Auswege wären:
* Vor- und Nachname bei getName() schon zu konkatenieren
* Ein Objekt mit beiden Werten zurückgeben (also so, wie du es in deinem Eingangspost schon machst)
* Ein Array mit beiden Werten zurückgeben (doof)
* Zwei Methoden statt einer anzubieten, also Lehrer::getVorname() und Lehrer::getNachname()
02/16/2017 17:50 False#5
Quote:
Originally Posted by Mad0ck View Post
ok.
ich habe schon etwas probiert, bevor ich diesen post geschrieben habe.
PHP Code:
public function getName() { 
        return 
$this->vorname
         return 
$this->nachname
    } 
Aber das funktioniert ja auch nicht.
da zeigt es mir nur das erste return an.

Weißte da zufällig wie ich Vor und Nachname bei einer get function zurückliefern kann ?

lg
Du kannst immer nur ein return nutzen, danach wird an der Stelle der Code abgebrochen.
Für Vor- und Nachname müsstest du z.b. "return $this->vorname . " " . $this->nachname" machen.
02/16/2017 18:05 Mad0ck#6
[/QUOTE]

Quote:
Originally Posted by .ƒaℓsє. View Post
Du kannst immer nur ein return nutzen, danach wird an der Stelle der Code abgebrochen.
Für Vor- und Nachname müsstest du z.b. "return $this->vorname . " " . $this->nachname" machen.
Dann kann ich ja direkt bei der Klasse Lehrer, beim Konstrukor,dass $name weglassen und druch $vorname und $nachname ersetzen oder ?

Bzw. dann kann ich die Klasse Name ja generell löschen ôo ?

lg
02/16/2017 18:23 algernong#7
Quote:
Originally Posted by Mad0ck View Post


Dann kann ich ja direkt bei der Klasse Lehrer, beim Konstrukor,dass $name weglassen und druch $vorname und $nachname ersetzen oder ?

Bzw. dann kann ich die Klasse Name ja generell löschen ôo ?

lg
Ja, könntest du. Du musst abwägen, ob eine Klasse sinnvoll ist - oder eben nicht.

Brauchst du die Klasse tatsächlich nur, um den Vor- und Nachnahmen zu speichern -- und das nur an einer Stelle? Dann würde ich darauf verzichten. Wobei das auch sinnvoll sein kann; damit drückst du nämlich ganz deutlich aus, dass der Vor- und Nachname zusammen gehört.

Besteht ein Name aus noch mehr?
function __construct($vorname, $zweiterVornahme, $dritterVornahme, $nachname, $bedeutungDesNamens, ...)
Dann doch lieber eine Klasse Name.
Ebenso, wenn du Operationen aus einem Namen ausführen möchtest.

Willst du zu einem Namen (zum Beispiel) immer berechnen können, wie verbreitet er in Deutschland ist? Dann wieder eine eigene Klasse mit entsprechender Methode.

Welche Klassen man erstellt ist oft nicht so einfach zu entscheiden. Zumindest geht es mir so. Bin aber auch kein Experte.
Zuwenig Klassen sind doof, übermodellieren ist aber auch nichts.
02/17/2017 04:58 #Metho#8
Was du hat auch machen könntest, wäre die Magische Methode toString() zu verwenden:

PHP Code:
<?php

class Name {
    private 
$name;
    private 
$gender;
    
    public function 
__construct($name$gender
    {
        
$this->name $name// setzt private $name = $name
        
$this->gender $gender// setzt private $gender = $gender
    
}
    
    public function 
__toString() // Diese Function wird aufgerufen, sobald das Object von "Name" in eine Zeichenkette umgewandelt wird
    
{
        return 
'Name: ' $this->name ' Geschlecht: ' $this->gender;
    }
}

$name = new Name('Yannick''Männlich'); // Object von "Name"
echo $name// Echo verlangt eine Zeichenkette -> __toString() Resultat: Name: Yannick Geschlecht: Männlich

?>
02/17/2017 05:15 ctra#9
Quote:
Originally Posted by Mad0ck View Post
ok.
ich habe schon etwas probiert, bevor ich diesen post geschrieben habe.
PHP Code:
public function getName() { 
        return 
$this->vorname
         return 
$this->nachname
    } 
Aber das funktioniert ja auch nicht.
da zeigt es mir nur das erste return an.

Weißte da zufällig wie ich Vor und Nachname bei einer get function zurückliefern kann ?

lg
Wie bereits erwähnt wurde... es ist nur ein return möglich.. Das return funktioniert ähnlich wie ein "Unterbrechung" Sofern ein return ausgeführt wird bricht die Funktion ab und alles was nach dem return ausgeführt wird ist nicht mehr "reachable", wie mein PHP Storm wohl sagen würde :)

Quote:
Originally Posted by Mad0ck View Post



Dann kann ich ja direkt bei der Klasse Lehrer, beim Konstrukor,dass $name weglassen und druch $vorname und $nachname ersetzen oder ?

Bzw. dann kann ich die Klasse Name ja generell löschen ôo ?

lg
Ich würde die Referenz auf den Namen Obeject wohl lassen und einfach wie bereits gesagt jede Object Class, die in irgendeiner Form mal mit echo ausgegeben werden soll, mit einer toString Methode ausstatten.

Du wirst in der Schule zwar keine wirklich komplexe bzw. umfangreiche Beispiele programmieren (nehme ich mal an..) dennoch ist es mit einer gegebenen Referenz zu einem Name Object einfacher diverse Änderungen umzusetzen, weil du dann nur in der Object Class name was ändern musst und eventuell einen neuen Konstruktor hinzufügen (um z.B. zweit Namen, Titel etc pp).. hinzuzufügen.

Darüber hinaus kannst du in Zukunft dann auch noch mit dem name Object das Prinzip der Vererbung anwenden was auch noch viel Code spart... Wird dir dein Lehrer sicher noch beibringen wollen.

grüße
02/17/2017 06:36 Mad0ck#10
Ich danke euch :)
Vorallem großes Danke an
@algernong
@#Metho
@ctra

Das "Problem" wurde nun gelöst ( auf 3-4verschiedene Arten ^^ ), und habe das Problem generell, welches ich hatte auch verstanden !

Unglücklicherweise, kam das Kapitel " Magische Methoden " ,erst nach dem Destruktor und ich war erst beim Konstruktor q.q *FacePalmMySelfe*

Mir wurde jedoch auch alles bis ins kleinste Detail von @algernong via PN erklärt.

Wie gesagt, nochmals Danke an alle die sich immer die Mühe geben, um uns Neulingen zu helfen bei diversen Verständnisproblemen.

lg Mad0ck

#closerequest
02/17/2017 11:06 Devsome#11
Freut mich :3

#closed