php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Verständnisproblem bei Klassen


 
Pascal P.
05-08-2003, 13:15 
 
Hi zusammen,

habe ein gaaaaanz dooooofes Problem mit PHP. Folgendes (stark vereinfachtes Beispiel)


class app {

var db = null;
var is_active = false;

function app {
$this->db = new db_connection;
$this->is_active = $this->connected();
}

function connected () {
return $this->db->active();
}

function print() {
print_r($this);
}

}


So, jetzt kommt der Gag! Wenn ich das Objekt erstelle wird ein Objekt erstellt, welches mir meine Verbindung zur Datenbank zur Verfügung stellt.
Wie man im Moment sehen kann, wird bein erstellen der Klasse, gleich nach dem erstellen des Objektes für die Datenbankverbindung, geprüft ob die Verbindung zur DB auch steht. Bekomme jedoch nur folgende Fehlermeldung: "Fatal error: Call to a member function on a non-object"
Was das bedeutet ist mir schon klar.
Spassenshalber habe ich mir das Pbjekt mal ausgeben lassen. Siehe Funktion print. Rufe ich die Funktion direkt hier auf...


class app {

var db = null;
var is_active = false;

function app {
$this->db = new db_connection;
$this->print();
//$this->is_active = $this->connected();
}

function connected () {
return $this->db->active();
}

function print() {
print_r($this);
}

}


... dann gibt es zwar die Variable $this->db, aber die ist leer. Das Objekt ist nicht vorhanden! So, passe ich die Klasse mal wie folgt an...

class app {

var db = null;
var is_active = false;

function app {
$this->db = new db_connection;
//$this->is_active = $this->connected();
}

function connected () {
return $this->db->active();
}

function print() {
print_r($this);
}

}

$objekt = new app;
$objekt->print();

... dann hat $this->db das Objekt was ich brauche.

Daraus schliesse ich folgendes Resultat. Habe ich in einer Klasse ein Objekt, wie in dem Beispiel, kann ich nur ausserhalb der KLasse, also vom Objekt darauf zugreifen, aber nicht intern aus der KLasse heraus?

Sagt mal habe ich da ein Verständnisproblem? Kann man das Problem irgendwie umgehen? Mache ich was falsch? Habt ihr mein Problem verstanden?

Schonmal danke im Vorraus für Eure Hilfe. Bin grad verzweifelt, da ich in meiner KLasse viel Intern abarbeite und nicht alles von draussen, von der Variable (mein Objekt) steuern möchte.

Gruß

 
Abraxax
05-08-2003, 13:55 
 
ich habe jetzt nur die 1.hälfe gelesen.... :D

aber mache mal aus var db = null;einfach var db;

 
Pascal P.
05-08-2003, 14:02 
 
Ne, da muss ich dich leider enttäuschen, das war es nicht.
Ich kann das auch nicht so richtig verstehen, wenn ich intern, also in der Klasse auf das Objekt zugreifen möchte geht das nicht. Mache ich das gleiche, aber von der Objektvariable aus, dann geht es. Das ist doch ein schlechter Scherz, oder?

 
Abraxax
05-08-2003, 14:15 
 
so vertraut bin ich mit den classes auch nicht. es war nur eine idee, wie ich deine meldung 'ist kein objekt' gelesen habe... ;)

 
CrazyPip
05-08-2003, 14:24 
 
und was ist wenn du einfach $this->db an die Funktion übergibst? als Parameter meine ich...


class app {

var db = null;
var is_active = false;

function app {
$this->db = new db_connection;
$this->print($this->db);
//$this->is_active = $this->connected();
}

function connected () {
return $this->db->active();
}

function print($var) {
print_r($var);
}

}


ich bin mir nämlich nicht sicher was PHP und $this versteht, wenn man dies allgemein ausgeben möchte...$this ist schliesslich das Objekt, die Zuordnung, innerhalb der Klasse...

cya CrazyPip

p.s. bin auch noch recht neu in dem element

 
slarti
05-08-2003, 15:45 
 
probier mal mit$this->db=& new db_connection;

 
BlobBanana
05-08-2003, 20:09 
 
Ich hab mit deiner Klasse mal rumprobiert ... hatte aber haufenweise Fehler und ich frage mich wieso du die nicht hattest ... nach dem umbauen funktionierte das dann:


class app {

// hier fehlte das $-Zeichen
var $db = null;
var $is_active = false;

function app() {
$this->db = new db_connection;
$this->is_active = $this->connected();
$this->print_me();
}


function connected () {
return $this->db->active();
}

// Hier habs vor allem aerger vom Interpreter,
// da print() eine php-funktion ist
function print_me() {
print_r($this);
}
}

$test = new App;


So zeigt er mir das Objekt zumindest bei mir korrekt an ...

 
freudenspender
05-08-2003, 22:06 
 
auf ein object innerhalb einer klasse 'zuzugreifen' ist überhaupt kein problem.
alles was ich sehen konnte (beim überfliegen) ist das wie BlobBanana erkannt hat du ein paar syntax-fehler drin hast

und slarti´s beitrag solltest du (generel) folge leisten!
da du sonst (dank ZE1) ein object von einer kopie der klasse bekommst
da muss man sicher fragen - wozu?
das ist schließlich meist ungewollt und auch noch performance mindernd

print ist keine funktion, sondern viel mehr ein schlüsselwort, es steht auf der selben stufe wie auch if oder var (leicht zu erkennen da es grün hervorgehoben ist)
PHP-Funktionen können ja auch überschrieben werden

 
BlobBanana
05-08-2003, 22:39 
 
Original geschrieben von freudenspender

print ist keine funktion, sondern viel mehr ein schlüsselwort, es steht auf der selben stufe wie auch if oder var (leicht zu erkennen da es grün hervorgehoben ist)
PHP-Funktionen können ja auch überschrieben werden

Jo, habs auch gerade nachgelesen (http://www.php.net/manual/de/function.print.php). Hatte mich schon gefragt wieso die sich nicht ueberschreiben lies ...

 
Pascal P.
06-08-2003, 12:05 
 
lol, sorry für die Fehler im Skript, habe mir das nur ausgedacht und hingeschrieben. Hab hald nicht mehr drüber geschaut, soll vorkommen :-)
Aber an den Fehlern liegt es nicht. Und das Beispiel das ich gemacht habe, bringt auch keine Fehlermedlung, sondern mein Problem ist was anderes.
Also wir nehmen nun das korrigierte Skript :-)


class app {

// hier fehlte das $-Zeichen
var $db = null;
var $is_active = false;

function app() {
$this->db = new db_connection;
$this->is_active = $this->connected();
$this->print_me();
}


function connected () {
return $this->db->active();
}

// Hier habs vor allem aerger vom Interpreter,
// da print() eine php-funktion ist
function print_me() {
print_r($this);
}
}

$test = new App;


Wenn Ihr euch das Objekt $this->db anschaut, dann müsste euch was auffallen?!
Wenn ich den "print_me()" Befehl intern, aus der Klasse heraus aufrufe, dann müsste bei Euch das $this->db Objekt leer, also gleich NULL sen, richtig?

Wenn Ihr die "print_me()" Funktion aber von aussen aufruft, also

$test->print_me();


dann müsstet Ihr sehen, dass in dem Objekt $this->db auch wirklich Daten enthalten sind, also ich habe hier wirklich Zugriff auf das Objekt, es ist vorhahden.

Jetzt mein Problem verstanden? Also das ist jedenfalls bei mir das Problem.
So, jetzt weitere Ideen :-)

Gruß Pascal

 
freudenspender
06-08-2003, 14:25 
 
hat bei mir (PHP5B1) wunderbar funktioniert

<?php

class app
{

var $db = null;
var $is_active = false;

function app()
{
$this->db = new db_connection;
$this->is_active = $this->connected();
$this->print_me();
}


function connected ()
{
return $this->db->active();
}

function print_me()
{
print_r($this);
}

}

class db_connection
{

function active()
{
return true;
}

}

$test = new App;
// Ausgabe: app Object ( [db] => db_connection Object ( ) [is_active] => 1 )

?>



... Wenn ich den "print_me()" Befehl intern, aus der Klasse heraus aufrufe, dann müsste bei Euch das $this->db Objekt leer, also gleich NULL sen, richtig?


nö, weil ohne eine db_conncetion klasse könnten wir nichts testen, weil Fatal Error
und da der konstruktor mit new App aufgerufen wird, der wiederum das db_connection object initialisiert, ist $this->db entweder ein object oder garnichts, wegen dem fehler

 
Pascal P.
06-08-2003, 15:24 
 
Schuldigung für meine Art, aber
nö, weil ohne eine db_conncetion klasse könnten wir nichts testen, weil Fatal Error
mir geht es nicht darum ob in dem Skript, was in dem Forum steht, die Klasse db_connection gar nicht vorhanden ist. Es geht mir auch nicht um diverse Syntax Fehler. Ich habe einfach nur einen Fehler festgestellt, den ich versuche zu umgehen. Ihr klammert euch immer an das Skript, welches im Forum steht.

Ich habe ein Objekt vom Typ "app". Dieses Objekt hat eine Eigenschaft, undzwar die $this->db, welche wiederum ein Objekt ist, jedoch der Klasse "db_connection".

Das Objekt $this->db erstelle ich im Konstruktor von der Klasse "app".
So weit so gut. Nach dem Erstellen meines Objektes vom Typ "app" habe ich auch die Eigenschaft $this->db vom Typ db_connection.
Auf diese möchte ich ja natürlich zugreifen.
Und dann habe ich auf einmal einen Fehler bekommen. Ich weiss wo der FEHLER liegt, warum das also passiert.

Wenn ich eben mir das Objekt vom Typ "app" mit print_r() ausgeben lasse
habe ich 2 Unterschiedliche Ergebnisse. Rufe ich die Funktion von aussen auf, bekomme ich alles geliefert, samt dem Objekt vom Typ db_connection.
Wenn ich aber den print_r() Befehl intern aufrufe, also z. B. im Konstruktor (nachdem ich das Objekt vom Typ db_connection erstellt habe!), dann steht mir das Objekt db nicht zur Verfügung.

Jetzt irgendwie klar?

Aber ich könnte es mal mit PHP5 versuchen. Benutze im Moment noch PHP4.3.2

 
BlobBanana
06-08-2003, 16:18 
 
Original geschrieben von Pascal P.

Wenn ich aber den print_r() Befehl intern aufrufe, also z. B. im Konstruktor (nachdem ich das Objekt vom Typ db_connection erstellt habe!), dann steht mir das Objekt db nicht zur Verfügung.


Ich habs mit ner db_connection Klasse getestet ... und mir steht das Objekt vom Typ db_connection intern zur Verfuegung.
Ich erhalte naemlich folgende Ausgabe:

app Object ( [db] => db_connection Object ( [conn] => Resource id #2 ) [is_active] => Resource id #2 )


Aber ich könnte es mal mit PHP5 versuchen. Benutze im Moment noch PHP4.3.2

Ich benutze auch nicht PHP5 ...

Bei dir muss irgendwas anderes noch schieflaufen ... wenn ein Objekt nicht innerhalb einer Klasse zur Verfuegung stehen wuerde, dann waere die gesamte OOP recht nutzlos...

 
Pascal P.
06-08-2003, 19:27 
 
Genau das denke ich mir auch, dann wäre das ganze OOP nen Witz und ich dann ganz doll traurig :-)
Daher denke ich mir, dass ich irgend etwas falsch mache.

Man, wenn ich jemanden da hätte dem ich mein Problem mit Händen und Füßen erklären könnte, wäre das bestimmt einfacher.
Ich mein wie in dem ersten Post von mir schon erwähnt habe. Das ist ein stark vereinfachtes Beispiel.

Aber ich glaub jetzt ist mir noch ne Möglichkeit eingefallen woran das liegen kann. Muss ich mal schnell prüfen. Meld ich dannw ider.
Trotzdem danke für Eure Hilfe.

 
Pascal P.
06-08-2003, 19:38 
 
Okey, jetzt habe ich das Problem gelöst ;-)

Es macht einen Unterschied ob ich das Objekt, in dem Beispiel von diesem Thread war es z. B. $this->db intern, also z. B. im Konstruktor erstelle, oder ob ich es über eine Funktion von aussen erstellen z. B. $test->db = new db_connection;

Also mein Problem ist auf jedenfall behoben. Kann das aber mal bitte einer prüffen ob das richtig ist was ich da rede?
Danke für Eure Hilfe ;-)

 
BlobBanana
07-08-2003, 03:09 
 
Nein das ergibt eigentlich keinen Sinn ...
Innerhalb einer Klasse kann man auch problemlos Instanzen von anderen Klassen erzeugen und braucht sie nicht von "aussen" erstellen ...

 
Pascal P.
07-08-2003, 08:55 
 
Ja, das denke ich mir auch! In anderen Sprachen geht es ja auch.
Aber das Problem habe ich trotzdem. Denk mir sowas ja nicht aus.
Es ist einfach so. Bei mir sieht es so aus. Ich habe eine Klasse. Meine Hauptklasse. Diese hat wie gesagt z. B. die Besagte Eigenschaft $this->db.
$this->db ist dann meinetwegen vom Typ db_conection.
Das Objekt hat $this->db hat auch wieder Eigenschaften und zwar $this->connections, welches ein Array ist, der die Verbindungen beinhaltet und die ist vom Typ connection, damit habe ich dann z. B. eine oder mehrer Datenbankverbindungen. Dami´t ist es mir nur möglich verschiedene Datenbankserver, von verschiedenen Typen zu handeln.

Und nun kommt mein Problem, was ich beschrieben habe. Aber der 3 Ebene -> also ab der Ebene wo ich dann die Objete meiner Connection habe, die Fehlern mir dann.


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:34 Uhr.