Variablen per include in Klasse importieren?
*Markus
- php
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
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";
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
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
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
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";
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
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";
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
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
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";
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
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