PHP: Klasse/Funkction: Ausgabe ohne Wert

Nachtrag:

Das hat mich gerade ein bisschen nachdenklich gemacht und lässt mich darüber nachdenken das ganze vielleicht doch anders zu lösen, bzw. so wie geplant:

Wegen der vielen Nachteile wird das Singleton-Muster (und auch das Idiom Double-checked Locking) mitunter schon als Anti-Pattern bewertet. Für Fälle, wo tatsächlich technisch ein passender Bereich für ein Singleton existiert (z. B. wenn nur ein einziges GUI von einem Programm ausgesteuert wird) sind Singletons aber sinnvoll – insbesondere wenn sie sich auf andere „einmalige Strukturen“ wie z. B. eine Abstract Factory beziehen. Trotzdem: Das korrekte Design von Singletons ist schwierig – in der Regel schwieriger als Designs ohne Singletons.

Quelle: http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)#Nachteile


Gruß Daniel
 
Also der Beitrag bezieht sich jetzt nicht explizit auf die Umsetzung des Singletons unter php.. es ist sehr wohl brauchbar, und wenn du dich durch Fachliteratur durchkämpfst, wirst du nicht so infernal schlimme Sachen darüber hören.. ich denke da will sich einer nur ein bischen wichtig machen oder so. Die Person geht bei den Vor- und Nachteilen auch keineswegs auf die Webentwicklung ein, wo man konzeptionell eh ein bischen anders planen dürfte, als bei der normalen Anwendungsentwicklung. Probier das mal. Die Komponenten den Singleton zu realisieren hab ich dir gezeigt ;)

Verwendung in der Analyse [Bearbeiten]

In der Analyse wird ein (fachliches) Singleton in der Regel dadurch gekennzeichnet, dass die Multiplizität der Klasse als 1 definiert wird. Wie auch im Design muss der Bereich der Multiplizität hinterfragt werden: Gibt es tatsächlich nur "eine Zentralstelle für ...", oder können z.B. in länderübergreifenden Systemen sehr wohl mehrere Objekte einer Sorte existieren?

So, da ist die Antwort in hinsicht auf den DB connector eindeutig ja.
Nachteil dieser Variante ist, dass auch nach der Instanziierung jeder Lesezugriff über getInstance(); synchronisiert ist und so mehrere gleichzeitig zugreifende Threads sich gegenseitig blockieren. In Java gibt es hierfür keinen Workaround.
In PHP gibt es kein Multithreading, also gibt es an dieser Stelle auch keine Gefahr.

Puh, ja feiern war super, hab gestern den ganzen Tag gebraucht, um wieder in die Pötte zu kommen ;D

Gruß softi
 
Hallo,

kenne ich irgendwoher. Habe aber gestern trotzdem den ganzen, halben Tag gearbeitet um mein Projekt fertig zu bekommen. :)

Zu der Sache mit den Singletons. Nach weiterem einlesen sehe ich, dass diese Lösunge doch sehr gut ist, vorallendingen (wie du schon sagtest) durch die möglichkeit der "Instanzenkontrolle" mittels private z.B.

Allerdings bin ich bis dato da noch nicht wirklich durchgestiegen wie das funktionieren soll, .... trotz deiner Beschreibung und diesem hier z.B.:
http://www.phpbar.de/w/Singleton


Wenn ich folgenden Code schreibe funktioniert alles, bei deinem Codebeispiel leider nicht:
PHP:
class db_connector
{

	static private $instance;
	
	static public function getInstance() {
		if (!self::$instance)
		{
		self::$instance = new db_connector();
		}
		return self::$instance;
	}
}


Gruß Dniel
 
Zuletzt bearbeitet:
ja oops, hab statt self:: den klassennamen geschrieben oO tut mir leid für den Fehler.
Das Funktioniert so, das sobald dein script läuft, die statische Variable lesbar und beschreibbar ist. Die statische Variable (blöder Name) ist Klassengebunden, und nicht objektgebunden. Das heißt, wenn jetzt, angenommen wir haben mehrere Objekte einer Klasse auf eine statische Variable zugreifen, greifen wirklich alle auf die selbe Variable zurück, sie wird quasi von allen Objekten geteilt, um das mal zu veranschaulichen. Wenn du jetzt allgemein ein Objekt anlegst, packst du ja nich das Objekt in eine Variable, sondern nur den Verweis auf den Speicherbereich.
Bei dem singleton Konstrukt muss man ein bischen den Kopf verknoten ;) Wenn du jetzt den Singleton das erste mal erschaffst, packt er den Verweis in die KLASSENzugehörige Variable instance. Die instance() funktion ist auch statisch, das heisst klassenzugehörig, man muss nicht erst ein Objekt erstellen, um an die Methode heranzukommen. Rufst du mehrere Male die Methode auf, wird nur beim ersten Mal das Objekt angelegt. Danach wird nur noch der Verweis zurückgegeben, der in der statischen Variable hinterlegt ist.

Puh, ich hoffe das war einigermaßen verständlich, manchmal ufern meine Erklärungen ein bischen aus ;D

Viel Spass beim Kopfzerbrechen

-softi
 
Guten morgen,

... danke hey! Mein Kopf zerbreche ich mir schon die ganze Zeit! :)
Ich verstehe einfach nicht, bedingt dadurch das ich noch nie etwas mit singletons zu tun hatte, wie ich Daten eingebe. Welche Daten soll ich da eingeben, die connection_id. .... oder sonst was?
Sorry, ich glaube die Lösung ist mir zu hoch. Vielleicht denke ich, wie meistens (fast immer ;) ), einfach nur zuu kompliziert!

Ich habe mal mein Programm-ablauf angehängt, vielleicht hilft es dir weiter mich besser zu verstehen! ;)

Grüße und nochmals VIELEN DANK für deine Hilfe,
Baum
 

Anhänge

  • HEW - neu - Functiondiagramm.jpg
    HEW - neu - Functiondiagramm.jpg
    27,3 KB · Aufrufe: 19
Nachtrag:

Soweit bin ich nun schon, mit Hife aus dem Forum.
Jedwoch wird mir weder ein Fehler, noch sonst was ausgegeben.

PHP:
class DB_com_ 
{ 
	private $host = "xxx";
	private $username = "yyy";
	private $password = "zzz";
	private $database = "aaa";
	private $fehler = false;
	public $fehlertext;
	private $query = "	SELECT
							PagePath, Section, Hersteller, Hauptkategorie, Subkategorie, Kategorie01, Kategorie02
						FROM
							link_verwaltung
						WHERE
							LinkID = 3";
	private $ressource;
	
//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
	static private $thisInstance;
//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
	static public function getInstance() {

		if (!self::$thisInstance) { 
			self::$thisInstance = new DB_com_(); 
		}
		return DB_com_::$thisInstance; 
	}
//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
	private function __construct() { 

		$this->host		= $host; 
		$this->database	= $database; 
		$this->username	= $username; 
		$this->password	= $password; 
	} 
//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
	public function server_connect() {

		if(!mysql_connect ($this->host, $this->username, $this->password)) {
			return false; 
		}else{
			$fehler = true;
			$fehlertext .= mysql_error();
			return true;
		}
				
        if(!mysql_select_db($this->database)) {
			$fehler = true;
			$fehlertext .= mysql_error();
		}
		
//		$sql = "SET NAMES 'utf8'"; 
//		mysql_query($sql); 

		if($fehler == true) 
		{ 
			echo $fehlertext; 
		} 

	} 
//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
	function db_query($query) {

		$fehler = false; 
		$fehlertext = ""; 

		$ressource = mysql_query($query); 
		 
		if(empty($ressource)) 
		{ 
			$fehler = true; 
			$fehlertext .= mysql_error();
		} 
		if($fehler == true) 
		{ 
			echo $fehlertext; 
		} 
		else 
		{
			echo $ressource."<br>\n";
			return $ressource; 
		} 
	}
 
//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
	function num_rows($ressource) { 
		$rows = mysql_num_rows($ressource);
		echo "Function: num_rows: ".$rows."<br>\n";
		return $rows; 
	}
//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
	function affected_rows($ressource) { 

		$rows = mysql_affected_rows($ressource); 
	
	echo "Function: affected_rows: ".$rows."<br>\n";	 
	return $rows; 
	}
//------------------------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------------------------
}
 
Ach ich glaube, ich versteh so einigermaßen dein Problem mit dem Singleton. Mit dem Programmablauf hat der nichts zu tun, das ist nur ein Konstrukt, das Objekt mit besonderen Eigenschaften zu instanziieren. Es wird ansonsten genauso verwendet, wie ein normales Objekt auch. Die Variablen und Funktionen die zusätzlich für das Singleton dazukommen, sind nur dafür da, um ihm die besondere Eigenschaft zu geben.

Soo, und nu zu deinem Programmablauf =) Find ich grundsätzlich sehr gut, aber als Ansatz, um auch für sich selber eine Strukturierung zu machen, finde ich einen Objektplan sehr sinnvoll. Erst mal nur als Diagramm, ohne sich Gedanken um die Schnittstellen zu machen. Dann würde ich das ganze verfeinern und mir Gedanken über die Daten machen, welche wo verarbeitet werden, und danach kann man ungefähr erahnen, welche Information zwischen welchen Objekten ausgetauscht werden.
Programmabläufe finde ich immer zu sequenziell als ansatz, daraus finde ich es schwierig objektorientierte Strukturen zu formen, deshalb muss ich ganz ehrlich sagen, kann ich auch nicht soo viel mit dem Plan anfangen. Ich würde dir wirklich Raten, noch ein Buch zu lesen, zum Beispiel als Anfang PHP & MySQL von Addison Wesley Verlag, Autor ist Michael Kofler und Bernd Öggl; ist als Einstieg schon mal sehr gut. Es ist halt schwierig, ne komplette Projektplanung übers Forum zu machen, und über die Ansätze dafür zu Diskutieren.. nich falsch verstehen, ich bin noch da und bleib noch hier! ;) Aber ein bischen Selbststudium kann echt hilfreich sein!

Mal schauen, was du zum Anhang sagst :) Das ist erst mal ein grundlegendes Konzept wie ich mir den überblick beschaffen würde, welche Objekte ich benutzen würde, vielleicht gefällt dir das als Ansatzstrategie. Geh vom Groben ins kleine.

Würde mich freuen, wenn ich von den Profis da draussen ein Kommentar kriegen würde ;D
..oder vielleicht lieber nich -.-

softi

Edit: lass dir mal mit var_dump() alle Variablen ausgeben, irgendwo muss was drinne stehen. Wenn er dir für den Rückgabewert von db_query() ne resource angibt, musst du sie noch richtig auslesen. Dann dürftest du dein langersehntes Ergebnis haben ;)
 

Anhänge

  • oops.jpg
    oops.jpg
    45,7 KB · Aufrufe: 17
Zuletzt bearbeitet:
Hi,

habe eben mal die Abfrage gändert. Function num_rows und affected_rows raus und dafür folgendes rein:
PHP:
function query_result($ressource) {  

$result = mysql_fetch_array($ressource, MYSQL_ASSOC); 
echo "Result - Function: query_result: ".$result."<br>\n"; 
return $result;  
}


Vieles ist NULL, ... ist ja auch klar bei "private", aber "result" habe ich auf "public" gesetzt und es ist auch NULL. Wobei der Port auch auf "private" ist und der angezeigt wird. Ich mein, ... ist ja nichts geheimes... Standard-Port eben, aber trotzdem.

Code:
object(DB_com_)#1 (10) {
["host:private"]=> NULL 
["username:private"]=> NULL 
["password:private"]=> NULL 
["database:private"]=> NULL 
["port:private"]=> string(4) "3306" 
["fehler:private"]=> bool(false) 
["fehlertext"]=> NULL 
["query:private"]=> string(275) "SELECT PagePath, ImagePath, Hersteller, Modellbezeichnung, Hauptkategorie, Subkategorie, Kategorie01, Kategorie02, Aktiv, Finanzierung, Neu, Produkt_Beschreibung FROM produkte WHERE Hersteller = 'A' AND Hauptkategorie = 'B' AND Aktiv = 1"
["ressource"]=> NULL
["result"]=> NULL }

Die Daten sehen so aus, wie sie aussehen sollen, nur die Variable "result" macht mir sorgen.

Obwohl meine Augen, laut meiner Ärztin "perfekt sind", kann ich leider den Kasten in deinem Anhnag nicht lesen. Der rest ist kein Problem. :-)

Ich habe mir zwei Bucher gekauft und bin auch am lesen, nur ich komm eben so selten dazu... =)

Grüße Daniel
 
wie füllst du denn die zugangsdaten zur db? trag doch mal was per hand ein, direkt bei den properties der klasse.. dass die zugangsdaten null sind, macht mir schon mal als erstes sorgen ;)
 
wie füllst du denn die zugangsdaten zur db? trag doch mal was per hand ein, direkt bei den properties der klasse.. dass die zugangsdaten null sind, macht mir schon mal als erstes sorgen ;)
aso, mit dem diagramm, ja mir is das programm beim speichern abgestürzt, deshalb konnte ich nur noch nen screenshot machen, bevor das fenster sich schließt.
gruß softi
aso: solange in resouce null steht, gibt es keine verbindung zur datenbank!
und daaaa

if(!mysql_connect ($this->host, $this->username, $this->password)) {

kommt

if(!$this->ressource = mysql_connect ($this->host, $this->username, $this->password)) {

hin, sonst hast du die verbindung zur db nirgens gespeichert

und die zeile:

$ressource = mysql_query($query);

sieht besser aus, wenn du

$ressource = mysql_query($query, $this->ressource);

draus machst!

ach man warte... nächster post!
 
Zuletzt bearbeitet:
Zurück