*Markus: Variablen per include in Klasse importieren?

Hallo,

ich habe wohl noch ein Verständnisproblem bezüglich dem Importieren von Variablen in eine Klasse.

Hier habe ich eine config.inc.php:

  
<?php  
// PHP-Optionen  
 error_reporting(E_ALL);  
  
// Variablen....  
 $fotoVerzeichnis = 'fotosXL';  
 $vorschauFotoVerzeichnis = 'fotosMINI';  
 $verkleinerungsFaktor = 0.2;    //Die Vorschaubilder werden hier zu 20% verkleinert  
?>

Hier will ich diese Variablen verwenden.

  
<?php  
  
   include "config.inc.php";  
  
   class VorschaubildGenerator   {  
  
  
        public function minimizePicture($bigPicFilename, $year)   {  
         $sourceImage = '';  
         //Bild auslesen, Grafiktyp: 1=GIF, 2=JPG, 3=PNG, 4=SWF  
            list($width, $height, $grafiktyp) = getimagesize($bigPicFilename);  
            $new_width = $width * $this->verkleinerungsFaktor;  
   $new_height = $height * $this->verkleinerungsFaktor;  
.  
.  
.  
  

So kann ich die Variablen nicht verwenden. Ich bekomme folgenden Fehler:

Notice: Undefined property: VorschaubildGenerator::$verkleinerungsFaktor in /srv/http/harri_pithax_net/VorschaubildGenerator.php on line 20

Natürlich gibt es Probleme, da ich einmal eine Klasse habe, und im Config-File nur "nackte" Variablen, aber wie kann ich die Variablen verwenden? PHP-Eclipse sagt mir, dass $verkleinerungsFaktor usw noch nicht initialisiert ist. Ich habe auch andere Konstrukte versucht wie VorschaubildGenerator::$vorschauFotoVerzeichnis, oder zB nur $vorschauFotoVerzeichnis, aber ich komme auf keinen grünen Zweig. Wahrscheinlich würde es mit einem Singleton funktionieren, aber ich würde es gerne so versuchen. Wie sieht die Lösung dazu aus?

Danke im Voraus,

Markus

--
  1. echo $begrüßung;

    Notice: Undefined property: VorschaubildGenerator::$verkleinerungsFaktor in /srv/http/harri_pithax_net/VorschaubildGenerator.php on line 20

    Variablen aus dem globalen Scope sind keine Properties eines einzelnen Objekts

    Natürlich gibt es Probleme, da ich einmal eine Klasse habe, und im Config-File nur "nackte" Variablen, aber wie kann ich die Variablen verwenden? PHP-Eclipse sagt mir, dass $verkleinerungsFaktor usw noch nicht initialisiert ist.

    Innerhalb einer Funktion, und da zählen auch Methoden dazu, sind keine globalen Variablen vorhanden, wenn man sie dort nicht bekannt gibt. Doch das ist kein guter Stil.

    Wie sieht die Lösung dazu aus?

    Konstanten oder Klassenkonstanten. Oder eine Config-Klasse, die sich die Werte aus einer Konfigurationsdatei holt und über geeignete Wege bereithält. Schau dir das Zend Framwork an, da gibt es Zend_Config.

    echo "$verabschiedung $name";

    1. Hi!

      Als Q&D hätte man dem OP auch anbieten können, er möge ein 'require_once' in der Klasse nutzen - schöner wird es dadurch nicht.

      off:PP

      --
      "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
  2. Hi!

    ich habe wohl noch ein Verständnisproblem bezüglich dem Importieren von Variablen in eine Klasse.

    Ja!

    Du bindest Deine Datei _vor_ der Klassendefinition ein - diese sind nun im globalen Scope verfügbar - aber nicht innerhalb der Klasse.

    Wenn Du _globale_ Variablen in Funktionen oder Methoden verwenden willst - nutze: global.

    off:PP

    P.S: oft ist die Verwendung globaler Variablen _keine_ gute Idee

    --
    "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
  3. Hallöchen,

    Versuch mal, 1.) in der Klassendefinition die Variable zu initialisieren:

    <?php

    include "config.inc.php";

    class VorschaubildGenerator   {

    var $verkleinerungsFaktor=0; // Initialisierung

    public function minimizePicture($bigPicFilename, $year)   {
             $sourceImage = '';
             //Bild auslesen, Grafiktyp: 1=GIF, 2=JPG, 3=PNG, 4=SWF
                list($width, $height, $grafiktyp) = getimagesize($bigPicFilename);
                $new_width = $width * $this->verkleinerungsFaktor;
       $new_height = $height * $this->verkleinerungsFaktor;
    .
    .
    .

      
      
    Wenn du dann 2.) den Konstuktor der Klasse aufrufst, schreibst du als nächste Zeile eine Wertzuweisung:  
      
    ~~~php
      
    $objekt = new VorschaubildGenerator(...);  
    $objekt->verkleinerungsFaktor = $verkleinerungsFaktor; // Wertzuweisung an die Klassen-Variable  
    
    

    Damit dürfte dann in der Folge beim Aufruf der Funktion der benötigte Wert zur Verfügung stehen.

    MfG
    vaudi

    1. echo $begrüßung;

      Wenn du dann 2.) den Konstuktor der Klasse aufrufst, schreibst du als nächste Zeile eine Wertzuweisung:
      $objekt->verkleinerungsFaktor = $verkleinerungsFaktor; // Wertzuweisung an die Klassen-Variable
      Damit dürfte dann in der Folge beim Aufruf der Funktion der benötigte Wert zur Verfügung stehen.

      Und woher nimmst du $verkleinerungsFaktor?

      echo "$verabschiedung $name";

      1. Hallöchen,

        Und woher nimmst du $verkleinerungsFaktor?

        OK, ich hätte dazu schreiben können, dass die config.php (die $verkleinerungsFaktor enthält) in dem Script, in dem der Konstruktor aufgerufen wird wird, vor dem Aufruf includet werden muss. Das hatte ich stillschweigend vorausgesetzt.

        MfG
        vaudi

        1. echo $begrüßung;

          Und woher nimmst du $verkleinerungsFaktor?

          OK, ich hätte dazu schreiben können, dass die config.php (die $verkleinerungsFaktor enthält) in dem Script, in dem der Konstruktor aufgerufen wird wird, vor dem Aufruf includet werden muss. Das hatte ich stillschweigend vorausgesetzt.

          Wenn ich beim Verstehen deiner Beschreibung keinen Fehler gemacht habe, dann entspricht das genau dem vom OP beschriebenen Fall "PHP-Eclipse sagt mir, dass $verkleinerungsFaktor usw noch nicht initialisiert ist." Auch ein Konstruktor ist nur eine Funktion, und in einer solchen stehen keine global definierten Variablen zur Verfügung, wenn man sie nicht mit global bekannt gibt.

          echo "$verabschiedung $name";

          1. Hallöchen,

            Dann hab wohl ich das Problem falsch interpretiert. Meine Lösung setzt so einen Scriptaufbau voraus:

            <?php  
              // Beginn Script  
              
              include(config.php);  
              // jetzt ist im Script die Variable $verkleinerungsFaktor bekannt  
              
              include(Datei mit Klassendefinition);  
              // alternativ die Klassendefinition direkt hier  
              
              $objekt = new VorschaubildGenerator(...);  
              // jetzt hab ich ein Objekt der Klasse, wo ich $verkleinerungsFaktor als this->verkleinerungsFaktor zur Verfügung hätte, aber zu diesem Zeitpunkt noch ohne den Wert von $verkleinerungsFaktor aus der config.php  
              
              $objekt->verkleinerungsFaktor = $verkleinerungsFaktor;  
              // Wertzuweisung des config.php - Wertes an die Klassenvariable  
              
              $objekt->minimizePicture($bigPicFilename, $year);  
              // Aufruf der Klassenfunktion  
              
              // weiterer Code  
            ?>
            

            Die gepostete Fehlermeldung "Notice: Undefined property: VorschaubildGenerator::$verkleinerungsFaktor in /srv/http/harri_pithax_net/VorschaubildGenerator.php on line 20" weist auf eine nicht definierte Variable der Klasseninstanz hin. Mit
              var $verkleinerungsFaktor=0;
            innerhalb der Klassendefinition wird die Variable definiert und mit "0" initialisiert - damit müsste die Fehlermeldung wegfallen.

            MfG
            vaudi

            1. Hallöchen,

              ... sorry, war noch nicht ganz fertig:

              Da die Klassenfunktion ja erst nach Erzeugen einer Instanz der Klasse aufgerufen werden kann, ist die Zuweisung

              $objekt->verkleinerungsFaktor = $verkleinerungsFaktor;

              unmittelbar nach Erzeugen der benötigten Instanz die Stelle, an der der Wert der Variablen 'in die Klasse importiert' wird.

              Und das ist doch das, worum es hier geht, oder?

              Jedenfalls funktioniert das auf einer meiner Websites, wo ich erst Werte ermitteln muss, die von der Klasseninstanz verarbeitet werden sollen, dann erst die Instanz erzeuge und dieser auf oben beschriebene Weise die Werte übergebe.

              MfG
              vaudi

            2. echo $begrüßung;

              Dann hab wohl ich das Problem falsch interpretiert. Meine Lösung setzt so einen Scriptaufbau voraus:

              $objekt = new VorschaubildGenerator(...);
                $objekt->verkleinerungsFaktor = $verkleinerungsFaktor;

              Ja, so geht es, aber elegant ist was anderes. Der Konstruktor ist vorgesehen, um ein Objekt zu initialiseren. Dem kann man auch Parameter mit auf den Weg geben, deren Werte er dann in Objekt-Variablen ablegen kann.

              Der bisherige Weg mit den Variablen, die man in PHP-Syntax zu notieren hat ist nicht gerade der einfachste für Anwender ohne PHP-Kenntnisse. Für einfache Werte mag es noch gehen, aber die Syntax eines Arrays fehlerfrei schreiben zu müssen, das muss man dem Anwender nicht zumuten. Einfacher ist da die ini-File-Syntax, bei der nur Name=Wert ohne irgendwelche zwingend notwendigen Begrenzungszeichen zu notieren ist. (Array-Werte lässt man sich als Name=Wert1,Wert2,Wert3 übergeben und explodiert die sich selbst am Komma.) Mit parse_ini_file() bekommt man die Datei gleich aufbereitet gelesen.

              echo "$verabschiedung $name";

              1. Hallöchen,

                Ja, so geht es, aber elegant ist was anderes.

                Wenn die elegante Lösung die einfachere ist, mach ich mit. Wenn sie komplizierter und aufwändiger ist, ziehe ich "Ja, so geht es" vor. Im Endeffekt ist entscheidend, dass die Zielstellung umgesetzt wird.

                Den Auftraggeber bzw. den Kunden, für den ich programmiere, wird es primär nicht interessieren, wie elegant ich programmiert hab, sondern dass er schnell eine funktionierende Lösung bekommt.

                MfG
                vaudi

                1. Moin!

                  Ja, so geht es, aber elegant ist was anderes.

                  Wenn die elegante Lösung die einfachere ist, mach ich mit. Wenn sie komplizierter und aufwändiger ist, ziehe ich "Ja, so geht es" vor. Im Endeffekt ist entscheidend, dass die Zielstellung umgesetzt wird.

                  Den Auftraggeber bzw. den Kunden, für den ich programmiere, wird es primär nicht interessieren, wie elegant ich programmiert hab, sondern dass er schnell eine funktionierende Lösung bekommt.

                  Oftmals haben "elegante Lösungen" im Vergleich zu "schnellen Lösungen" den Vorteil, langfristig betrachtet deutlich weniger Zeit zu verschwenden, und deshalb doch wieder die schnelleren Lösungen zu sein. Das ist bedeutungslos, wenn garantiert keine Langfristigkeit gefordert ist. Und es sollte auch keine Ausrede für "super-elegante Lösungen" sein, die niemals den Zeitvorteil uneleganterer Lösungen wieder aufholen können.

                  :-)

                  - Sven Rautenberg

                  --
                  "Love your nation - respect the others."