Draganis: Klasse(n) Problem

H@i

ich würd gern eine Benutzernamenvariable, die in einer PHP-Klasse benutzt wird, ändern, wenn das Programm auf einem anderen Server liegt.

class irgendwas{

if($SERVER_NAME == "xxx"){
var $username = "x";
}
else{
var $username = "y";
}
}

geht nicht

und
if($SERVER_NAME == "xxx"){
var $username = "x";
}
else{
var $username = "y";
}
class irgendwas{
global $username;
}
geht auch nicht...

Es sollte aber auch nicht beim Klassenstart übergeben werden müssen, da ich sonst verdammt viele Einträge abändern müsste...

also auch nicht
class irgendwas($username){

}

was bleibt denn da noch übrig?
ich weiss mir keinen rat

hoffentlich kann mir einer von euch helfen

Bye

Draganis

  1. Grüssi!

    class irgendwas{
      if($SERVER_NAME == "xxx"){
         var $username = "x";
      }
      else{
         var $username = "y";
      }
    }

    Es sollte aber auch nicht beim Klassenstart übergeben werden müssen, da ich sonst verdammt viele Einträge abändern müsste...

    class irgendwas($username){
    }

    Kennst du den Unterschied zwischen Klassen und Funktionen überhaupt? Deinem posting nach zu urteilen muss ich dir unterstellen dass du ihn nicht kennst.

    Mach dich mal schlau auf http://www.php.net/manual/de/language.oop.php und über Basiskonzepte der Objektorientierten Programmierung http://www.google.com/search?hl=en&imgsafe=off&safe=off&q=Klassen+objektorientierte+Programmierung&spell=1

    In Klassen legst du Variablen ab und definierst Methoden, die auf diesen Variablen Operieren. Über diese Methoden (Funktionen) kannst du Variablen abfragen, ändern, anlegen.

    lg bernhard

    PS: Eine Klasse wird nicht "gestartet" ist ja keine Funktion! Bei näherer Betrachtung gibt es eine Vergleichbare Eigenschaft von Klassen, die man als "starten" interpretieren könnte, aber  du dürftest wohl auch nicht wissen was ein Konstruktor ist, oder täusch ich mich da?

    1. Ach ja, zu deinem Problem ;-)

      Definiere eine eiegne Methode in deiner Klasse namens 'checkServer()' beispielsweise, in diese Methode packst du die if-Anweisung. Und direkt nach dem Erzeugen des Objekts im Hauptprogramm rufst du diese Methode auf:

      [[ Es sei dazugesagt, dass ich bezügl Klassensyntax in PHP nicht allwissend bin *g* ]]

      $a = new <Klassenname>; // Objekt $a der Klasse <Klassenname> erzeugen
      $a->checkServer(); // Deine Methode für das Objekt $a aufrufen!

      class <Klassenname> {
        // Instanzvariablen:

      var $username;
        [[ weitere Variablendeklarationen ]]

      // Methoden:
        function checkServer () {
          if($SERVER_NAME == "xyz") {...} else { ... }
        }
        [[ weitere Methoden ]]
      }

      Falls es noch Probleme geben sollte, poste mal deine Klasse. Aber nur Variablen und Methodendeklarationen!

      Gute Nacht,
      Bernhard

      1. $a = new <Klassenname>; // Objekt $a der Klasse <Klassenname> erzeugen
        $a->checkServer(); // Deine Methode für das Objekt $a aufrufen!

        class <Klassenname> {
          // Instanzvariablen:

        var $username;
          [[ weitere Variablendeklarationen ]]

        // Methoden:
          function checkServer () {
            if($SERVER_NAME == "xyz") {...} else { ... }
          }
          [[ weitere Methoden ]]
        }

        warum so kompliziert, du hast auf jede variable der klasse zugriff, welche am beginn der klasse initalisiert wurde.

        um deinen beispiel zu folgen wäre es dann einfach:
        $a->username="neuerwert";

        btw. in deinem anderen posting sagtest du man startet keine klasse, würde ich so nicht sagen, richtig sagt man man initalisiert sie mit "new" ohne ein fremdwort zu gebrauchen würd ich das starten nennen :)

        Ludwig

        1. Grüssi

          warum so kompliziert, du hast auf jede variable der klasse zugriff, welche am beginn der klasse initalisiert wurde.

          Genau das spricht aber gegen die Definition einer Klasse. Der Sinn einer Klasse besteht ja darin, die Daten (Instanzvariablen) zu kapseln, in einen zugriffsgeschützten Bereich, und ihre Manipulation nur über die Methoden ermöglicht! So kann ein wildes Datenmanipulieren ausgeschlossen werden.

          Die Variablen sollten also immer private deklariert werden, so dass man von ausserhalb der Klasse keinen direkten Zugriff hat, sondern nur über die Methoden mit diesen Daten "kommuniziert". Global zugängliche Variablen untergraben das Klassen-Konzept (OOP), und somit könnte man auch gleich komplett auf die eine Klassenkonstruktion verzichten!

          um deinen beispiel zu folgen wäre es dann einfach:
          $a->username="neuerwert";

          ja, weil ich (ehrlichgesagt) nicht weiss wie man in PHP private-Variablen deklariert ;-) In C++ ist jede Variable vonhausaus private, ausser man schreibt sie explizit in den public:-Block!

          class <name> {

          private:
              char* username;
              int irgendwas;
              // weitere Variablen

          public:
              void checkServer();
              // weitere Methoden
          }

          btw. in deinem anderen posting sagtest du man startet keine klasse, würde ich so nicht sagen, richtig sagt man man initalisiert sie mit "new" ohne ein fremdwort zu gebrauchen würd ich das starten nennen :)

          Ich sagte ja auch, dass es etwas "vergleichbares" gibt. Aber es unterscheidet sich in der Funktionsweise doch erheblich mit dem was sich Draganis unter starten vorstellte ;-)

          Bei einer Instanziierung eines neuen Objekts (mit new) wird normalerweise ein Konstruktor aufgerufen, eine Funktion die man überladen kann, indem man eine Methode definiert, die den gleichen Namen wie die klasse hat. Dort kannst du z.b. sagen dass $username gleich mit einem default-wert belegt werden sollte, zb "gast". Mit dem von der Programmiersprache zur Verfügung gestellten Default-Konstruktor wird die Variable nur angelegt. Durch überladen dieser Funktion kasst du deine Klasse schlichtweg benutzerdefinierter initialisieren.

          Aber ich schätze mal das muss ich dir nicht sagen ;-)

          lg bernhard