Zur Navigation

const eine Variable zuweisen (PHP)

1 AndiN

Guten Morgen,

ich bin gerade dabei ein fremdes Script zu ändern. Dort sind zwei Konstanten definiert die jeweils einen Dateinamen beinhalten. Diese Dateien werden wärend dem Script-Ablauf neu geschrieben. Das Script - es handelt sich hierbei um einen Kalender - sieht leider nur eine solche Datei vor. Ich möchte das Script für mehrere Benutzer erweitern und an den Dateinamen eine UserID anhängen.

class TextFileDatabase implements IDatabase
{
	const FILE_PATH = '../save/';
	const CONFIGURATION_FILE_NAME = 'config.ini';
	const OCCUPANCY_DATA_FILE_NAME = "data.csv";
	
	private function __construct() { }
	
	public static function saveConfiguration(array $settings)
	{
		if(!empty($settings))
		{
			$iniFileWriter = new INIFileWriter(self::CONFIGURATION_FILE_NAME, self::FILE_PATH, true);
			$iniFileWriter->write($settings);
		}
	}

	public static function loadConfiguration()
	{
		$iniFileImporter = new INIFileImporter(self::CONFIGURATION_FILE_NAME, dirname(__FILE__).'/'.self::FILE_PATH, true);
		$settings = $iniFileImporter->import();
		if(!empty($settings)) return $settings;
	}
	
	public static function saveOccupancyData(array $occupancyData)
	{
		if(isset($occupancyData))
		{
			$tmpOccupancyData = array();
			foreach($occupancyData as $id => $dayType)
			{
				$tmpOccupancyData[] = array($id, $dayType);
			}
			$csvFileWriter = new CSVFileWriter(self::OCCUPANCY_DATA_FILE_NAME, self::FILE_PATH, ';', '"');
			$csvFileWriter->setColumnHeads(array('Id', 'DayType'));
			$csvFileWriter->setUseColumnHeads(true);
			$csvFileWriter->write($tmpOccupancyData);
		}
	}
	
	public static function loadOccupancyData()
	{
		$csvFileImporter = new CSVFileImporter(self::OCCUPANCY_DATA_FILE_NAME, dirname(__FILE__).'/'.self::FILE_PATH, ';', '"');
		$csvFileImporter->setHasColumnHeads(true);
		$csvFileImporter->setUseColumnHeadsAsDataKeys(true);
		$importData = $csvFileImporter->import();
		if(!empty($importData))
		{
			$occupancyData = array();
			foreach($importData as $data)
			{
				$occupancyData[$data['Id']] = $data['DayType'];
			}
			return $occupancyData;
		}
	}
}

Die Konstanten am Anfang des Scripts möchte ich vom Prinzip her wie folgt ändern:

const FILE_PATH = '../save/';
const CONFIGURATION_FILE_NAME = 'config-'.$IDuser.'.ini';
const OCCUPANCY_DATA_FILE_NAME = "data-'.$IDuser.'.csv";

Da das so nicht funktioniert suche ich gerade eine alternative Lösung. Jemand eine Idee?

25.01.2012 10:50

2 Jörg Kruse

$IDuser musst du wohl erst in der Klasse sichtbar machen (z.B. mit global). Klassen-Konstanten können auch nicht durch Zeichenketten-Operatoren zusammengesetzt werden. Vielleicht ginge es so (ungetestet):

global $IDuser;
private $configuration_file_name = 'config-'.$IDuser.'.ini';
const CONFIGURATION_FILE_NAME = $configuration_file_name;

25.01.2012 11:14 | geändert: 25.01.2012 11:16

3 AndiN

hm... das gibt mir eine Fehlermeldung

global $IDuser;
private $configuration_file_name = 'config-'.$IDuser.'.ini';
const CONFIGURATION_FILE_NAME = $configuration_file_name;

Gibt mir leider einen Parse error: syntax error, unexpected T_GLOBAL, expecting T_FUNCTION in (...) on line 25.

In Zeile 25 definiere ich die globale Variable.

25.01.2012 13:23

4 Jörg Kruse

Ist $IDuser vor der Klasse definiert?

Ansonsten wäre es eigentlich auch eleganter, $IDuser stattdessen als Konstante IDUSER zu definieren, die wäre automatisch überall verfügbar

25.01.2012 13:48

5 AndiN

$IDuser ist vor der Klasse definiert, aber in der Klasse nicht verfügbar.
Das scheint das Problem zu sein.

26.01.2012 12:12

6 AndiN

Ich habe rausgefunden, dass eine Varibale in eine Konstante "einfügen" nicht so geht...

const CONFIGURATION_FILE_NAME = $configuration_file_name;

sondern so...

define("CONFIGURATION_FILE_NAME", $configuration_file_name);

Aber ich bekomme die $kundenID einfach nicht in der Klasse verfügbar. Ausserhalb ist sie vorhanden und hat auch einen Wert. Ich habe jetzt versucht die Variable ausserhalb der Klasse als Konstante zu definieren sowie als globale Variable. Hat leider beides nichts gebracht. Ideen?

26.01.2012 13:52

7 Jörg Kruse

Ich habe rausgefunden, dass eine Varibale in eine Konstante "einfügen" nicht so geht...

const CONFIGURATION_FILE_NAME = $configuration_file_name;

sondern so...

define("CONFIGURATION_FILE_NAME", $configuration_file_name);

Das gilt aber nur außerhalb von Klassen! Klasse-Konstanten werden mit const definiert

Wenn du außerhalb der Klasse die Konstante IDUSER statt der Variable $IDuser definierst:

define('IDUSER', 1234);

... dann solltest du innerhalb der Klasse problemlos auf diese Konstante zugreifen können, weil Konstanten global verfügbar sind:

private $configuration_file_name = 'config-'.IDUSER.'.ini';
const CONFIGURATION_FILE_NAME = $configuration_file_name;

26.01.2012 15:15

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]