Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/10/2011, 12h47   #1
Membre du Club
 
Inscription : janvier 2004
Messages : 103
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 103
Points : 48
Points : 48
Par défaut Intercepter un appel de classe

Bien le bonjour.

J'essaie de faire un truc qui semble apparemment impossible, mais peut-être que vous avez la réponse à mon problème.

J'ai actuellement un gros site que je suis en train de refactorer afin de le rendre plus simple et plus maintenable, et je veux utiliser la puissance des namespaces pour cela. Mon but est de pouvoir ajouter une classe dans un namespace "prioritaire" afin qu'elle soit prise automatiquement en compte sans que j'ai à toucher au code déjà existant.

Exemple :

Fichier "Specifique/Objet.php"
Code :
1
2
3
4
 
namespace Specifique;
 
class Objet extends \Commun\Objet { (...) }
Fichier "Commun/Objet.php"
Code :
1
2
3
4
 
namespace Commun;
 
class Objet { (...) }
Fichier "Commun/Partie.php"
Code :
1
2
3
4
5
 
namespace Commun;
 
class Partie { (...) }
}
index.php
Code :
1
2
3
 
$objet = new Objet();
$partie = new Partie();
Ce que je veux faire, c'est que l'instanciation de la classe Objet pointe sur la classe du namespace Specifique, et que l'instanciation de la classe Partie pointe sur la classe du namespace Commun. Si je venais à supprimer la classe \Specifique\Objet, le code irait automatiquement prendre en compte la classe \Commun\Objet.

Je pensais qu'il existait une fonction, à l'image de la méthode magique "__call()" pour les méthodes de classe, qui me permettrait d'intercepter l'appel à ces classes et d'en faire ce que je veux, mais je ne parviens pas à trouver, ni à concevoir, un tel système.

Auriez-vous une idée ?

Merci d'avance.
__________________
Problèmes résolus : 3
N'oubliez pas le tag [Résolu]
Bensor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 13h50   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 032
Points : 5 032
Utilise:
Code :
1
2
3
4
5
6
namespace Commun;
 
$objet = new Objet(); // instance de /commun/Objet
$partie = new Partie(); // instance /commun/Partie
 
$objet2 = new \Specifique\Objet; // instance de /Specifique/Objet
Tu peux également déclarer des classes dans le namespace global (\).

Note: seul PHP 5.3+ supporte les namespaces, la plupart des hébergeurs ne le supportent pas encore. Voir http://blog.pascal-martin.fr/post/st...ns-php-2011-09

Citation:
Je pensais qu'il existait une fonction, à l'image de la méthode magique "__call()" pour les méthodes de classe, qui me permettrait d'intercepter l'appel à ces classes et d'en faire ce que je veux, mais je ne parviens pas à trouver, ni à concevoir, un tel système.
En effet, tu peux définir la méthode __callStatic (depuis PHP 5.3) qui permet de résoudre les appels de méthodes privées ou inexistantes. Mais à mois que tu n'implémentes un factory, ça n'a rien à voir avec les namespaces.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 10h25   #3
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Bonjour,

IL existe déjà plusieurs techniques pour faire cela, que tu devras adapter à ton projet.

J'aime beaucoup le système de Kohana : le cascading filesystem

ou encore chez Zend : le chargeur de plugin

Bon code !
__________________
  • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
  • Merci d'utiliser les balises de code (# dans l'éditeur)
  • Si votre problème est réglé, merci d'utiliser le bouton
S.N.A.F.U
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h57.


 
 
 
 
Partenaires

Hébergement Web