Viele Werte an Methode übergeben

ne0hype

Erfahrenes Mitglied
Hi Leute,

ich bastel gerade an einem Bild Upload Script mit automatischer Thumbnail generation.

Ich würde dann gerne ein paar werte an die Methode übergeben wie z.b.

maxHeight = 400px;
maxWidth = 400px;
maxThumbHeight = 130px;
maxThumbWidth = 130px;
allowTypes = array(jpg, gif);


Klar sind in der Klasse schon Eigenschaften wie z.b. maxHeight schon vordefeniert aber wenn ich mal eine andere Größe haben wollte. Jetzt ist es ja blöd 6 und 7 Werte der Methode zu übergeben, deshalb dachte ich mir ich löse das in einem Array

$param = array (
maxHeight=>400,
maxWidth=>500,
allowTypes =>array(jpeg))

und dann $pictureUpload->run($_FILES['picture'], $param);

Oder habt ihr noch eine andere Idee wie ich viele Parameter einer Methode übergeben kann?

Gruß
ne0hype
 
Das sind ja optionen. Ja, ich würde die in einem Array übergeben und nur wirklich die im Array übergebenen Optionen überschreiben den default im Objekt.

Ich finde es aber eher üblich, die Optionen bei der Erzeugung einer Instanz übergibt....
 
Das mit dem Übergeben der Optionen geht leider nicht da ich mir einem PluginLoader geschrieben habe

$picUp = Pluginloader::load("pictureUpload.class.php");

Dieser erzeugt dann ein neues Objekt und ich kann dem PluginLoader keine Werte für den Konstruktor geben, bzw könnte ich schon aber will ich nicht ;)
 
Du könntest die Standardwerte mit den davon abweichenden Werten mittels array_merge()-Funktion vereinigen:
PHP:
$default = array(
	'maxHeight'      => 400,
	'maxWidth'       => 400,
	'maxThumbHeight' => 130,
	'maxThumbWidth'  => 130,
	'allowTypes'     => array('jpg', 'gif'),
);
$specific = array(
	'maxHeight'  => 400,
	'maxWidth'   => 500,
	'allowTypes' => array('jpeg'),
);
var_dump(array_merge($default, $specific));
 
Kann man so machen, muss man aber nicht. Also ich finde, das ist eine ziemlich starke Einschränkung.. Aber wie Du meinst :p

Wenn man es genau nimmt, ist das ganze dann auch kein Loader mehr..
 
Kann man so machen, muss man aber nicht. Also ich finde, das ist eine ziemlich starke Einschränkung.. Aber wie Du meinst :p

Wenn man es genau nimmt, ist das ganze dann auch kein Loader mehr..

was dann?

PHP:
<?php

/**
 * @project CMS
 * @date 10.3.2008 14:2
 *
 * @author -------------
 * @copyright 2007
 *
 * @file
 */


class Plugin 
{
	/**
 	 * Statische Variable für die Plugin-Objekte
 	 *
 	 */
	static public $pluginArray = array();
	
	
	
	
	/**
 	 * Holt das Action Objekt vom ActionController 
 	 * Plugin wird in allen Plugins als "extends" verwendet
 	 *
 	 */
	public function __construct() {
		require_once 'workbench/ActionController.php';
		
		$this->actionObj = ActionController::$thisObj;
		$this->smarty = ActionController::$thisObj->smarty;
		$this->db = ActionController::$thisObj->db;
	}
	
	
	
	/**
 	 * Prüft ob das Objekt schonmal instanziiert wurde 
 	 * falls ja dann gibt er das im Array gespeicherte Objekt zurück
 	 *
 	 * @parm 	$pluginName		string
 	 * @return	object
 	 *
 	 */
	static public function loadPlugin($pluginName) {
		
		if(array_key_exists($pluginName, self::$pluginArray)){
			return self::$pluginArray[$pluginName];
		}else{
			return self::getInstance($pluginName);
		}
	}
	
	
	
	/**
 	 * Prüft ob die angegebene Klasse exisiert und erzeugt das Objekt
 	 *
 	 * @parm 	$pluginName		string
 	 * @return	object
 	 *
 	 */
	static public function getInstance($pluginName) {
		
		$file = PLUGIN_DIR.'/'.$pluginName.'.class.php';
		
		if(file_exists($file) AND is_readable($file)){
			@require_once $file;
			
			if (class_exists($pluginName)) {
				$obj = new $pluginName;
				
				if(!($obj instanceof Plugin)){
					throw new MyException($pluginName.' hat als extends nicht die Klasse "Plugin"', __CLASS__);
				}
				
				self::$pluginArray[$pluginName] = $obj;
				
				return $obj;
			}else{
				throw new MyException('Klassenname "'.$pluginName.'" existiert nicht in der Klasse "'.$file.'"', __CLASS__);
			}

		}else{
			throw new MyException('Plugin "'.$file.'" nicht gefunden.', __CLASS__);
		}
	}
}
?>
 
Ich assoziiere mit einem Loader etwas anderes, als das, was dein Loader tut. Das war keine Kritik meinerseits, weil ich schließlich nicht ahnen kann, für welche Zwecke dein Loader verwendet wird. Ich arbeite hauptsächlich mit dem ZendFramework, dort gibt es auch eine Möglichkeit, Klassen über einen Loader nachzuladen, der lädt aber nur die Klassen nach und erzeugt keine Instanz davon. Das was du da hast, ist eher eine Factory, mit der Einschränkung, den Objekten im Konstruktor keine Parameter übergeben zu können.
 
Zurück