Antworten auf deine Fragen:
Neues Thema erstellen

Klassenvererbung oder whatever

Christian

verpeilt & verschallert

Ich steh gerade wie so oft auf dem Schlauch.
Wenn ich ehrlich bin hab ich von dem was ich gerade mache, nicht so wirklich die Peilung, deswegen bräuchte ich ein bisschen Kritik/Hilfe seitens Euch.
Hier die aktuelle Klasse:
PHP:
<?

class sql2 {
	protected $ServerIndex			= array();
	protected $ConnectionStatus	= array();
	
	private $MainServer	= null;
	private $MainDB		= null;
	private $RegisteredExceptions	= array();
	
	public $bla;
	
	public function __construct(  ){
		$args	= func_get_args();
		if(sizeof($args)>0){
			$succesfullConnect = true;
			foreach($args as $arg){
				$saveServerIndex 		= $this->registerSQLServer( $arg );
				#$currentConnectState	= $this->checkState( $saveServerIndex );
				$currentConnectState	= true;
				if( $currentConnectState === false ){
					$succesfullConnect = false;
				}
			}
			return $succesfullConnect;
		}
		return false;
	}
	
	/**
	 * Register Server From array, seen as: array('host'=>'www.myDomain.com', 'user'=>'username', 'pass'=>'password', 'database'=>'myDatabase')
	 *
	 * @param array $argArray
	 * @return string Identifier
	 */
	public function registerSQLServer( $argArray ){
		if( 	 isset($argArray['host'])
			 && isset($argArray['user'])
			 && isset($argArray['pass'])
			 && isset($argArray['database'])
			)
		{
				
			//Jaja ich weiß md5 und der Zufall; nicht schön, aber selten!
			$registeredSQLServerIndex	= ( isset($argArray['Identifier'] )? $argArray['Identifier'] : md5($argArray['host'].$argArray['database'].microtime()) );
			
			/**
			 * Sollte eine Verbind zum Zeitpunkt nicht möglich sein, bricht das Script noch nicht ab,
			 * sondern speichert die Fehlermeldung zwischen, solange bis versucht wird eine Query auf
			 * den angegebenen Resourcenlink auszuführen (evtl noch ein 2. Versuch eine Verbindung
			 * herzustellen)
			 */
			$thisLink	= mysql_connect( $argArray['host'], $argArray['user'], $argArray['pass'] ) or self::RegisterException(SQL2_Exception::__toString('20090107-#1', $argArray));
			if($thisLink){
				$this->ConnectionStatus[$registeredSQLServerIndex]	= true;
			}else{
				$this->ConnectionStatus[$registeredSQLServerIndex]	= false;
			}
			$this->ServerIndex[$registeredSQLServerIndex]	= array('LINK'=>$thisLink,'DATABASE'=>$argArray['database']);
			
			return $registeredSQLServerIndex;
		}else{
			return 'asd';
		}
	}
	
	public static function RegisterException( $message ){
		echo $message;
	}
	
	public function __destruct(){
		if(sizeof($this->ServerIndex)>0){
			foreach($this->ServerIndex as $id => $data){
				@mysql_close($data['LINK']);
				unset($this->ServerIndex[$id]);
			}
		}
	}
	public function __get( $str ){
		if(isset($this->ServerIndex[$str])){
			$this->MainServer	= $this->ServerIndex[$str]['LINK'];
			$this->MainDB		= $this->ServerIndex[$str]['DATABASE'];
			return $this;
		}
	}
	
	public function query( $query ){
		echo $this->MainServer.PHP_EOL;
		$result	= mysql_db_query( $this->MainDb, $query, $this->MainServer ) or die(mysql_error());
		if(mysql_num_rows($result)>0){
			while(false!==($row = mysql_fetch_assoc($result))){
				$this->bla[]	= $row;
			}
		}
	}
}
define('S2_CAOTEST', 'S2_CAOTEST');

$sql = new sql2( array('host'=>'132.116.0.46','user'=>'root', 'pass'=>'', 'database'=>'caotest', 'Identifier'=>S2_CAOTEST) );

print_r( $sql->S2_CAOTEST->query('SELECT * FROM artikel LIMIT 2') );

Ich weiß nicht ob es sich hierbei direkt um Vererbung handelt, aber hier das Konzept im Groben:
Ich möchte möglichst einfach mehrere Datenbankverbindungen aufrecht erhalten und auf sie zugreifen.
Die einzelnen Verbindungen werden am Anfang über __construct angegeben und in sql2::ServerIndex als Resourcenlink hinterlegt. Für jede Verbindung kann man einen Identifier hinterlegen, sodass man folgende Vorgehensweise hat:

define( ... Identifier ... );
$sql = new sql2( ...daten.. );

Soviel zur Initialisierung. Jetzt möchte ich über jenen Identifier direkt als Objekt eine Query ausführen lassen, sprich:

$sql->Identifier->query('query');

Diese "Vererbung" (Ist das überhaupt eigentlich ist es doch eher eine referenzierte Übergabe oder? ) erfolgt in der Funktion "__get()" über "return $this;"
Soweit so gut, referenzierte Übergabe erfolgt, als Hauptdatenbank-Resourcenlink wird es auch korrekt dargestellt, jedoch bei der Funktion mysql_db_query hakt es dann.
Die Resource ist literalisch noch vorhanden, aber bei der Ausführung des Querys kommt es zum Fehler, dass der Server nicht erreicht wird.
Hat jemand einen Plan, oder ist das ganze Vorhaben zum Scheitern verurteilt?

PS: Sicherlich könnte ich auch mysqli benutzen, möchte es aber aus Verständnisgründen lieber selber versuchen.

Grüße

PS: Das oben genannte Beispiel erzeugt folgende Ausgabe:
Code:
X-Powered-By: PHP/5.2.0
Content-type: text/html

Resource id #2
No Database Selected
Das hat allerdings nichts mit dem Datenbanknamen zu tun, da bei der Auskommentierung des Resourcenlinks der selber Fehler immer noch auftritt.
 
Zuletzt bearbeitet:

Eskayp

Something

AW: Klassenvererbung oder whatever

Hallo Christian,

ich bin mir nicht ganz sicher, ob ich Dich verstanden habe, und ich habe Deinen Code auch nicht ganz nachvollzogen. Da ich aber nicht ganz sicher bin, ob Du den Sinn von Klassen verstanden hast, erlaube ich mir folgende kurze Erklärung:

Eine Klasse ist sozusagen ein Rohling eines Objekts. Z.B. eines Autos. Ein Auto hat eine Farbe, einen Markennamen, eine Motorleistung. Diese Werte sind die Eigenschaften des Autos. Außerdem kann man das Auto starten, man kann Gas geben, lenken und bremsen. Das sind Methoden des Autos.

Demnach könnte es eine Klasse geben
PHP:
  class auto() {
    public $farbe;
    public $marke;
    public $leistung;

    public function starten() {
      // tu was
    }

    public function gas_geben($a) {
      // tu was
    }

    public function bremsen($a) {
      // tu was
    }

    public function lenken($winkel) {
      // tu was
    }
  }

Hier wurde nur definiert, dass es Autos gibt und was man mit Ihnen machen kann. Aber es gibt noch keine Autos. Also erstellen wir einfach eine Instanz des Autos. Du hast eins, ich hab eins:

PHP:
  $meinAuto = new auto();
  $deinAuto = new auto();

Diesen Autos können jetzt verschiedene Eigenschaften zugewiesen werden.

PHP:
  $meinAuto->farbe = blau;
  $deinAuto->farbe = rot;

Das ist natürich nur ein ganz vereinfachtes Beispiel, aber ich denke, dass es sich leicht auf Deinen Fall übertragen lässt. Du erschaffst eine Klasse zum Handling von Datenbankverbindungen und erstellst für jede Verbindung eine Instanz. Anschließend brauchst Du nur noch über $instanz1->query oder $instanz2->query die verschiedenen Datenbanken ansteuern.

Zum Thema Vererbung: gibt es eine Masterklasse und eine Unterklasse dazu, so dass die Unterklasse alle Eigenschaften und Methoden der Masterklasse übernimmt und noch einige dazu bekommt, spricht man von Vererbung. Z.B. Masterklasse "Gefäß" und Unterklasse "Tasse". Für Deinen Fall brauchst Du keine Vererbung.

Ich bin mir übrigens nicht sicher, ob sowas überhaupt funktionieren sollte:
PHP:
define('VARIABLE', 'VARIABLE');
...
$instance->VARIABLE->method();
 

Christian

verpeilt & verschallert

AW: Klassenvererbung oder whatever

Also das Grundprinzip von Klassen kenne ich schon.
Jedoch bin ich gerade ein wenig am rumexperimentieren, was ich so alles für Möglichkeiten habe.
und das $instance->VARIABLE->method() funktioniert generell nicht, das ist klar. Benutzt man jedoch die __get() Überladung, wird VARIABLE im Klassenkontext als Funktionsparameter an __get() übergeben und gibt am Ende der Funktion $this (also die Klasse) zurück, damit ich ->method() [in diesem Fall: ->query()] darauf anwenden kann.
PHP:
    public function __get( $str ){
        if(isset($this->ServerIndex[$str])){
            $this->MainServer    = $this->ServerIndex[$str]['LINK'];
            $this->MainDB        = $this->ServerIndex[$str]['DATABASE'];
            return $this;
        }
    }
Das eigentliche Problem besteht halt darin, dass in VARIABLE->query() die Datenbankverbindung nicht mehr steht.


Edit: Ich bin so ein Depp. Er kriegt kein Ergebnis, weil ich als Tabellenreferenz $this->MainDb angegeben hab. Richtigerweise wäre es $this->MainDB -.-
Aber trotzdem danke für Deine Mühe :)
 
Zuletzt bearbeitet:

Eskayp

Something

AW: Klassenvererbung oder whatever

Hallo,

ich finde nur die Lösung mit $instance->VARIABLE->method(); irgendwie unsauber. Ich versteh auch nicht den "Umstand" mit dem ServerIndex.

Mein Aufbau wäre letztendlich folgender gewesen:
PHP:
  class dbConnection {
    function __construction() {
      $args = func_get_args();
      ...
      $this->connect(...);
    }
    function connect($host, $user, $pwd, $dbname) {
      ...
    }
    function query($query) {
      ...
    }
  }

  $db1 = new dbConnection('localhost', 'dbuser', 'dbpwd', 'dbone');
  $db2 = new dbConnection('otherhost', 'dbuser', 'dbpwd', 'dbtwo');

  $result1 = $db1->query('SELECT * FROM tblOne');

  $result2 = $db2->query('SELECT * FROM tblTwo');

Ist doch viel einfacher, oder?
 

Christian

verpeilt & verschallert

AW: Klassenvererbung oder whatever

Wie gesagt, soll nicht produktionsreif werden, ich möchte nur ausprobieren, was es alles an verschiedenen Möglichkeiten des OOP in PHP5 gibt.
 

Chickenshooter

Alter Mann

AW: Klassenvererbung oder whatever

Moin,

Du möchtest also mit dem OOP "Kram" von PHP 5 ein bisschen
rumspielen???
Denn sonst würdest Du ja nicht die _get() Method überschreiben.

Wenn Du also mit Properties arbeiten willst, ist das ein richtier Weg,
aber ein richtiger von Vielen.

Mir persönlich gefällt diese Implementierung von Properties allerdings
nicht.

ein anderer Lösungsansatz ist ( um auch in gängigen IDE's Codevervollständigung zu haben )

PHP:
private $_property_01;
public function Property_01($value = null)
{
 if( is_null($value) )
   return $this->_property_01;
 
 /*
  hier kannst und solltest Du noch die Daten also $value noch auf 
  Richtigkeit prüfen.
  Dieses Vorgehen mit Propertys(Eigenschaften) von Klassen nennt
  man in der OOP Welt Kapselung
*/
 $this->_property_01 = $value;
   return $this->_property_01;
}
im Aufruf der Klassenvariable siehts dann so aus

PHP:
$cl = new Klasse();

"die Set Method"
$cl->Property_01("Wert setzen");

die "Get Method"
$strWert = $cl->Property_01();
Ich hoffe ich konnte weiter helfen

MfG Chickenshooter
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.614
Beiträge
1.538.351
Mitglieder
67.525
Neuestes Mitglied
mgtaucher
Oben