IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Qui peut me dire ou je me trompe ?


Sujet :

Langage PHP

  1. #1
    Débutant Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Points : 170
    Points
    170
    Par défaut Qui peut me dire ou je me trompe ?
    Bonjour à tous, J'ai un souci dans une classe aiguillage entre un module accédant plusieurs tables et les classes gérant toutes celles-ci.

    Voici le code embryonnaire de cette classe....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    class IOdispatch // extends Member
    {	public  $RC   ;
    	private $obj, $IOenv  ;
    	private $instantiated = array (  	"MEMBER" 	=> NULL   ,
    										"SCREEN"	=> NULL
    								  ) ;
     
    	function __construct($IOenv, $table, $id = "default")
    	{	global $in ;
     
    		$this->IOenv = $IOenv ;
     
    		switch($table)
    		{	case "Member" 	:	$in[$id] = $this->obj = new Member($IOenv) ;
    								break ;
     
    			case "Screen"	:	$in[$id] = $this->obj = new Screen($IOenv) ;
    								break ;
     
    			default:			user_error("Table not yet defined[". $table ."] => fatal error !" , E_USER_ERROR) ;
    		}
    		return($this->obj) ;
    	}
     
    	function __call($method, $args)
    	{	//$this->obj = new Member($this->IOenv) ;
    		return( call_user_func_array( array( $this->obj , $method)  , $args ) ) ;
    	}
    }
    je ne comprends pas pourquoi le $this->obj qui appartient à la classe et qui est utilisé dans la function__call (en bas du listing) me donne l'erreur suivante PHP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [11-Apr-2010 10:56:36] PHP Warning:  call_user_func_array() expects parameter 1 to be a valid callback, first array member is not a valid class name or object in F:\WebSites\architecture\index.php on line 231
    Les appels au constructeur et à __call se font dans la même séquence.

    Merci @tous et bon WE !

    Esteban

  2. #2
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Où est fait ton call?

    Essaie de vérifier que $this->obj n'est pas nul sinon...

  3. #3
    Débutant Avatar de ETVigan
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2010
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2010
    Messages : 660
    Points : 170
    Points
    170
    Par défaut PHP5, problème de coding en OOP
    Merci, j'ai vérifié, il est NULL en effet.... mais je ne comprends pas pourquoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    // ==============================================================================================================================
    class IOdispatch // extends Member
    {	public  $RC   ;
    	private $obj, $IOenv  ;
    	private $instantiated = array (  	"MEMBER" 	=> NULL   ,
    										"SCREEN"	=> NULL
    								  ) ;
    							  
    	function __construct($IOenv, $table, $id = "default")
    	{	global $in ;
    	    
    		$this->IOenv = $IOenv ;
    		
    		switch($table)
    		{	case "Member" 	:	$in[$id] = $this->obj = new Member($IOenv) ;
    								break ;
    							
    			case "Screen"	:	$in[$id] = $this->obj = new Screen($IOenv) ;
    								break ;
    							
    			default:			user_error("Table not yet defined[". $table ."] => fatal error !" , E_USER_ERROR) ;
    		}
    		return($this->obj) ;
    	}
    	
    	function __call($method, $args)
    	{	//$this->obj = new Member($this->IOenv) ;
    		if ($this->obj == NULL) echo "null" ; echo NULL
    		return( call_user_func_array( array( $this->obj , $method)  , $args ) ) ;
    	}
    }
    // ==============================================================================================================================
    class Environ extends IOdispatch
    {	public $RC ;	
    
    	public  $IOenv = array ( HOST => "jecrapahute" , 
    							 USER => "root"        , 
    							 PASS => "********"   , 
    							 BASE => "jecrapah"
    						   ) ; 
    
    	function __construct($table)
    	{	
    //		user_error("Environ instantiated" , E_USER_NOTICE) ;
    		echo "Environ OK - " . crlf() ;
    
    		return( new IOdispatch($this->IOenv, $table) ) ;
    	}
    }
    // ==============================================================================================================================
    class Skeleton extends Environ
    {	public $RC ;
    
    
    	function __construct()
    	{	
    // 		user_error("Skeleton instantiated" , E_USER_NOTICE) ;
    		echo "Skeleton OK - " . crlf() ;
    
    		return( new Environ("Member") ) ;
    	}
    }
    
    	$skelt = new Skeleton() ;
    		
    // 	$obj = $this->RC[MEMBER] ;
    	$skelt->open( "skelt" ) ;
    Par le mécanisme d'héritage, j'instancie une chaine (petite) de classe....
    Skeleton -> Environ -> IOdispatch devrait faire le dispatch vers les classes qui gèrent chacune des tables au moyen d'une dernière classe générique Sql....
    En gras, se trouvent le constructeur qui initie l'appel de ces classes et le open est une méthode de toutes ces classes.
    La table adressée est en gras souligné....
    Pige pas $this->obj est private... je ne peux le déclarer comme globale....

    Merci en tout cas....

    Esteban

  4. #4
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    je peux voir comment tu appelles __call ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function __construct()
    	{	
    // 		user_error("Skeleton instantiated" , E_USER_NOTICE) ;
    		echo "Skeleton OK - " . crlf() ;
     
    		return( new Environ("Member") ) ; // Erreur
    	}
    La fonction __construct d'une classe sert à initialiser ses membres. Elle n'admet pas de return.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    function __construct($IOenv, $table, $id = "default")
    	{	global $in ;
    Bien que ton problème n'ai rien à voir avec cela, ne fais jamais ça ! Une classe de doit surtout pas dépendre de variables externes.

Discussions similaires

  1. idées,propositions,conseils:qui peut dire non!
    Par wikiele dans le forum Modélisation
    Réponses: 4
    Dernier message: 09/03/2011, 15h03
  2. Qui peut me dire explicitement ce qu'est un webcontainer
    Par dinozo13 dans le forum Websphere
    Réponses: 1
    Dernier message: 22/10/2010, 15h50
  3. [...] doit utiliser une requête qui peut être mise à jour
    Par requiemforadream dans le forum ASP
    Réponses: 4
    Dernier message: 26/04/2005, 09h12
  4. Comment peut-on dire : une bdd est petite, moyenne ou grosse
    Par Pierrinot dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 20/10/2004, 08h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo