JeuWeb - Crée ton jeu par navigateur
Recherches OO sur PHP - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Recherches OO sur PHP (/showthread.php?tid=6054)

Pages : 1 2


Recherches OO sur PHP - qwarnant - 27-03-2012

Bonjour à tous,

Dans le but d'améliorer mes connaissances du PHP, je continue à explorer les concepts OO de ce langage très vaste.

Dans l'immédiat, je réalise un petit framework, qui n'est pas destiné à une mise en production pour l'instant. Je m'en sers juste pour apprendre.

J'ai appris qu'il y avait une classe d'introspection, similaire à celle de Java. Malheureusement, il n'existe pas d'objet "Class" en PHP. Le type obtenu lors d'un get_class() n'est pas un type Class, ce qui m'ennuie fortement.

J'ai donc voulu créer une classe représentant cet objet. J'ai fait un mapping des méthodes d'introspection dessus, je voulais vous demander ce que vous en pensiez. Je continuerai à poster des bouts de code, tout au long de mes recherches.

Code PHP :
<?php 
class GoldFish_Core_Natives_Class {

private
$className;

public function
__construct($className) {
$this->className = $className;
}

public function
__call($method, $arguments) {
if (
method_exists(ReflectionClass, $method)) {
return
call_user_func_array(array(ReflectionClass, $method), $arguments);
}
return
false;
}

}

Merci d'avance pour votre aide à tous !


RE: Développement d'un petit framework dans un but de recherche - srm - 27-03-2012

C'est quoi un objet Class ?
Pourquoi tu en as besoin ?


RE: Développement d'un petit framework dans un but de recherche - niahoo - 27-03-2012

Je comprends pas comment on s'en sert de ton truc ? Pour l'instant je vois juste que quand tu appelles une méthode sur ton objet ça appelle la même méthode sur la Reflexion Class. donc autant appeller celle de la reflexion class direct. Le paramètre de ton constructeur n'est utilisé nulle part.

La dernière fois tu nous refaisais java en PHP et là tu part sur le même chemin on dirait. Tu connais python ? c'est super sympa côté introspection/réflexion.


RE: Développement d'un petit framework dans un but de recherche - qwarnant - 27-03-2012

Bonjour,

L'utilité de mon travail n'est pas de fournir un framework à des utilisateurs, juste de faire des recherches sur l'OO en PHP. Java étant le seul langage "tout objet" que je connais, j'essaye de faire des comparaisons.

J'essaye simplement d'uniformiser les comportements de différentes classes.
Conceptuellement, je trouve plus intéressant de faire appel à un objet de type Class qui est le sommet de la hiérarchie OO pour utiliser l'introspection, et ne pas utiliser une classe à part.

Toutes les méthodes liées à une classe pourront être appelées sur un objet de type Class, ce qui uniformise toutes les méthodes liées à la classe.

La classe n'est pas terminée, donc s'il y a des choses inutilisées, c'est pour cela ;-)

Je vous présente la classe AppConfig qui permettra de charger une configuration particulière pour votre application. Je vais utiliser la fonction de parsage des fichiers .ini, l'équivalent des .properties en Java. Ca permet d'uniformiser la manière de faire les paramètres de configuration d'une application.

Code PHP :
<?php 
/**
* @name GoldFish_Core_AppSettings_AppConfig
*
*/
abstract class GoldFish_Core_AppSettings_AppConfig {

private static
$INSTANCE;

/**
* Return the current instance of the AppConfig class
* @return GoldFish_Core_AppSettings_AppConfig l'instance
*/
public static function getInstance() {
if (
is_null(self::$INSTANCE)) {
self::$INSTANCE = new AppConfigImpl();
}
return
self::$INSTANCE;
}

/**
* Load the configuration given in argument
* @param string the configuration name
*/
abstract protected function loadContext($configName);

/**
* Return the property requested in argument
* @param string the property name
* @return string the value of the configuration property
*/
abstract protected function getProperty($name);

/**
* Return the current instance of the project's logger
* @return Logger the instance of the logger
*/
abstract protected function getLogger();
}

La classe d'implémentation :

Code PHP :
<?php 
class GoldFish_Core_AppSettings_AppConfigImpl implements GoldFish_Core_AppSettings_AppConfig {

private
$props;
private
$logger;

public function
getLogger() {
if (
is_null($this->logger)) {
$this->logger = new Logger();
}
return
$this->logger;
}

public function
getProperty($name) {
return
$this->props->getProperty($name);
}

public function
loadContext($configName) {
$this->props = new Properties();
$this->props->load($configName);
}

}

Ces classes sont très loin d'être terminées, comme je vous dis, je fais des recherches.

Cordialement


RE: Développement d'un petit framework dans un but de recherche - Hideaki - 27-03-2012

Je trouve que le titre de ton message n'est pas adapté : "Développement d'un petit framework dans un but de recherche" et framework de quoi ? Pour un développement MVC, 3 ou n-tiers, etc ?

Sinon ton objet ne sert pas à grand chose ici, surtout comme le dit justement niahoo, tu fais une réflexibilité sur ta classe GoldFish_Core_Natives_Class.

Ne cherche pas à appliquer les concepts ou les outils de java (ou autres langages) à du php, tu n'y arriveras pas du moins pas entièrement. Je ne connais pas ton niveau en php, mais commence par savoir bien manipuler et comprendre les frameworks existant au lieu de créer ton framework même si ne n'est que pour "tester". Si tu étudies les sources de framework open source, tu trouveras sans doute ton bonheur après libre à toi d'être créatif. Smile


RE: Développement d'un petit framework dans un but de recherche - srm - 27-03-2012

Donc tu fais encore un truc inutile, la classe réflection fait très bien son boulot Smile
Si tu veux t'amuser avec les possibilités d'un langage Quent, utilise le Scala, tu vas t'éclater Smile


RE: Développement d'un petit framework dans un but de recherche - niahoo - 27-03-2012

"""Toutes les méthodes liées à une classe pourront être appelées sur un objet de type Class, ce qui uniformise toutes les méthodes liées à la classe."""

J'ai pas compris !


RE: Développement d'un petit framework dans un but de recherche - qwarnant - 27-03-2012

(27-03-2012, 01:12 PM)Hideaki a écrit : Je trouve que le titre de ton message n'est pas adapté : "Développement d'un petit framework dans un but de recherche" et framework de quoi ? Pour un développement MVC, 3 ou n-tiers, etc ?

Sinon ton objet ne sert pas à grand chose ici, surtout comme le dit justement niahoo, tu fais une réflexibilité sur ta classe GoldFish_Core_Natives_Class.

Ne cherche pas à appliquer les concepts ou les outils de java (ou autres langages) à du php, tu n'y arriveras pas du moins pas entièrement. Je ne connais pas ton niveau en php, mais commence par savoir bien manipuler et comprendre les frameworks existant au lieu de créer ton framework même si ne n'est que pour "tester". Si tu étudies les sources de framework open source, tu trouveras sans doute ton bonheur après libre à toi d'être créatif. Smile

J'ai étudié plusieurs frameworks comme Symfony, Zend, CodeIgniter et CakePHP. En les connaissant, je voudrais justement essayer de rassembler différents avantages, uniquement dans un but de développement et de recherche. Smile

(27-03-2012, 01:19 PM)oxman a écrit : Donc tu fais encore un truc inutile, la classe réflection fait très bien son boulot Smile
Si tu veux t'amuser avec les possibilités d'un langage Quent, utilise le Scala, tu vas t'éclater Smile

J'avoue que la syntaxe devient vite lourde ... Bon, je vais abandonner l'idée du Class ... J'utiliserai la classe d'introspection de PHP, simplement.

(27-03-2012, 04:02 PM)niahoo a écrit : """Toutes les méthodes liées à une classe pourront être appelées sur un objet de type Class, ce qui uniformise toutes les méthodes liées à la classe."""

J'ai pas compris !

Je voulais dire qu'il est plus logique d'utiliser les méthodes d'introspection sur un objet de type "Class", tout au dessus de la chaîne d'héritage, plutôt que de faire ça sur une classe "à part". Ici la classe ReflectionClass est plutôt considérée comme une classe utilitaire...

Merci de me consacrer du temps en tout cas. Smile


RE: Recherches OO sur PHP - qwarnant - 28-03-2012

Dans mes recherches OO, j'ai découvert qu'un système PHP (pour vous faire plaisir et ne pas me laisser tenter par le Java ConfusediffleSmile nommé Pimple pour l'injection de dépendance.

Il s'utilise comme suit :

Code PHP :
<?php 
class Container extends Pimple
{
public function
__construct()
{
$this['user.class'] = 'User';
$this['user.storage.class'] = 'SessionStorage';
$this['user.storage.cookie_name'] = 'SESSION_ID';

$this['user'] = $this->share(function($c){
return new
$c['user.class']($c['user.storage']);
});
$this['user.storage'] = $this->share(function($c){
return new
$c['user.storage.class']($c['user.storage.cookie_name']);
});
}
}

Et utilisation :

Code PHP :
<?php 
$container
= new Container();

//Le conteneur reste paramétrable et modifiable au besoin
$container['user.storage.cookie_name'] = 'OTHER_SESSION_ID';

//Récupération du service d'utilisateur
$user = $container['user'];

Les classes à instancier pour un type défini de classe peuvent être paramétrées avec des fichiers YAML.
Qu'en pensez-vous ? Smile


RE: Recherches OO sur PHP - srm - 28-03-2012

https://github.com/symfony/DependencyInjection
Utilise plutôt ça si tu veux utiliser un système d'injection de dépendance.