objekt in objekt erstellen

luchs3

Erfahrenes Mitglied
Hi,

Ich bin noch dabei meine oop Kenntnisse zu schärfen.
Ich möchte in einem Objekt ein ganz anderes erstellen.

In diesem Fall soll eine Kontaktliste mit hinzugefügten tickets.
Der Ticket Name wird in der ticket Klasse erstellt.

Ich habe mal damit begonnen die ticket.class mit require zu inkludieren und dann das Objekt zu erstellen.
Keine Ahnung ob das stimmt.

Es funktioniert, wenn ich den Namen in der ticket Klasse mit echo anzeigen lasse.
Aber ich will ihn als Variable übergeben, und das geht gar nicht.

Ist das so überhaupt konform, oder muss ich das über den konstruktor starten?

kon_list Klasse
PHP:
class kon_list {
    
    public function __construct($type, $db_pdo) {
    
        $this->type = $type;
        $this->db_pdo = $db_pdo;
    
    }
    
    public function show() {
    
        require ('classes/ticket.class.php');
    
        $result = $this->db_pdo->prepare("SELECT * FROM kon WHERE kon_id in (Select ticket_kon From ticket WHERE ticket_package is NULL) ORDER BY kon_fafirma ASC");
        $result->execute();
        
        echo '<div class="in10" style="border:solid 1px; width:600px; height:400px; overflow: auto;">
        <table>';
        
        while ($user_row2 = $result->fetch()) {

            echo '<tr>
            <td><input type="checkbox" checked> '.$user_row2[kon_fafirma].'</td>';
            
            $result_ticket = $this->db_pdo->prepare("SELECT ticket_id FROM ticket WHERE ticket_kon = $user_row2[kon_id] && ticket_package is NULL");
            $result_ticket->execute();
            
            while ($ticket = $result_ticket->fetch()) {
            
                $ticket = new ticket ($ticket[ticket_id], $this->db_pdo);
                $ticket->show();
                
                echo '</tr><tr>
                <td style="padding-left:20px;"><input type="checkbox" checked>'.$ticket->$this->ticket_name.'</td>';
            
            }
            
            echo '</tr>';
        }
        
        echo '</table>
        </div>
        
        <div class="button">
        <input type="button" class="link_g" value="weiter"></div>';
        
    }
}

ticket Klasse
PHP:
class ticket {
	
	public function __construct($ticket, $db_pdo) {
	
		$this->ticket_id = $ticket[ticket_id];
		$this->ticket_kon = $ticket[ticket_kon];
		$this->db_pdo = $db_pdo;
	
	}
	
	public function show() {
	
		$result = $this->db_pdo->prepare("SELECT * FROM ticket WHERE ticket_id = $this->ticket_id");
		$result->execute();
	
		$name = $result->fetch();

		// Hier wird der Name bearbeitet

		return $name[ticket_name];

	}

}
Danke im vorraus
Niko
 
Zuletzt bearbeitet:
hi,
ähm macht das hier sinn?

PHP:
while ($ticket = $result_ticket->fetch()) {
                $ticket = new ticket ($ticket[ticket_id], $this->db_pdo);

bzw. is unschön...

das andere is das du nen tippfehler hast
PHP:
echo '</tr><tr>
                <td style="padding-left:20px;"><input type="checkbox" checked>'.$icket->$this->ticket_name.'</td>';

sollte $ticket heissen ?!
 
Zuletzt bearbeitet:
das ist eben die Frage.
Der Ticketname wird in der ticket klasse später bearbeitet und soll dann korrekt zurückgegeben werden.

Jetzt will ich nur mal wissen, wie ich das anstelle, das Namen bearbeiten usw. kommt dann noch.

sollte jetzt ersichtlicher sein
 
Zuletzt bearbeitet:
und wo beschreibst du dieses ticket_name ?
das andere is natürlich das dann
$ticket->$this->ticket_name bissl blöd is da this meines erachtens nur im aktuellen objekt den zeiger auf das eigene hat, aber nicht von aussen zugreifbar is
 
das ist der Punkt, wo ich hänge.
Keine Ahnung wie man so etwas macht.

Die Frage ist eben, ob das sauber ist. oder ob ich das ganz anders anstellen muss.
Das war jetzt nur mal so der erste Gedanke wie man das Problem lösen könnte.

Ist warscheinlich besser das ergebnis mit einer public variable zu übergeben, aber wie übernehme ich die dann?
 
Zuletzt bearbeitet:
habs mir gerade einmal etwas genauer angeschaut, das problem was ich angesprochen habe lag ja darin, das du quasi auf ne temporäre variable zugreifen möchtest, die aber nach OOp oder sonstwas nach verlassen der ticket::show funktion gelöscht werden wird. DA du aber in der ticket::show() methode den ticket namen zurückgibst, solltest du den dann auch in der aufrufenden klasse hernehmen. Mit
PHP:
$ticket_name =  $ticket->show();

z.b. und diesen wert dann mit
PHP:
echo '</tr><tr>
                <td style="padding-left:20px;"><input type="checkbox" checked>'.$ticket_name.'</td>';

ausgeben, oder gleich:
PHP:
echo '</tr><tr>
                <td style="padding-left:20px;"><input type="checkbox" checked>'.$ticket->show().'</td>';
 
Also hier liegen glaube ich Probleme vor wo garkeine sind.
PHP ist evt auch die falsche Sprache um OOP zu lernen da sie viel zulässt was eigentlich grundlegend falsch ist oder verwirrt (allein durch fehlende Typsicherheit).

Grundsätlich werden erstmal Klassendeklarationen vorher gemacht und nicht in anderen Klassen (außer man will das so -> private Klassen). Das heißt für dich, dass du dein require_once nicht mitten im Quelltext machen solltest sondern VOR der Deklaration der anderen Klasse:
PHP:
require ('classes/ticket.class.php');

class kon_list {    

    public function __construct($type, $db_pdo) {
    
        $this->type = $type;
        $this->db_pdo = $db_pdo;
    
    }
    
    public function show() {
        $result = $this->db_pdo->prepare("SELECT * FROM kon WHERE kon_id in (Select ticket_kon From ticket WHERE ticket_package is NULL) ORDER BY kon_fafirma ASC");
        $result->execute();
        
        echo '<div class="in10" style="border:solid 1px; width:600px; height:400px; overflow: auto;">
        <table>';
        
        while ($user_row2 = $result->fetch()) {

            echo '<tr>
            <td><input type="checkbox" checked> '.$user_row2[kon_fafirma].'</td>';
            
            $result_ticket = $this->db_pdo->prepare("SELECT ticket_id FROM ticket WHERE ticket_kon = $user_row2[kon_id] && ticket_package is NULL");
            $result_ticket->execute();
            
            while ($ticket = $result_ticket->fetch()) {
            
                $ticket = new ticket ($ticket[ticket_id], $this->db_pdo);
                $ticket->show();
                
                echo '</tr><tr>
                <td style="padding-left:20px;"><input type="checkbox" checked>'.$ticket->$this->ticket_name.'</td>';
            
            }
            
            echo '</tr>';
        }
        
        echo '</table>
        </div>
        
        <div class="button">
        <input type="button" class="link_g" value="weiter"></div>';
        
    }
}

Weiterhin frage ich mich ob du nur den halben Quelltext gepostet hast?
Du schreibst im Konstruktor:
PHP:
        $this->type = $type;
        $this->db_pdo = $db_pdo;
Leider kann ich keine Attribute type oder db_pdo finden auf die diese Zuweisung passen würde. Das sollte eigentlich auch Fehler erzeugen...
In der Klasse Ticket das selbe Spielchen.

Meine Frage wäre erstmal warum du überhaupt die Klasse Ticket hast? Du speicherst weder das erzeugte Objekt (bzw die x-fach erzeugten Objekte durch die Schleife) noch erfüllen die einen anderen Zweck. Es wird einfach nur eine Funktion aufgerufen mit neuen Daten. Diese Daten könntest du aber genauso an eine Methode der Klasse kon_list übergeben un dir so den "Stress" mit dem Objekt sparen.

Weiterhin hat deine show-Methode der Klasse Ticket nen Rückgabewert der überhaupt nicht verarbeitet wird!

Also meine Meinung: Insgesamt ein nutzloses Stück Quelltext wo man nicht sieht welcher Sinn erfüllt werden soll und mit unmengen von Fehlern!

Ich kann mir nicht vorstellen das auch nur eine Zeile jemals fehlerfrei ausgeführt wurde wenn das das einzige Stück Quelltext ist und du nicht nur die Hälfte gepostet hast.

Also bitte den kompletten Quelltext nachreichen und wenn das nicht der Fall ist würde ich erstmal ein Buch zu OOP kaufen (am besten für Java) und mir dann Eclipse (IDE - Freeware) laden und das Buch durcharbeiten. Wenn du dann was mit Begriffen wie Klasse, Objekten, Attributen, Methoden, Vererbung, Interfaces, Polymorphie, Überladen von Methoden, Überschreiben von Methoden, ... anfangen kannst würde ich mich an PHP wagen und da die OOP umsetzen. Weil so wird das auf längere Zeit wirklich nichts...

lg
 
Zurück