[PHP] variable aus einer Funktion ausgeben?

Matthiasnet

Well-known member
ID: 116869
L
14 August 2006
271
7
Hi,

ich gebe eine Funktion aus und möchte die Variable, dir dort erstellt wird nacher ausgeben, jedoch klappt das nicht ganz.
Um das ganze zu verdeutlichen hier der Code:
PHP:
//Datei1
class mysql 
{

	   function select ($spalte,$tabelle,$where,$ordnen,$limit) {
	   	$sqlab = "
		SELECT $spalte
		FROM $tabelle";
		if ($where !=	'-') {$sqlab.=" WHERE $where";};
		if ($ordnen != '-') {$sqlab.= " ORDER BY $ordnen";};
		if ($limit != '-') {$sqlab.= " LIMIT $limit";};
		$sql	=	mysql_query($sqlab) OR die("MySql Abfrage konnte nicht verarbeitet werden: ".mysql_error());
		}
}
//Datei2
$mysql->select("farbwert","kontakt_farben","-","id","-");

while($row = mysql_fetch_object($sql))
    {
    echo $row->farbwert;
    }

Hoffe auf Hilfe

Grüße

Matthiasnet
 
1a) Du solltest die Klasse instanzieren, bevor du sie benutzst
1b) Wenn die Klasse statisch sein soll, musst du den Paamayim Nekudotayim-Operator benutzen (ich liebe dieses Wort 8))
2a) $sql ist außerhalb der Klasse nicht definiert. Du kannst es also auch nicht benutzen
2b) Solltest du dir angewöhnen, Ergebnisse aus Funktionen zurückzugeben und nicht versuchen, sie mit irgendwelchen Variablen rauszuschleusen.
 
joa auch wenn ich nur Hobbyprogger bin versuch ich mal drauf einzugehen^^
1a) hab ich, habs hier nur rausgelassen, sonst würde das ja überhaupt nicht funktionieren
1b)Meint du damit ich soll es so machen?
PHP:
function select ($spalte,$tabelle,$where,$ordnen,$limit) { 
$this->spalte=$spalte;
$this->tabelle=$tabelle;
$this->where=$where;
$this->limit=$limit;
$this->ordnen=$ordnen;

           $this->sqlab = " 
        SELECT $this->spalte 
        FROM $this->tabelle"; 
        if ($this->where !=    '-') {$this->sqlab.=" WHERE $this->where";}; 
        if ($this->ordnen != '-') {$this->sqlab.= " ORDER BY $this->ordnen";}; 
        if ($this->limit != '-') {$this->sqlab.= " LIMIT $this->limit";}; 
        $this->sql    =    mysql_query($this->sqlab) OR die("MySql Abfrage konnte nicht verarbeitet werden: ".mysql_error()); 
        } 
}

?
Aber wenn ich diese Variablen im weiterem nicht mehr benutze, ist es doch theoretisch gesehen egal, ob ich es mit dem Paamayim Nekudotayim-Operator^^ mache oder nicht.

2a) Gibt es den eine möglichkeit, dass es außerhalb definiert ist?
Habe gelesen das es mit global möglich ist, jedoch hat global $sql = $sql nicht geklappt...

2b) Ja stimmt schon...muss ich ja auch wenn es keine alternative gibt;)
 
Das heist
PHP:
global $sql;
aber empfehlen tue ich das nicht, theHacker meinte sicher mit
PHP:
return $sql;
am ende der Funktion.

Und das inizieren meinte er das du in deiner Datei schreibst

PHP:
$m = new mysql();
$res = $m->select(...,...,...,...);
oder wenn es statisch ist mit
PHP:
$res = mysql:select(...,...,...,...);

in $res steht nu das return drin. Alles klar soweit ;)

*edit
benutzt die PHP CODE Tags
 
Hi,

ja wie gesagt inizieren hatte ich schon...sonst komm ich ja gar nicht erst soweit, weil ich vorher schona dnere funktionen der klasse benutze^^

Aber danke, speicher ich das ganze in der Varibale ab mit dem return in der Funktion klappt das ganze:D
 
1a) hab ich, habs hier nur rausgelassen, sonst würde das ja überhaupt nicht funktionieren
Erklär mir das. So wie es dasteht, kann es nicht funktionieren, weil $mysql nicht definiert is.
1b)Meint du damit ich soll es so machen?
PHP:
function select ($spalte,$tabelle,$where,$ordnen,$limit) { 
$this->spalte=$spalte;
$this->tabelle=$tabelle;
$this->where=$where;
$this->limit=$limit;
$this->ordnen=$ordnen;
Nö ! Warum willst du die Variablen in der Klasse speichern, wenn du nur schnell n Query damit machen willst ? :LOL:
Aber wenn ich diese Variablen im weiterem nicht mehr benutze, ist es doch theoretisch gesehen egal, ob ich es mit dem Paamayim Nekudotayim-Operator^^ mache oder nicht.
Der Operator entscheidet, ob die Klasse instanziert werden muss oder nicht. Mit den Variablen hat das überhaupt nix zu tun.

2a) Gibt es den eine möglichkeit, dass es außerhalb definiert ist?
Habe gelesen das es mit global möglich ist, jedoch hat global $sql = $sql nicht geklappt...
Ja, is mit global möglich, widerspricht aber dem Prinzip einer Klasse, also nicht verwenden !
2b) Ja stimmt schon...muss ich ja auch wenn es keine alternative gibt;)
Wieso Alternative ? :hö:
Funktionen haben als Aufgabe, ihre Ergebnisse als Rückgabewerte zurückzuliefern. Wieso also großartig Müll rumbauen, wenn es doch auch ganz einfach geht ? ;)
Und das inizieren meinte er das du in deiner Datei schreibst
[...]
ja wie gesagt inizieren hatte ich schon...
Kleiner Tip:
Fremdwörter sind was Lustiges :biggrin: Inizieren und Instanzieren haben leider unterschiedliche Bedeutungen :mrgreen:

"Initiieren" (Substantive "Initialisierung", "Initial...") (gemäß deutscher Rechtschreibung mit 't' und Doppel-'i', da das zwei Silben sind: "i|ni|ti|ie|ren") meint das anfängliche Setzen von etwas (Synonym für "einleiten"), während
"Instanzieren" (von Substantiv "Instanz") das Erzeugen einer Instanz von etwas (hier: einer Klasse) bedeutet.

Wenn nicht klar is, was ne Instanz is, ruhig fragen, dann erklär ich das auch nochmal.
Aber danke, speicher ich das ganze in der Varibale ab mit dem return in der Funktion klappt das ganze:D
Würde ich gerne sehen, wie du das jetzt hast.
 
hehe, erstmal morgen^^

ich glaube das kommt davon wenn man von etwas schreibt wovon man noch net so viel ahnung hat, versuch trotzdem drauf einzugehen;)

Erklär mir das. So wie es dasteht, kann es nicht funktionieren, weil $mysql nicht definiert is.
Also damit mein ich, dass ich bevor ich die einzelnen Funktionen der Klasse verwenden kann, ich das Objekt mit $mysql=new mysql; erzeugen muss.
Mit Fachwörtern instanzieren, denk ich mir mal^^

Nö ! Warum willst du die Variablen in der Klasse speichern, wenn du nur schnell n Query damit machen willst ?
Weiß es nicht, wollt ich ja nicht machen...dann hab ich dich leider falsch verstanden, was meinst du den dann mit
1b) Wenn die Klasse statisch sein soll, musst du den Paamayim Nekudotayim-Operator benutzen (ich liebe dieses Wort )
Paamayim Nekudotayim-Operator = $this->, hab ich gelesen...

Würde ich gerne sehen, wie du das jetzt hast.
PHP:
//Datei1
//.....
function select ($spalte,$tabelle,$where,$ordnen,$limit) {
	   	$sqlab = "
		SELECT $spalte
		FROM $tabelle";
		if ($where !=	'-') {$sqlab.=" WHERE $where";};
		if ($ordnen != '-') {$sqlab.= " ORDER BY $ordnen";};
		if ($limit != '-') {$sqlab.= " LIMIT $limit";};
		$sql	=	mysql_query($sqlab) OR die("MySql Abfrage konnte nicht verarbeitet werden: ".mysql_error());
		return $sql;  
		}
//....
Datei2:
//....
$sql=$mysql->select("farbwert","kontakt_farben","-","id","-");

while($row = mysql_fetch_array($sql))
    {
    $farben[]=$row['farbwert'];
    }

//....


Wieso Alternative ?
Funktionen haben als Aufgabe, ihre Ergebnisse als Rückgabewerte zurückzuliefern. Wieso also großartig Müll rumbauen, wenn es doch auch ganz einfach geht ?
Zum Verständnis, ich sollte die Ausgabe
PHP:
while($row = mysql_fetch_array($sql))
    {
    $farben[]=$row['farbwert'];
    }
auch in eine neue Funktion einbauen, und nicht Variablen als Ergebnis einer Funktion ausgeben lassen?


PS: sollte ich irgendwas falsch oder abstrackt machen, bitte einfach schreiben, bin nähmlich gerade dabei "richtig" Php zu lernen, zumindest versuche ich es. Möchte nähmlich von der einfachen "Hobbyprogrammierung" wegkommen;)
 
Zuletzt bearbeitet:
ich glaube das kommt davon wenn man von etwas schreibt wovon man noch net so viel ahnung hat, versuch trotzdem drauf einzugehen;)
Drum postest du ja hier, damit du deine Ahnung vermehren kannst :)
Also damit mein ich, dass ich bevor ich die einzelnen Funktionen der Klasse verwenden kann, ich das Objekt mit $mysql=new mysql; erzeugen muss.
Mit Fachwörtern instanzieren, denk ich mir mal^^
Ok, gut. Die Zeile hat mir nämlich gefehlt, drum die Frage danach.
Richtig, wenn du
PHP:
$instanzvar = new klassenname();
machst, nennt man das "Instanzieren der Klasse".
Paamayim Nekudotayim-Operator = $this->, hab ich gelesen...
Falsch verstanden, das war das Problem.

Der Paamayim Nekudotayim (::) ist für statische Klassen zuständig.
In PHP ist es leider (vor PHP5) bei der Deklaration der Klasse nicht ersichtlich, ob sie statisch ist oder nicht. Seit PHP5 kann man Funktionen und Variablen als statisch deklarieren.

Zur Unterscheidung:
  • statische Klassen werden nicht instanziert !
    Damit man dennoch auf sie zugreifen kann, wird der Paamayim Nekudotayim-Operator gebraucht.
    Statische Klassen besitzen keinen Konstruktor.
  • nicht-statische Klassen müssen instanziert werden !
    Auf ihre Eigenschaften und Objekte kann mittels der Instanzvariablen, die beim Instanzieren erzeugt wird, zugegriffen werden.
    Nicht-statische Klassen besitzen einen Konstruktor.
Beispiel (PHP 4):
PHP:
class Math
{
  function calcRectangle(width, height)
  {
    return width*height;
  }
}

class Rectangle
{
  var width, height;
  function Rectangle(rectwidth, rectheight) 
  {
    $this->width=rectwidth;
    $this->height=rectheight;
  }

  function calc()
  {
    return $this->width*$this->height;
  }
}
Machen beide dasselbe, allerdings sieht der Aufruf unterschiedlich aus:
PHP:
// statische Klasse
$r1=Math::calcRectangle(10,4);
$r2=Math::calcRectangle(4,5);

// nicht-statische Klasse
$rect1=new Rectangle(10,4);
$rect2=new Rectangle(4,5);
// instanziere 2 unterschiedliche Objekte, derselben Klasse

$r1=$rect1->calc();
$r2=$rect2->calc();
// $rect2 kennt seine Breite immer noch
$w2=$rect2->width;
Code is ungetestet, aber Prinzip dürfte klar sein.
Die unterste Zeile sollte man so in seinem Script nicht stehen haben, sondern dient nur zum Verständnis, dass die statische Klasse nach dem Funktionsaufruf "alles wieder vergessen hat" und die nicht-statische Klasse hat immer noch alle Daten von dem Rechteck, um z.B. den Umfang mit einem weiteren Aufruf zu liefern.
Zum Verständnis, ich sollte die Ausgabe auch in eine neue Funktion einbauen, und nicht Variablen als Ergebnis einer Funktion ausgeben lassen?
Ne, das brauchst du nicht. Das dürfte sich mit obigen ja erledigt haben. Im Moment sieht das gut aus.

Es muss halt alles, was mit MySQL zu tun hat, in die Klasse. Idealerweise solltest du noch das mysql_fetch_...() auch darein packen.
Du darfst nur unter keinen Umständen was in die Klasse packen, was nicht reingehört, z.B. jetzt Farben auswerten. Die Werte kommen zwar von MySQL, haben aber nix damit zu tun. Sie könnten ja auch von einer anderen Datenbank kommen.
 
Danke für die ausführliche Beschreibung, eine Frage bleibt mir jedoch offen (auch wenn bei mir leider noch kein php 5 vorhanden ist, aber kommt ja bald bestimmt:roll: )
Gibt es weitere Unterschiede zwischen statischen und nicht statischen Klassen neben der Schreibweiße, außer das die statische Klasse ihre Werte vergisst?
(Ich persönlich würde die nicht-statische Klasse bevorzugen, da sie ja somit einen Vorteil bietet, auch wenn ich den Wert nur einmal verwenden sollte oder?)
 
Gibt es weitere Unterschiede zwischen statischen und nicht statischen Klassen neben der Schreibweiße, außer das die statische Klasse ihre Werte vergisst?
Das "Wertevergessen" ist der Unterschied. Die anderen syntaktischen Unterschiede ziehen nur nach.
(Ich persönlich würde die nicht-statische Klasse bevorzugen, da sie ja somit einen Vorteil bietet, auch wenn ich den Wert nur einmal verwenden sollte oder?)
Die nicht-statische Klasse sollte man eigentlich nur verwenden, wenn man mehrere (unabhängige) Funktionen irgendwo sammeln will. Dann könnte man sich aber die Klasse ja eh sparen.

Normal verwendet man ja eine Klasse, eben weil man den Vorteil von mehreren Instanzen haben will. Du schreibst einmal den Code für eine Datenbank-Verbindung, für eine Query und für das Auslesen der Ergebnisse. ...kannst aber am Ende auch 10 Datenbanken gleichzeitig konnektieren, lustig abfragen und auswerten, ohne über Komplikationen nachdenken zu müssen. Jede Datenbank-Verbindung sammelt dir vielleicht noch Statistiken über Queryzeiten und Anzahl; separat versteht sich, weil jede Instanz ihre eigenen Variablen hat.

Stell dir die Klasse als Schablone vor. Ein Haus hat ne Farbe, ne Höhe, ne Anzahl Stockwerke und ne Haustür, die man öffnen kann. Trotzdem sieht aber jedes Haus anders aus.
Willst du dann für jedes Haus einzeln die Funktion schreiben, wie man die Tür öffnet ? Ne, das mit der Tür geht immer gleich: Klinke runterdrücken und reingehen.

Anderer Vorteil von Klassen: Stell dir vor, dein Code sieht so aus:
PHP:
$db=new Mysql();
$db->connect("localhost","root","1234");
$db->select_db("dbforum");
$res=$db->query("SELECT * FROM foo");
echo $db->get_result($res);
So hast dus ja auch.

Wäre es nicht cool, wenn du nur die Klasse auswechselst und damit mit ner MsSQL oder ner PostgreSQL, oder ... kp, was es noch für DB-Systeme gibt, verbinden kann ?
PHP:
$db=new Postgresql();
$db->connect("localhost","root","1234");
$db->select_db("dbforum");
$res=$db->query("SELECT * FROM foo");
echo $db->get_result($res);
Die restlichen 10000 Zeilen Script musst du nicht ändern. Nur schnell mal ne neue Klasse einsetzen ;)
 
stimmt, leuchtet mir ein.
Nochmals danke für die Hilfe, bin nun auch wieder nen Stück schlauer in Sachen Klassen geworden:roll: