Klasse in Klasse?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Klasse in Klasse?

    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)


    PHP-Code:
    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";
            }
        }
        

    Zuletzt geändert von nobody2; 04.02.2007, 13:26.

  • #2
    Re: Klasse in Klasse?

    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?

    Kommentar


    • #3
      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
      PHP-Code:
      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.
      Zuletzt geändert von nobody2; 04.02.2007, 13:28.

      Kommentar


      • #4
        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.

        Kommentar


        • #5
          Hallo!
          Danke schonmal.
          Ich habe die Klassen jetzt so aufgebaut:

          security Klasse:
          PHP-Code:
          class sec
          {
              public function 
          __construct()
              {
              require_once(
          'mysql.php');
              
          $mysql mysql::singleton();
              }
              public function 
          header($header_values)
              {
                   ...
                   }
          ...

          mysql Klasse:

          PHP-Code:
          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:
          PHP-Code:
          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?
          Zuletzt geändert von nobody2; 04.02.2007, 13:31.

          Kommentar


          • #6
            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.

            Kommentar

            Lädt...
            X