php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Klasse in Klasse?


 
nobody2
04-02-2007, 10:43 
 
Hallo!
Ich bin gerade dabei einen Security Klasse zu programmieren. Ich habe bereits eine mysql- Klasse, welche für die "Mysql-Sachen" zuständig ist. Wenn nun ein Sicherheisrisiko festgestellt wird, so soll dieses in meiner Datenbank festgehalten werden. Momentan stehe ich vor dem Problem, dass ich in meiner security Klasse objekt der mysql Klasse erstellen muss. Gibt es da eine bessere Lösung, oder muss ich zwangsläufig ein Objekt in meiner security.class erstellen? (natürlich könnte ich die security class mittels class security extends mysql festlegen, dies möchte ich jedoch nicht, da die Klassen eine eigenständige Einheit bilden sollten)



class sec
{
function heaer($header_values)
{
/*Checks if the header values includes a "Carriage Return" or a "Line Feed"*/
if(...)
{
require_once('mysql.php');
$mysql = new mysql();
$mysql->con();

echo "hack gefunden";
}
else
{
echo "kein hack gefunden";
}
}

}

 
onemorenerd
04-02-2007, 11:16 
 
Original geschrieben von nobody2
Momentan stehe ich vor dem Problem, dass ich in meiner security Klasse objekt der mysql Klasse erstellen muss.Was stört dich daran? Wieso ist das ein Problem?

 
nobody2
04-02-2007, 11:57 
 
Naja, es werden jedesmal 2 Instanzen der mysql Klasse erzeugt. Eine in der Klasse, auf die ich von außerhalb nicht zugreife, und eine, welche für die sql-Befehle auf den einzelnen Seiten zuständig ist.
z.B

require_once('sec.php');
$sec = new sec();
require_once('mysql.php');
$mysql = new mysql();
$data = $mysq->query("SELECT * FROM test WHERE id=14");
echo $data["name"];


Die mysql Klasse hat einen Konstruktor, der eine Verbindung zum Mysql Server herstellt, und einen Destruktor der die Verbindung wieder schließt. In der security Klasse wird (jetzt) im Konstruktor eine Instanz der mysql Klasse erstellt (also auch eine Verbindung zum MYSQL Server). Ich habe also 2 Verbindungen zum Mysql Server, obwohl eine ausreichen würde.

 
3DMax
04-02-2007, 12:06 
 
Original geschrieben von nobody2
Naja, es werden jedesmal 2 Instanzen der mysql Klasse erzeugt.
daher bietet sich für die mysql-klasse das singleton-pattern an, d.h. applikationsweit wird die selbe instanz benutzt.

 
nobody2
04-02-2007, 13:20 
 
Hallo!
Danke schonmal.
Ich habe die Klassen jetzt so aufgebaut:

security Klasse:

class sec
{
public function __construct()
{
require_once('mysql.php');
$mysql = mysql::singleton();
}
public function header($header_values)
{
...
}
...
}


mysql Klasse:


class mysql
{
// Speichert die Instanz der Klasse
private static $instance;
/**
* Contains the DB-handler
* @var mixed
*/
private $ser;
const DB = 'db1';
const DB_SUFFIX ='_sprache';
/**
* Sets the connection to the MYSQL Server
*/
private function __construct()
{
$this->ser = @mysql_connect('localhost','root','pw')
or die('Es konnte keine Verbindung zur Datenbank hergestellt werden!');
}


// Die Singleton Funktion
public static function singleton()
{
if (!isset(self::$instance))
{
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
...
public function __clone()
{
trigger_error('Klonen ist nicht erlaubt.', E_USER_ERROR);
}
/**
* Shuts down the connection to the MYSQL Server
*
*/
public function __destruct()
{
@mysql_close($this->ser);
}


Bei meinen Seiten rufe ich die Klassen wiefolgt auf:

require_once('security.php');
$sec = new sec();
$mysql = mysql::singleton();
$data = $mysql->q("SELECT * FROM test WHERE id=13");
echo $data["name"];


Ist das so korrekt, wie ich das gemacht habe?
Ich kann in den Seiten keine Instanzen der mysql Klasse mehr machen (wie erwart). Von der security Klasse kann ich allerdings noch mehrere Instanzen manchen. Muss ich die security Klasse jetzt auch als Singleton-Klasse definieren, oder ist dies egal?

 
3DMax
04-02-2007, 13:59 
 
Original geschrieben von nobody2
Ist das so korrekt, wie ich das gemacht habe?
ja, sieht gut aus.
eventuell könntest du noch dem konstruktor der security-klasse gleich das mysql-objekt mitgeben, dann brauchst du das nicht innerhalb der klasse erzeugen. (hätte dein ursprungsproblem übrigens auch gelöst, mit singleton ist aber sauberer)

Original geschrieben von nobody2
Von der security Klasse kann ich allerdings noch mehrere Instanzen manchen. Muss ich die security Klasse jetzt auch als Singleton-Klasse definieren, oder ist dies egal?
weiß nicht genau, worauf die frage abzielt.
aber selbst, wenn du mehrere security-objekte erzeugst, benutzen diese alle die selbe mysql-referenz. die security-klasse würde ich also so lassen.


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:56 Uhr.