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 :

Pointeur de function [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre éclairé 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
    Par défaut Pointeur de function
    Je passe mon dimanche pluvieux à tester les classes du style Iterator, etc

    Et j'ai une bête question, je dis bête car si PHP ressemble de part sa syntaxe au language C, je n'ai vu nulle part (même dans ce forum) une mention sur les pointeurs sur fonction.

    Voici le classe et donc le test que lequel je travaille :

    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
    class Validator implements Iterator
    {	private $curr,$start,$end,$function ;
    
    	function __construct($start ,$end , $function)
    	{	$this->start 	= $start ;
    		$this->end   	= $end ;
    		$this->function = $function ;	
    		$this->rewind() ;
    	}
    	
    	function rewind() {
    		$this->curr = $this->start ;
    	}
    	
    	function key() {
    		return($this->curr) ;
    	}
    	
    	function current() {
    		return($this->function() ) ;
    	}
    	
    	function next() {
    		if ($this->valid())
    			$this->curr++ ;
    	}
    	
    	function valid() {
    		return( ($this->curr <= $this->end) ? true : false ) ; 
    	}
    }
    
    function power($x) {
    return( pow($x) ) ; }
    
    $val = new Validator(3,7, power) ;
    foreach ($val as $key => $value)
    {	print("the square of $key is $value<br>\n") ; }
    Donc, je souhaite utiliser une classe dérivée de Iterator avec la méthode current qui serait un pointeur sur une fonction.
    Ce qui apporterait, je pense, un peu + de souplesse.

    J'ai lu des items sur call_user_func et call_user_func_array mais je ne suis pas sur que cela resolverait mon problème et surtout à supposer que.... je ne vois pas comment utiliser ses 2 functions dans mon exemple...

    Merci à tous pour idées et sugggestions

  2. #2
    Membre éclairé 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
    Par défaut Pointeur sur fonction
    Si je change me méthode current comme suit:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	
    function current() {
    21 ==>	return( call_user_func( $this->function, $this->curr ) ) ;
    }
    Je n'obtiens pas le résultat souhaité et j'ai dans le log PHP:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [30-May-2010 16:43:35] PHP Warning:  pow() expects exactly 2 parameters, 1 given in F:\WebSites\test\ptrfunction.php on line 21
    [30-May-2010 16:43:35] PHP Warning:  pow() expects exactly 2 parameters, 1 given in F:\WebSites\test\ptrfunction.php on line 21
    [30-May-2010 16:43:35] PHP Warning:  pow() expects exactly 2 parameters, 1 given in F:\WebSites\test\ptrfunction.php on line 21
    [30-May-2010 16:43:35] PHP Warning:  pow() expects exactly 2 parameters, 1 given in F:\WebSites\test\ptrfunction.php on line 21
    [30-May-2010 16:43:35] PHP Warning:  pow() expects exactly 2 parameters, 1 given in F:\WebSites\test\ptrfunction.php on line 21
    Suite au prochain n° comme on dit !

  3. #3
    Membre éclairé 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
    Par défaut Pointeur sur fonction
    Cela semble fonctionner comme ceci:

    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
    class Validator implements Iterator
    {	private $curr,$start,$end,$function ;
     
    	function __construct($start ,$end , $function, $param1)
    	{	$this->start 	= $start ;
    		$this->end   	= $end ;
    		$this->function = $function ;	
    		$this->param   = $param1   ;
    		$this->rewind() ;
    	}
     
    	function rewind() {
    		$this->curr = $this->start ;
    	}
     
    	function key() {
    		return($this->curr) ;
    	}
     
    	function current() {
    		return( call_user_func( $this->function, $this->param, $this->curr ) ) ;
    	}
     
    	function next() {
    		if ($this->valid())
    			$this->curr++ ;
    	}
     
    	function valid() {
    		return( ($this->curr <= $this->end) ? true : false ) ; 
    	}
    }
     
    function power($x,$p) {
    return( pow($x,$p) ) ; }
     
    $val = new Validator(3,7, "power" , 3) ;
    foreach ($val as $key => $value)
    {	print("the square of $key is $value<br>\n") ; }
     
    ?>
    ce qui me donne bien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    the square of 3 is 27
    the square of 4 is 81
    the square of 5 is 243
    the square of 6 is 729
    the square of 7 is 2187
    Mais ce n'est pas le carré mais le cube.......

    Y a t'il une meilleure solution ?

  4. #4
    Membre éclairé 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
    Par défaut Pointeur sur fonction
    Mieux ainsi....


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	function current() {
    		$this->array = array($this->curr, $this->param) ;
    		return( call_user_func_array( $this->function, $this->array ) ) ;
    	}
    Donne les résultats attendus mais un peu lourd quand même !

  5. #5
    Membre éclairé 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
    Par défaut Iterator, à quoi cela sert'il ?
    Si je m'en tiens au code suivant:

    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
    <?php
    class Validator implements Iterator
    {	private $curr,$start,$end,$function ;
    
    	function __construct($start ,$end , $function, $param1)
    	{	$this->start 	= $start ;
    		$this->end   	= $end ;
    		$this->function = $function ;	
    		$this->param    = $param1   ;
    		$this->rewind() ;
    	}
    	
    	function rewind() {
    		$this->curr = $this->start ;
    	}
    	
    	function key() {
    		return($this->curr) ;
    	}
    	
    	function current() {
    		return( call_user_func_array( $this->function, array($this->curr, $this->param) ) ) ;
    	}
    	
    	function next() {
    		if ($this->valid())
    			$this->curr++ ;
    	}
    	
    	function valid() {
    		return( ($this->curr <= $this->end) ? true : false ) ; 
    	}
    }
    
    function power($x,$p) {
    return( pow($x,$p) ) ; }
    
    $val = new Validator(3,7, "power" , 2) ;
    /*
    foreach ($val as $key => $value)
    {	print("the square of $key is $value<br>\n") ; }
    */
    ?>
    Dans lequel, j'ai mis le foreach en commmentaire et bien RIEN ne se passe.....

    A quoi peut bien servir de se fatiguer à définir une classe iterator, à quoi celle-ci peut-elle bien servir ???

    Dans l'instanciation de l'object Validitor, je donne les bornes inférieur et supérieur ainsi que le fonction a appliquer...càd exactement la copie conforme du foreach !
    Je ne vois pas l'intérêt de la classe Iterator même si cet exemple est juste pour l'exercice.....

  6. #6
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Implementer l'interface Iterator va juste permettre de customiser le comportement de ton objet lorsque celui-ci est utilisé dans un cadre d'iteration, par exemple un foreach.

    Par défaut, faire un foreach sur un objet va retourner ses propriétés publiques.

    Si tu veux un comportement complètement différent, par exemple ton truc de validator, et bien il faut implémenter l'interface Iterator.

  7. #7
    Membre éclairé 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
    Par défaut Interêt Class Iterator
    Finalement, j'arrive à

    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
    <?php
    class Validator implements Iterator
    {	private $curr,$start,$end,$function ;
     
    	function __construct($start ,$end , $function, $param1)
    	{	$this->start 	= $start ;
    		$this->end   	= $end ;
    		$this->function = $function ;	
    		$this->param    = $param1   ;
    		$this->execute() ;
    	}
     
    	function rewind() {
    		$this->curr = $this->start ;
    	}
     
    	function key() {
    		return($this->curr) ;
    	}
     
    	function current() {
    		return( call_user_func_array( $this->function, array($this->curr, $this->param) ) ) ;
    	}
     
    	function next() {
    		if ($this->valid())
    			$this->curr++ ;
    	}
     
    	function valid() {
    		return( ($this->curr <= $this->end) ? true : false ) ; 
    	}
     
    	function execute() {
    	for ($this->rewind() ; $this->valid() ; $this->next())
    		print("the square of " . $this->curr . " is " . $this->current() . "<br>\n") ;
    	}
    }
     
    function power($x,$p) {
    return( pow($x,$p) ) ; }
     
    $val = new Validator(3,7, "power" , 2) ;
    /*
    foreach ($val as $key => $value)
    {	print("the square of $key is $value<br>\n") ; }
    */
    ?>
    Ce qui est lourd pour cet exemple mais je peux imaginer quelques intérêts....

    Je reste néanmoins non convaincu pour l'instant

  8. #8
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Dans ton exemple, un array_walk me paraitrait plus approprié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function powered($x) {
      print "the square of $x is ".pow($x,2)."<br/>\n";
    }
     
    $arr = range(3,7);
     
    array_walk($arr, "powered");
     
    // avec une func anonyme (php 5.3) et le paramètre paramétré
    $p = 2;
    array_walk($arr, function ($x) use ($p) {
      print "the square of $x is ".pow($x,$p)."<br/>\n";
    });

  9. #9
    Membre éclairé 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
    Par défaut Iterator
    Tu as raison, cela me semble plus simple POUR CET EXEMPLE qui est un peu simple, je le concède.... je faisais juste l'exercice pour apprendre....

    J'ai aussi appris avec ta réponse, merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pointeur de function et methode de classe
    Par LinuxUser dans le forum C++
    Réponses: 22
    Dernier message: 06/07/2015, 15h18
  2. Réponses: 2
    Dernier message: 23/08/2006, 10h42
  3. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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