Je suggère une approche différente à ce sujet. Avoir des méthodes différentes pour chaque type pair vous obligera à écrire du code répétitif, ce qui conduira éventuellement à un code maintenable coûteux et sujettes aux erreurs (même le copier/coller est sujet aux erreurs et je l'ai vu dans certains projets pour le prouver). Tout d'abord, les appels statiques doivent être limités uniquement (ou principalement) lorsque les méthodes et ne nécessitent pas de stocker des données dans les membres de classe; une méthode statique ne doit rien définir, moins de données à utiliser par les instances de la classe elle-même. Vous devriez donc utiliser le motif singleton. Deuxièmement, si vous deviez avoir plusieurs types d'événements, chacun devrait avoir sa propre classe spécialisée. La conception orientée objet va de l'abstrait au concret, du général au spécialisé. Par conséquent, votre Events
ne devrait pas savoir combien ou quel événement il stocke, mais devrait laisser cela à l'appelant.Cela vous permettra d'avoir une interface plus cohérente.
serait ici un design exemple:
class Events {
static private $_instance;
static public function getInstance() {
// lazy loading of the class instance will not use unnecessary resources
if (null === self::$_instance) {
self::$_instance = new self(); // <-- valid PHP declaration
}
return self::$_instance;
}
// class members
protected $_events; // protected allows inheritance, use private to forbid it
// private constructor prohibit external instances to be created
private function __construct() {
$this->_events = array();
}
// (GETTER: methods that starts with 'get'...)
// use $year before $month for priority order ($month is more precise than $year)
public function getEvents($type, $year = null, $month = null) {
$_values = array();
// if we have any event of that type...
if (array_key_exists($type, $this->_events)) {
foreach ($this->_events[$type] as $event) {
// filter events to return... (if $year is null, $month is ignored)
if ((null === $year
|| (($year == $event->getYear())
&& (null === $month || $month == $event->getMonth())))) {
$_values[] = $event;
}
}
}
return $_values;
}
// (SETTER: methods that starts with 'add', 'set', etc.)
public function addEvent(AbstractEvent $event) {
if (!array_key_exists($event->getType(), $this->_events)) {
$this->_events[$event->getType()] = array();
}
$this->_events[$event->getType()][] = $event;
// returning $this allows chaining.
// While some argue the design of this, I personally like it
return $this;
}
}
Maintenant que nous avons notre conteneur, nous aurons besoin de types d'événements, d'abord, nous avons notre classe de base:
abstract class AbstractEvent {
protected $_year; // again, protected to enable inheritance
protected $_month;
public function __construct($year, $month) {
// TODO : perform some argument check here
$this->_year = $year;
$this->_month = $month;
}
abstract public function getType();
public function getYear() { return $this->_year; }
public function getMonth() { return $this->_month; }
}
Ensuite, se spécialisent simplement (nous créons deux types d'événements specialize):
class MicrosoftEvent extends AbstractEvent {
const TYPE = 'Microsoft';
public function getType() { return self::TYPE; }
}
class LinuxEvent extends AbstractEvent {
const TYPE = 'Linux';
public function getType() { return self::TYPE; }
}
Ajout de nouveaux événements
Events::getInstance()
->addEvent(new LinuxEvent(2010, 7))
->addEvent(new MicrosoftEvent(2008, 8))
->addEvent(new MicrosoftEvent(2010, 2))
->addEvent(new LinuxEvent(2009, 1))
// ...
;
Obtenir des événements
// 1. get ALL Microsoft events
var_export(Events::getInstance()->getEvents(MicrosoftEvent::TYPE));
// 2. get all events for 'Linux' in 2010
var_export(Events::getInstance()->getEvents('Linux', 2010));
// 3. same as 1; $month will be ignored, because $year is not specified
var_export(Events::getInstance()->getEvents('Microsoft', null, 6));
// 4. returns empty array because unknown event type
var_export(Events::getInstance()->getEvents('Foo'));
Comme vous pouvez le voir, les frais généraux pour la conception de classe est un peu plus complexe, mais l'API est beaucoup plus cohérente par la suite. Une bonne conception doit appliquer le modèle réutilisable et ceci est accompli ici. J'espère que cela t'aides.
****** EDITER **** puisque votre question a changé, voici une solution éditée. Il est beaucoup plus petit, mais toujours suivre la même conception de base:
class Events {
static private $_events = array();
// GETTER
static public function getEventType($type) {
// if we have any event of that type...
if (!array_key_exists($type, self::$_events)) {
$eventClass = $type . 'Event';
self::$_events[$type] = new $eventClass();
}
return self::$_events[$type];
}
}
Ensuite, notre classe type d'événement de base
abstract class AbstractEvent {
abstract public function getType();
public function getIdentifier($year, $month) {
return $this->getType().str_pad((int) $month, 2, '0', STR_PAD_LEFT).str_pad((int) $year, 4, '0', STR_PAD_LEFT);
}
}
Maintenant, nous nous spécialisons les types
class MicrosoftEvent extends AbstractEvent {
const TYPE = 'Microsoft';
public function getType() { return self::TYPE; }
}
class LinuxEvent extends AbstractEvent {
const TYPE = 'Linux';
public function getType() { return self::TYPE; }
}
Ensuite, nous testons la Résultats
var_export(Events::getEventType(MicrosoftEvent::TYPE)->getIdentifier(2008, 6));
var_export(Events::getEventType(LinuxEvent::TYPE)->getIdentifier(2010, 2));
var_export(Events::getEventType('Microsoft')->getIdentifier('2009', '08'));
@stereofrog - Bon p oint. Mon but est de faire une classe qui utilise le même ensemble de variables pour chaque fonction statique. Chaque fonction statique fournira cependant un ensemble différent de valeurs statiques aux variables de classe. Cette approche est-elle une solution raisonnable à mon objectif? J'espère que ce n'est pas trop vague. – JMC
Je peux recommander vivement cet excellent manuel sur les cours, http://www.amazon.co.uk/Objects-Patterns-Practice-Experts-Source/dp/143022925X/ref=wl_it_dp_o?ie=UTF8&coliid=I2NUYS3JDGG7PU&colid=1478EBZ835RZN –
@ acidjazz: Votre description et l'exemple que vous avez donné ne me semblent malheureusement pas très sensés et je pense que c'est la mauvaise approche. Pouvez-vous préciser le cas d'utilisation/d'utilisation de 'class Events'? – VolkerK