Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3219 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Instanciation d'une classe dans le scope global à partir dun namespace

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Instanciation d'une classe dans le scope global à partir dun namespace

n°1958886
GPT2
Posté le 20-01-2010 à 01:26:26  profilanswer
 

Hi all,
 
Le code suivant:  

Code :
  1. <?php
  2. namespace Example;
  3. function exception_error_handler($errno, $errtxt, $errfile, $errline) {
  4.     throw new ErrorException($errtxt, 0, $errno, $errfile, $errline);
  5. }
  6. set_error_handler('exception_error_handler');


 
génère l'erreur suivante:
 

Warning: set_error_handler() expects the argument (exception_error_handler) to be a valid callback in [...]


 
j'essaie d'apprendre la nouvelle gestion des espaces de nom dans PHP 5.3 et je comprends pas quel est le problème ici.  
 
Maintenant si je rajoute le namespace comme ça:
 

Code :
  1. set_error_handler('\Example\exception_error_handler');


 
j'ai plus le warning, mais du coup j'ai un problème lorsqu'une exception est interceptées, puisqu'il essaie de charger la classe ErrorException depuis le namespace "Example" plutôt que depuis le scope global:
 

Code :
  1. Fatal error: Class 'Example\ErrorException' not found in [...]


 
or cette classe n'est pas définie dans le namespace "Example" mais dans le scope global...
 
:cry:  
 
merci par avance pour votre aide  :jap:

mood
Publicité
Posté le 20-01-2010 à 01:26:26  profilanswer
 

n°1958913
stealth35
Posté le 20-01-2010 à 10:03:06  profilanswer
 

hello

 

sans namespace

 
Code :
  1. function exception_error_handler($errno, $errtxt, $errfile, $errline)
  2. {
  3.    throw new ErrorException($errtxt, 0, $errno, $errfile, $errline);
  4. }
  5.     
  6. set_error_handler('exception_error_handler');
 

avec namespace

 
Code :
  1. namespace Exemple;
  2.     
  3. function exception_error_handler($errno, $errtxt, $errfile, $errline)
  4. {
  5.    throw new ErrorException($errtxt, 0, $errno, $errfile, $errline);
  6. }
  7.     
  8. set_error_handler('Exemple\exception_error_handler');
 


Chaque function definie sous le namespace en fait partie


Message édité par stealth35 le 20-01-2010 à 10:05:01
n°1959004
GPT2
Posté le 20-01-2010 à 12:49:43  profilanswer
 

Merci pour ta réponse.
 
Si tu relis bien mon message j'ai déjà trouvé ça par moi-même et j'ai déjà supprimé l'alerte. Cependant l'instanciation de la classe "ErrorException" (qui est instanciée depuis la fonction en question), est appelée comme ci elle était déclarée dans le namespace "Example" et non pas comme ci elle était déclarée dans le scope global (c'est une classe fournie par PHP qui est donc forcément dans le scope global: http://us3.php.net/manual/en/class.errorexception.php )
 
Donc ma question est la suivante: Comment, depuis un namespace donné, créer une instance d'une classe n'étant pas déclaré dans ce même namespace mais dans le scope global (sans aucun namespace donc).
 
Tu vois ce que je veux dire ?
 
Par exemple:
 
Fichier1.php

Code :
  1. <?php
  2. // note bien l'absence de namespace
  3. class MaClasse
  4. {
  5.     public function __construct()
  6.     {
  7.         echo 'ok ça marche';
  8.     }
  9. }


 
Fichier2.php

Code :
  1. <?php
  2. namespace MonNamespace;
  3. require "Fichier1.php";
  4. new MaClasse();


 
au lieu d'avoir "ok ça marche" j'ai l'erreur suivante:
 

Code :
  1. Fatal error: Class 'MonNamespace\MaClasse' not found in [...]


 
comment faire ?  :??:  
merci beaucoup pour ton aide  :jap:

n°1959012
stealth35
Posté le 20-01-2010 à 13:16:55  profilanswer
 

Code :
  1. new \MaClasse();
 

ou

 
Code :
  1. use \MaClasse;
  2. new MaClasse();



Message édité par stealth35 le 20-01-2010 à 13:19:33
n°1959023
stealth35
Posté le 20-01-2010 à 13:35:19  profilanswer
 

enfaite ca marche un peu comme le java ou as3 ducoup

 

tu déclares ton package, et tu fais tes import de class

 
Code :
  1. namespace Test;
  2.     
  3. use \ArrayObject;
  4.     
  5. class Test
  6. {
  7.    public function __construct()
  8.    {
  9.        $array = new ArrayObject();
  10.        var_dump($array);
  11.    }
  12. }
 
Code :
  1. require_once 'test.php';    
  2. $test = new Test\Test();


Message édité par stealth35 le 20-01-2010 à 13:39:24
n°1960141
GPT2
Posté le 25-01-2010 à 09:26:31  profilanswer
 

Okay merci beaucoup j'ai résolu mon problème.
 
La solution comme tu l'as indiquée est de simplement ajouter un backslash devant la fonction ou classe ou constante que l'on veut utiliser ou initier et qui se trouve dans le scope global et non pas dans un namespace spécifique.
 
Voici le code de mon premier message qui fonctionne désormais:

Code :
  1. <?php
  2. namespace Example;
  3. function exception_error_handler($errno, $errtxt, $errfile, $errline) {
  4.     throw new \ErrorException($errtxt, 0, $errno, $errfile, $errline);
  5. }
  6. set_error_handler('\Example\exception_error_handler');


 
:jap:   [:darkolive]

n°1960195
stealth35
Posté le 25-01-2010 à 13:07:02  profilanswer
 

je te conseil plutot d'utiliser d'utlise le mot clef "use"
 

Code :
  1. <?php
  2. namespace Example;
  3.  
  4. use \ErrorException
  5.  
  6. function exception_error_handler($errno, $errtxt, $errfile, $errline) {
  7.    throw new ErrorException($errtxt, 0, $errno, $errfile, $errline);
  8. }
  9. set_error_handler('\Example\exception_error_handler');


 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Instanciation d'une classe dans le scope global à partir dun namespace

 

Sujets relatifs
[Resolu] namespace std n'existe pas[VBA] Ajouter une ligne à un fichier Word à partir de cellules Excel
[Resolu] Tableau nb cours par categorie (Moodle)Comment calculer des statistiques à partir de boutons radio?
créer un tableau a partir d'une chaineprobleme de choix dans une base mysql a partir d'une date
Doxygen (problème avec des noms de variable/de classe)Représentation en mémoire d'une classe, assembleur
Instanciation de classe et accès aux méthodes des classe filles 
Plus de sujets relatifs à : Instanciation d'une classe dans le scope global à partir dun namespace


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR