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

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

Marsh Posté le 20-01-2010 à 01:26:26    

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:

Reply

Marsh Posté le 20-01-2010 à 01:26:26   

Reply

Marsh Posté le 20-01-2010 à 10:03:06    

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
Reply

Marsh Posté le 20-01-2010 à 12:49:43    

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:

Reply

Marsh Posté le 20-01-2010 à 13:16:55    

Code :
  1. new \MaClasse();
 

ou

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



Message édité par stealth35 le 20-01-2010 à 13:19:33
Reply

Marsh Posté le 20-01-2010 à 13:35:19    

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
Reply

Marsh Posté le 25-01-2010 à 09:26:31    

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]

Reply

Marsh Posté le 25-01-2010 à 13:07:02    

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');


 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed