Accueil > > > PHP5 - UTILISATION DES ITÉRATEURS ET DE LA RÉFLECTION.
PHP5 - UTILISATION DES ITÉRATEURS ET DE LA RÉFLECTION.
Information sur la source
Description
Pfiou, avec un titre aussi compliqué, j'imagine que je ne vais pas avoir beaucoup de gens qui vont lire une source pareil. Remarquez, je vous comprends ^^
Rentrons dans le vif du sujet.
Kesako tout ca ?
Il y a une multitude de classes ici. Je ne décris pas les classes abstraites volontairement qui sont la que pour assurer une homogéité (?) entre les classes filles.
Donc nous avons :
-> Une classe SQL
-> Une classe factory de news
-> Une classe d'interfacage SQL/factory
-> Une classe d'itération
-> 2 classes de news dont l'une étend l'autre.
Comment est ce que ce beau monde fonctionne ensemble ?
Nous instancions la classe "factory" de news et nous lui disons quelle intérface utiliser (sql, xml, fichier standard... etc).
Nous appelons les méthodes de la factory. La factory utilise l'API de reflection pour utiliser la bonne interface.
C'est cette interface qui va renvoyer la ressource exploitable (ici pour MySQL, on revoit une ressource MySQL. Pour XML c'est un peu différent).
La factory, si il y a plusieurs enregistrements, renverra un itérateur. Autrement, elle renverra une classe de news simple.
Nous allons ensuite parcourir cette itérateur (grace à l'interface Iterator de PHP) pour récupérer chaque enregistrement en nous renvoyons systématiquement un objet (l'objet contenant la news en quelque sorte).
Et par la suite, nous allons pouvoir exploiter cet objet.
Je ne sais pas si je me suis bien fait comprendre (c'est assez dur au début), mais voici le code (il est très commenté) :
Source
- <?php
- $time = microtime(true);
- /**
- * Interface permettant le dialogue entre une interface sortie et la/les news.
- *
- */
- interface iSimpleNewsIO {
- /**
- * Récupère la liste entière de news.
- *
- */
- public function GetAll();
- /**
- * Récupère une liste de news comprise entre 2 bornes.
- *
- * @param int $start
- * @param int $limit
- */
- public function GetRange($start, $limit);
- /**
- * Récupère une news à partir de son ID.
- *
- * @param int $id
- */
- public function GetSingle($id);
- /**
- * Récupère la liste entière de news avec leurs nombres de commentaires respectifs.
- *
- */
- public function GetAllWithCommentsCount();
- /**
- * Récupère une liste de news comprise entre 2 bornes avec leurs nombres de commentaires.
- *
- * @param int $start
- * @param int $limit
- */
- public function GetRangeWithCommentsCount($start, $limit);
- }
- /**
- * Interface permettant le dialogue entre une interface E/S et la news.
- *
- */
- interface iExtendedNewsIO {
- /**
- * Ajoute une news.
- *
- * @param FullAccessNews $news
- */
- public function Insert(FullAccessNews $news);
- /**
- * Modifie une news
- *
- * @param FullAccessNews $news
- */
- public function Update(FullAccessNews $news);
- /**
- * Supprime une news.
- *
- * @param FullAccessNews $news
- */
- public function Delete(FullAccessNews $news);
- /**
- * Récupère le nombre de commentaires d'une news.
- *
- * @param FullAccessNews $news
- */
- public function GetCommentsCount(FullAccessNews $news);
- }
-
-
-
- // Classe DateTime déja posté sur PHPCS.
- require_once ('date.php');
-
- /**
- * Classe d'itération.
- *
- * Permet d'utiliser les itérateurs en cas de récupération multiples d'un même éléments
- * (ex : news, commentaires, pages, liens).
- * Cette classe renverra un objet utilisable.
- *
- */
- class IterateMe implements Iterator {
-
- /**
- * Renvoit la clé en cours (autoincrément).
- *
- * @var int
- */
- protected $key;
- /**
- * Sortie de la classe... renvoit un objet utilisable.
- *
- * @var stdClass
- */
- protected $output;
- /**
- * Classe qui sera renvoyée à l'output.
- *
- * @var ReflectionClass
- */
- protected $OutputClass;
- /**
- * Classe permettant de faire l'interface avec la récupération de données.
- *
- * @var ReflectionClass
- */
- protected $InterfaceClass;
- /**
- * Requète utilisé pour l'itération (utilisable que sous MySQLi pour le moment).
- *
- * @var MySQLi_stmt
- */
- protected $query;
-
- /**
- * Instancie l'itérateur.
- *
- * @param MySQLi_stmt $query
- * @param ReflectionClass $InterfaceClass
- * @param ReflectionClass $OutputClass
- */
- public function __construct($query, ReflectionClass $InterfaceClass, ReflectionClass $OutputClass) {
- $this->key = -1;
- $this->InterfaceClass = $InterfaceClass;
- $this->OutputClass = $OutputClass;
- $this->query = $query;
- }
-
- /**
- * Retourne la clé en cours.
- *
- * @return int
- */
- public function Key() {
- return $this->key;
- }
- /**
- * Pointe vers le prochain élément.
- *
- */
- public function Next() {
- $this->output = $this->InterfaceClass->getMethod('Next')->invoke(NULL, $this->query, $this->OutputClass);
- $this->key++;
- }
- /**
- * Rembobine le pointeur.
- *
- */
- public function Rewind() {
- $this->InterfaceClass->getMethod('Rewind')->invoke(NULL, $this->query);
- $this->Next();
- }
- /**
- * Affiche l'enregistrement courant du pointeur.
- *
- * @return stdClass
- */
- public function Current() {
- return $this->output;
- }
- /**
- * Vérifie si l'output est bien défini, sinon on stop.
- *
- * @return bool
- */
- public function Valid() {
- return isset($this->output);
- }
-
- }
-
- /**
- * Classe d'interfacage avec n'importe quel type de platforme de stockage.
- *
- */
- abstract class QueryInterface {
- /**
- * Constructeur protégé, cette classe ne sera utilisable qu'en utilisant les namespaces.
- *
- */
- protected function __construct() {
- throw new Exception('This class can only be used with namespace.');
- }
- /**
- * Methode permettant d'aller au prochain enregistrement lors d'une itération.
- *
- * @param resource $resource
- * @param ReflectionClass $c
- */
- abstract static public function Next($resource, ReflectionClass $c);
- /**
- * Methode permettant de rembobiner à 0 le pointeur.
- *
- * @param resource $resource
- */
- abstract static public function Rewind($resource);
- }
- abstract class SQLQueryInterface extends QueryInterface {
- /**
- * Garde en mémoire les appels de méthodes.
- *
- * @var array
- */
- static protected $methods = array();
-
- /**
- * Redéfinition de la méthode Next.
- *
- * @param MySQLi_stmt $query
- * @param ReflectionClass $c
- * @return InstanceOf_ReflectionClass_$c
- */
- static public function Next($query, ReflectionClass $c) {
- return ( $data = $query->fetch_assoc() ) ? $c->newInstance($data) : NULL;
- }
- /**
- * Redéfinition de la méthode Rewind.
- *
- * @param MySQLi_stmt $query
- */
- static public function Rewind($query) {
- $query->data_seek(0);
- }
-
- }
-
- class SQLSimpleNewsInterface extends SQLQueryInterface {
- static public function GetTotalNewsCount() {
- $var = System::GetSQLConnection()->query('SELECT COUNT(*) FROM news')->fetch_row();
- return (int) $var[0];
- }
- static public function GetAllNews() {
- return System::GetSQLConnection()->query('SELECT * FROM news');
- }
- static public function GetRangedNews($start, $limit) {
- return System::GetSQLConnection()->query('SELECT * FROM news LIMIT '.$start.','.$limit);
- }
- static public function GetNews($id) {
- return System::GetSQLConnection()->query('SELECT * FROM news WHERE id = '.(int) $id)->fetch_array();
- }
- static public function GetNewsWithCommentsCount() {
- return System::GetSQLConnection()->query(
- 'SELECT news.id, news.title, news.content, news.date, COUNT(comments.id) as nbcomms
- FROM news, comments
- WHERE news.id = comments.news_id
- GROUP BY news.id');
-
- }
- static public function GetRangedNewsWithCommentsCount($start, $limit) {
- return System::GetSQLConnection()->query(
- 'SELECT news.id, news.title, news.content, news.date, COUNT(comments.id) as nbcomms
- FROM news, comments
- WHERE news.id = comments.news_id
- GROUP BY news.id
- LIMIT '.$start.', '.$limit);
- }
- }
- class SQLExtendedNewsInterface extends SQLSimpleNewsInterface {
- static public function InsertNews(ExtendedNews $news) {
- return System::GetSQLConnection()->query(
- 'INSERT INTO news (title, content, date)
- VALUES ("'.$news->title.'", "'.$news->content.'", "'.$news->date.'")')->affected_rows();
- }
- static public function UpdateNews(ExtendedNews $news) {
- return System::GetSQLConnection()->query(
- 'UPDATE news SET title = "'.$news->title.'",
- content="'.$news->content.'", date = '.$news->date->GetTimestamp().'
- WHERE id = '.$news->id)->affected_rows();
- }
- static public function DeleteNews(ExtendedNews $news) {
- return System::GetSQLConnection()->query(
- 'DELETE FROM news WHERE id = '.$news->id)->affected_rows();
- }
- static public function GetCommentsCountFromNews(ExtendedNews $news) {
- $data = System::GetSQLConnection()->query('SELECT COUNT(*) FROM comments WHERE news_id = '.$news->id)->fetch_row();
- return (int) $data[0];
- }
- }
-
- /**
- * Classe abstraite gérant toutes les fabs.
- *
- */
- abstract class Factory {
- /**
- * Attendu dans le constructeur le nom de l'interface utilisé.
- *
- * @param string $InterfaceName
- */
- abstract public function __construct($InterfaceName);
- }
-
- class SimpleNewsFactory extends Factory implements iSimpleNewsIO {
- /**
- * Nom de l'interface utilisé.
- *
- * @var ReflectionClass
- */
- static protected $InterfaceClass;
-
- /**
- * Instancie la fab avec l'interface voulu.
- *
- * @param string $InterfaceName
- */
- public function __construct($InterfaceName = 'SQLSimpleNewsInterface') {
- try {
- self::$InterfaceClass = new ReflectionClass($InterfaceName);
- } catch ( ReflectionException $e ) {
- die( $e->getMessage() );
- }
- }
- public function GetAll() {
- return new IterateMe(self::$InterfaceClass->getMethod('GetAllNews')->invoke(NULL),
- self::$InterfaceClass,
- new ReflectionClass('ReadOnlyNews') );
- }
- public function GetRange($start, $limit) {
- return new IterateMe(self::$InterfaceClass->getMethod('GetRangedNews')->invoke(NULL, $start, $limit),
- self::$InterfaceClass,
- new ReflectionClass('ReadOnlyNews') );
- }
- public function GetSingle($id) {
- return new FullAccessNews( self::$InterfaceClass->getMethod('GetNews')->invoke(NULL, $id) );
- }
- public function GetAllWithCommentsCount() {
- return new IterateMe(self::$InterfaceClass->getMethod('GetAllNewsWithCommentsCount')->invoke(NULL),
- self::$InterfaceClass,
- new ReflectionClass('ReadOnlyNewsWithComments') );
- }
- public function GetRangeWithCommentsCount($start, $limit) {
- return new IterateMe(self::$InterfaceClass->getMethod('GetRangedNewsWithCommentsCount')->invoke(NULL, $start, $limit),
- self::$InterfaceClass,
- new ReflectionClass('ReadOnlyNewsWithComments') );
- }
-
- }
-
- class ExtendedNewsFactory extends SimpleNewsFactory implements iExtendedNewsIO {
- public function __construct($InterfaceName = 'SQLExtendedNewsInterface') {
- parent::__construct($InterfaceName);
- }
- public function Insert(FullAccessNews $news) {
- if ( self::$InterfaceClass->getMethod('InsertNews')->invoke(NULL, $news) !== 1 )
- throw new Exception('Impossible to add newsitem !');
- return true;
- }
- public function Update(FullAccessNews $news) {
- if ( self::$InterfaceClass->getMethod('UpdateNews')->invoke(NULL, $news) !== 0 )
- throw new Exception('Impossible to add newsitem !');
- return true;
- }
- public function Delete(FullAccessNews $news) {
- if ( self::$InterfaceClass->getMethod('DeleteNews')->invoke(NULL, $news) !== 1 )
- throw new Exception('Impossible to delete newsitem !');
- return true;
- }
- public function GetCommentsCount(FullAccessNews $news) {
- return self::$InterfaceClass->getMethod('GetCommentsCountFromNews')->invoke(NULL, $news);
- }
- }
-
- abstract class News {
- protected $id;
- protected $title;
- protected $content;
- protected $date;
-
- public function __construct($params) {
- $this->id = $params['id'];
- $this->title = $params['title'];
- $this->content = $params['content'];
- $this->date = new oDate($params['date']);
- }
-
- public function __get($var) {
- if ( property_exists($this, $var) )
- return $this->$var;
- else
- throw new Exception($var.' doesn\'t exists !');
- }
-
- abstract public function __set($var, $val);
-
- }
-
- class ReadOnlyNews extends News {
-
- public function __set($var, $val) {
- throw new Exception('SimpleNews is a read-only class !');
- }
-
- }
- class ReadOnlyNewsWithComments extends ReadOnlyNews {
- protected $coms_count;
-
- public function __construct($params) {
- parent::__construct($params);
- $this->coms_count = $params['coms_count'];
- }
- }
-
- class FullAccessNews extends News {
-
- public function __set($var, $val) {
- if ( property_exists($var, $val) )
- $this->$var = $val;
- else
- throw new Exception($var.' doesn\'t exists !');
- }
-
- }
-
- class System {
-
- static private $_mods = array();
- static private $_criticals = array();
-
- static public function GetModule($ModuleName, $InterfaceName=null) {
- if ( !isset(self::$_mods[$ModuleName]) ) {
- $ClassMod = new ReflectionClass($ModuleName);
- if ( isset($InterfaceName) ) {
- self::$_mods[$ModuleName]['instance'] = $ClassMod->newInstance($InterfaceName);
- self::$_mods[$ModuleName]['interface'] = $InterfaceName;
- } else {
- $params = $ClassMod->getConstructor()->getParameters();
- self::$_mods[$ModuleName]['interface'] = $params[0]->getDefaultValue();
- self::$_mods[$ModuleName]['instance'] = $ClassMod->newInstance();
- }
- unset($ClassMod);
- }
- return self::$_mods[$ModuleName]['instance'];
- }
-
- static public function GetSQLConnection() {
- if ( !isset(self::$_criticals['sql']) )
- self::$_criticals['sql'] = new mysqli('localhost', 'root', '', 'blog');
- return self::$_criticals['sql'];
- }
-
- static public function GetXMLConnection() {
- //
- }
- }
-
-
-
- // Instanciation de la classe.
- $NewsFab = System::GetModule('SimpleNewsFactory');
- // Pour une itération simple :
- $news = $NewsFab->GetSingle(1);
- echo $news->id.'<br />'.$news->title.'<br />'.$news->content.'<br/><br />';
-
-
- echo '<br /><br /><br />';
-
-
- // Pour une itération multiple :
- $allnews = $NewsFab->GetRange(0,3);
- foreach ( $allnews as $key=>$line) {
- echo $line->date.' - '.$line->title.'<br />';
- echo $line->content.'<br /><br />';
- }
-
- echo '<br /><br /><br />';
- // Ou alors :
- foreach ( $NewsFab->GetRange(5,5) as $key=>$line ) {
- echo $line->date.' - '.$line->title.'<br />';
- echo $line->content.'<br /><br />';
- }
-
- //Même technique qu'au dessus.
- echo '<br /><br /><br />';
-
- echo microtime(true)-$time;
- ?>
<?php
$time = microtime(true);
/**
* Interface permettant le dialogue entre une interface sortie et la/les news.
*
*/
interface iSimpleNewsIO {
/**
* Récupère la liste entière de news.
*
*/
public function GetAll();
/**
* Récupère une liste de news comprise entre 2 bornes.
*
* @param int $start
* @param int $limit
*/
public function GetRange($start, $limit);
/**
* Récupère une news à partir de son ID.
*
* @param int $id
*/
public function GetSingle($id);
/**
* Récupère la liste entière de news avec leurs nombres de commentaires respectifs.
*
*/
public function GetAllWithCommentsCount();
/**
* Récupère une liste de news comprise entre 2 bornes avec leurs nombres de commentaires.
*
* @param int $start
* @param int $limit
*/
public function GetRangeWithCommentsCount($start, $limit);
}
/**
* Interface permettant le dialogue entre une interface E/S et la news.
*
*/
interface iExtendedNewsIO {
/**
* Ajoute une news.
*
* @param FullAccessNews $news
*/
public function Insert(FullAccessNews $news);
/**
* Modifie une news
*
* @param FullAccessNews $news
*/
public function Update(FullAccessNews $news);
/**
* Supprime une news.
*
* @param FullAccessNews $news
*/
public function Delete(FullAccessNews $news);
/**
* Récupère le nombre de commentaires d'une news.
*
* @param FullAccessNews $news
*/
public function GetCommentsCount(FullAccessNews $news);
}
// Classe DateTime déja posté sur PHPCS.
require_once ('date.php');
/**
* Classe d'itération.
*
* Permet d'utiliser les itérateurs en cas de récupération multiples d'un même éléments
* (ex : news, commentaires, pages, liens).
* Cette classe renverra un objet utilisable.
*
*/
class IterateMe implements Iterator {
/**
* Renvoit la clé en cours (autoincrément).
*
* @var int
*/
protected $key;
/**
* Sortie de la classe... renvoit un objet utilisable.
*
* @var stdClass
*/
protected $output;
/**
* Classe qui sera renvoyée à l'output.
*
* @var ReflectionClass
*/
protected $OutputClass;
/**
* Classe permettant de faire l'interface avec la récupération de données.
*
* @var ReflectionClass
*/
protected $InterfaceClass;
/**
* Requète utilisé pour l'itération (utilisable que sous MySQLi pour le moment).
*
* @var MySQLi_stmt
*/
protected $query;
/**
* Instancie l'itérateur.
*
* @param MySQLi_stmt $query
* @param ReflectionClass $InterfaceClass
* @param ReflectionClass $OutputClass
*/
public function __construct($query, ReflectionClass $InterfaceClass, ReflectionClass $OutputClass) {
$this->key = -1;
$this->InterfaceClass = $InterfaceClass;
$this->OutputClass = $OutputClass;
$this->query = $query;
}
/**
* Retourne la clé en cours.
*
* @return int
*/
public function Key() {
return $this->key;
}
/**
* Pointe vers le prochain élément.
*
*/
public function Next() {
$this->output = $this->InterfaceClass->getMethod('Next')->invoke(NULL, $this->query, $this->OutputClass);
$this->key++;
}
/**
* Rembobine le pointeur.
*
*/
public function Rewind() {
$this->InterfaceClass->getMethod('Rewind')->invoke(NULL, $this->query);
$this->Next();
}
/**
* Affiche l'enregistrement courant du pointeur.
*
* @return stdClass
*/
public function Current() {
return $this->output;
}
/**
* Vérifie si l'output est bien défini, sinon on stop.
*
* @return bool
*/
public function Valid() {
return isset($this->output);
}
}
/**
* Classe d'interfacage avec n'importe quel type de platforme de stockage.
*
*/
abstract class QueryInterface {
/**
* Constructeur protégé, cette classe ne sera utilisable qu'en utilisant les namespaces.
*
*/
protected function __construct() {
throw new Exception('This class can only be used with namespace.');
}
/**
* Methode permettant d'aller au prochain enregistrement lors d'une itération.
*
* @param resource $resource
* @param ReflectionClass $c
*/
abstract static public function Next($resource, ReflectionClass $c);
/**
* Methode permettant de rembobiner à 0 le pointeur.
*
* @param resource $resource
*/
abstract static public function Rewind($resource);
}
abstract class SQLQueryInterface extends QueryInterface {
/**
* Garde en mémoire les appels de méthodes.
*
* @var array
*/
static protected $methods = array();
/**
* Redéfinition de la méthode Next.
*
* @param MySQLi_stmt $query
* @param ReflectionClass $c
* @return InstanceOf_ReflectionClass_$c
*/
static public function Next($query, ReflectionClass $c) {
return ( $data = $query->fetch_assoc() ) ? $c->newInstance($data) : NULL;
}
/**
* Redéfinition de la méthode Rewind.
*
* @param MySQLi_stmt $query
*/
static public function Rewind($query) {
$query->data_seek(0);
}
}
class SQLSimpleNewsInterface extends SQLQueryInterface {
static public function GetTotalNewsCount() {
$var = System::GetSQLConnection()->query('SELECT COUNT(*) FROM news')->fetch_row();
return (int) $var[0];
}
static public function GetAllNews() {
return System::GetSQLConnection()->query('SELECT * FROM news');
}
static public function GetRangedNews($start, $limit) {
return System::GetSQLConnection()->query('SELECT * FROM news LIMIT '.$start.','.$limit);
}
static public function GetNews($id) {
return System::GetSQLConnection()->query('SELECT * FROM news WHERE id = '.(int) $id)->fetch_array();
}
static public function GetNewsWithCommentsCount() {
return System::GetSQLConnection()->query(
'SELECT news.id, news.title, news.content, news.date, COUNT(comments.id) as nbcomms
FROM news, comments
WHERE news.id = comments.news_id
GROUP BY news.id');
}
static public function GetRangedNewsWithCommentsCount($start, $limit) {
return System::GetSQLConnection()->query(
'SELECT news.id, news.title, news.content, news.date, COUNT(comments.id) as nbcomms
FROM news, comments
WHERE news.id = comments.news_id
GROUP BY news.id
LIMIT '.$start.', '.$limit);
}
}
class SQLExtendedNewsInterface extends SQLSimpleNewsInterface {
static public function InsertNews(ExtendedNews $news) {
return System::GetSQLConnection()->query(
'INSERT INTO news (title, content, date)
VALUES ("'.$news->title.'", "'.$news->content.'", "'.$news->date.'")')->affected_rows();
}
static public function UpdateNews(ExtendedNews $news) {
return System::GetSQLConnection()->query(
'UPDATE news SET title = "'.$news->title.'",
content="'.$news->content.'", date = '.$news->date->GetTimestamp().'
WHERE id = '.$news->id)->affected_rows();
}
static public function DeleteNews(ExtendedNews $news) {
return System::GetSQLConnection()->query(
'DELETE FROM news WHERE id = '.$news->id)->affected_rows();
}
static public function GetCommentsCountFromNews(ExtendedNews $news) {
$data = System::GetSQLConnection()->query('SELECT COUNT(*) FROM comments WHERE news_id = '.$news->id)->fetch_row();
return (int) $data[0];
}
}
/**
* Classe abstraite gérant toutes les fabs.
*
*/
abstract class Factory {
/**
* Attendu dans le constructeur le nom de l'interface utilisé.
*
* @param string $InterfaceName
*/
abstract public function __construct($InterfaceName);
}
class SimpleNewsFactory extends Factory implements iSimpleNewsIO {
/**
* Nom de l'interface utilisé.
*
* @var ReflectionClass
*/
static protected $InterfaceClass;
/**
* Instancie la fab avec l'interface voulu.
*
* @param string $InterfaceName
*/
public function __construct($InterfaceName = 'SQLSimpleNewsInterface') {
try {
self::$InterfaceClass = new ReflectionClass($InterfaceName);
} catch ( ReflectionException $e ) {
die( $e->getMessage() );
}
}
public function GetAll() {
return new IterateMe(self::$InterfaceClass->getMethod('GetAllNews')->invoke(NULL),
self::$InterfaceClass,
new ReflectionClass('ReadOnlyNews') );
}
public function GetRange($start, $limit) {
return new IterateMe(self::$InterfaceClass->getMethod('GetRangedNews')->invoke(NULL, $start, $limit),
self::$InterfaceClass,
new ReflectionClass('ReadOnlyNews') );
}
public function GetSingle($id) {
return new FullAccessNews( self::$InterfaceClass->getMethod('GetNews')->invoke(NULL, $id) );
}
public function GetAllWithCommentsCount() {
return new IterateMe(self::$InterfaceClass->getMethod('GetAllNewsWithCommentsCount')->invoke(NULL),
self::$InterfaceClass,
new ReflectionClass('ReadOnlyNewsWithComments') );
}
public function GetRangeWithCommentsCount($start, $limit) {
return new IterateMe(self::$InterfaceClass->getMethod('GetRangedNewsWithCommentsCount')->invoke(NULL, $start, $limit),
self::$InterfaceClass,
new ReflectionClass('ReadOnlyNewsWithComments') );
}
}
class ExtendedNewsFactory extends SimpleNewsFactory implements iExtendedNewsIO {
public function __construct($InterfaceName = 'SQLExtendedNewsInterface') {
parent::__construct($InterfaceName);
}
public function Insert(FullAccessNews $news) {
if ( self::$InterfaceClass->getMethod('InsertNews')->invoke(NULL, $news) !== 1 )
throw new Exception('Impossible to add newsitem !');
return true;
}
public function Update(FullAccessNews $news) {
if ( self::$InterfaceClass->getMethod('UpdateNews')->invoke(NULL, $news) !== 0 )
throw new Exception('Impossible to add newsitem !');
return true;
}
public function Delete(FullAccessNews $news) {
if ( self::$InterfaceClass->getMethod('DeleteNews')->invoke(NULL, $news) !== 1 )
throw new Exception('Impossible to delete newsitem !');
return true;
}
public function GetCommentsCount(FullAccessNews $news) {
return self::$InterfaceClass->getMethod('GetCommentsCountFromNews')->invoke(NULL, $news);
}
}
abstract class News {
protected $id;
protected $title;
protected $content;
protected $date;
public function __construct($params) {
$this->id = $params['id'];
$this->title = $params['title'];
$this->content = $params['content'];
$this->date = new oDate($params['date']);
}
public function __get($var) {
if ( property_exists($this, $var) )
return $this->$var;
else
throw new Exception($var.' doesn\'t exists !');
}
abstract public function __set($var, $val);
}
class ReadOnlyNews extends News {
public function __set($var, $val) {
throw new Exception('SimpleNews is a read-only class !');
}
}
class ReadOnlyNewsWithComments extends ReadOnlyNews {
protected $coms_count;
public function __construct($params) {
parent::__construct($params);
$this->coms_count = $params['coms_count'];
}
}
class FullAccessNews extends News {
public function __set($var, $val) {
if ( property_exists($var, $val) )
$this->$var = $val;
else
throw new Exception($var.' doesn\'t exists !');
}
}
class System {
static private $_mods = array();
static private $_criticals = array();
static public function GetModule($ModuleName, $InterfaceName=null) {
if ( !isset(self::$_mods[$ModuleName]) ) {
$ClassMod = new ReflectionClass($ModuleName);
if ( isset($InterfaceName) ) {
self::$_mods[$ModuleName]['instance'] = $ClassMod->newInstance($InterfaceName);
self::$_mods[$ModuleName]['interface'] = $InterfaceName;
} else {
$params = $ClassMod->getConstructor()->getParameters();
self::$_mods[$ModuleName]['interface'] = $params[0]->getDefaultValue();
self::$_mods[$ModuleName]['instance'] = $ClassMod->newInstance();
}
unset($ClassMod);
}
return self::$_mods[$ModuleName]['instance'];
}
static public function GetSQLConnection() {
if ( !isset(self::$_criticals['sql']) )
self::$_criticals['sql'] = new mysqli('localhost', 'root', '', 'blog');
return self::$_criticals['sql'];
}
static public function GetXMLConnection() {
//
}
}
// Instanciation de la classe.
$NewsFab = System::GetModule('SimpleNewsFactory');
// Pour une itération simple :
$news = $NewsFab->GetSingle(1);
echo $news->id.'<br />'.$news->title.'<br />'.$news->content.'<br/><br />';
echo '<br /><br /><br />';
// Pour une itération multiple :
$allnews = $NewsFab->GetRange(0,3);
foreach ( $allnews as $key=>$line) {
echo $line->date.' - '.$line->title.'<br />';
echo $line->content.'<br /><br />';
}
echo '<br /><br /><br />';
// Ou alors :
foreach ( $NewsFab->GetRange(5,5) as $key=>$line ) {
echo $line->date.' - '.$line->title.'<br />';
echo $line->content.'<br /><br />';
}
//Même technique qu'au dessus.
echo '<br /><br /><br />';
echo microtime(true)-$time;
?>
Conclusion
Je passe sur la classe DateTime... :)
J'ai utilisé ici un exemple de news.
Mais on peut faire la même chose pour des commentaires, ou alors pour des dossiers ( un dossier avec plusieurs pages ), ou alors pour des liens, ou pour des téléchargements !
Il suffit de créer les classes correspondantes à chaque thème et la classe d'interface qui va avec, puis mettre tout en relation avec la classe d'itération.
C'est un peu compliqué avec la reflection, je vous invite à regarder sur le site officiel de PHP :
http://fr3.php.net/manual/fr/language.oop5.refl ection.php
Bonne lecture :)
Historique
- 03 avril 2007 23:06:40 :
- Grosse update :) Maintenant tout fonctionne, et c'est plus jolie je trouve ^^
Sources du même auteur
PHP 5 - CLASSE MYSQL (STYLE MYSQLI)PHP 5 - CLASSE MYSQL (STYLE MYSQLI) Bijour bijour :)
Bon, alors je reviens avec une énième version de wrapper MySQL... mais cette fois ci, j'ai fais plus large. J'ai utilisé comme mod...
[PHP5] CLASSE DATE/HEURE[PHP5] CLASSE DATE/HEURE PHP5.2 étant sorti, je suis allé regarder la nouvelle classe de date/heure qui se trouve dans le core de PHP. Ma déception fut pour le moins assez gra...
PHP5 - GESTION DE MODULES EN OBJETPHP5 - GESTION DE MODULES EN OBJET Kikoo :)
Bon, ca faisait bien longtemps que j'avais pas posté, et pour cause... les études ayant repris (pour ma part :p), j'ai un peu tous les lan...
PHP5 - CLASSE DE NEWS ET DE COMMENTAIRESPHP5 - CLASSE DE NEWS ET DE COMMENTAIRES Bonjour bonjour :)
Bon je tiens à rassurer tout le monde, aujourd'hui je fais quelque chose de pas bien nouveau. En faites, j'avais fait y'a longte...
PHP5 - CLASSE DE GESTION DE MODULESPHP5 - CLASSE DE GESTION DE MODULES Alors, je savais pas si je devais mettre ca dans les tutos ou ici. Je tente ici sait on jamais.
Aujourd'hui, quoi de neuf ? Gestion de modules d'un s...
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Class POO retourné le nom de l'objet [ par MeTh ]
Bonjour,Comment retourné le nom de l'objet déclaré?exemple :$monobjet = new GridR();comment recuperé $monobjet dans ma class?Merci
templates avec poo [ par lesnes ]
bonjours je reprogramme totalement mon site en poo et je souhaiterai utiliser les templates mais l'on ne peut pas faire appel a une class exterieur a
Probleme en POO [ par pablor44 ]
Bonjour,alors voilà je vous explique mon probleme, je suis en train d'ecrire une classe en php pour mon site et je me retrouve dans la situation
Gestion membres via POO [ par FhX ]
Je me posais la question justement. Pour pouvoir faire une interface membre (donc : admin + membre + visiteur), dois-je faire ca en une seule classe ?
logiciel POO [ par kowal2205 ]
Je me pose la question de la création de mes classes dans un projet de taille moyenne car je ne trouve pas de logiciel à mon pied qui me per
Reflexion sur un schema de POO (gestion d'emploi du temps d'une UFR) [ par Franquito ]
Bonjour à tous ! Je dois réaliser un schema pour une application de programation orienté objet. L'application fait la gestion d'emploi du temps d'un
Comment ca marche cette petite bete? [ par craso ]
bonjour,en surfant, je suis tombé sur le site http://www.phpied.com/image-fun/ .Je souhaite qu'on m'explique comment trnsformer une image comme sur le
réécriture d'un script en POO, comment faire? [ par craso ]
Bonjour,j'ai développé cette petite application http://pipcorp.free.fr/Il s'agit d'une image clicable, le personnage centrale se positionne a l'endroi
[POO] Développer son Framework [ par Foxhive ]
Bonjour à tous, Cela fait longtemps que l'idée m'interesse mais j'ai jamais vraiment osé me jeter à l'eau. Mais là que je suis en vacance je me dis qu
[POO] Avis à tous ! [ par FhX ]
L'update de PHP5.2 est assez conséquent, je vous conseil de la lire :pY'a pas mal de trucs qui vont changer, surtout au niveux des interfaces (et tant
|
Derniers Blogs
[SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|