PHP - Créer une nouvelle instance de classe dans une autre classe

  • benwade9721
  • Novice
  • Novice
  • Avatar de l’utilisateur
  • Inscription: Jan 20, 2009
  • Messages: 17
  • Status: Offline

Message Août 2nd, 2009, 7:31 am

Salut les gars,

Je me demandais si il est acceptable de créer une nouvelle instance de classe à l'intérieur du __construct d'une autre classe???
Je l'ai essayé recherchez-vous via le système Google Oracle Almight et ne trouve pas beaucoup en ce...

Code: [ Select ]
<?
class Class_One {
   
    var $name;
   
    function __construct($my_string) {
        $this->name = $my_string;
        echo 'Hello ' . $this->name;
    }
   
    function function_one() {
        echo 'Hello World';
    }
 
}
 
class Class_Two {
 
    function __construct() {
        $new_class_instance = new Class_One('Joan');
    }
}
?>
  1. <?
  2. class Class_One {
  3.    
  4.     var $name;
  5.    
  6.     function __construct($my_string) {
  7.         $this->name = $my_string;
  8.         echo 'Hello ' . $this->name;
  9.     }
  10.    
  11.     function function_one() {
  12.         echo 'Hello World';
  13.     }
  14.  
  15. }
  16.  
  17. class Class_Two {
  18.  
  19.     function __construct() {
  20.         $new_class_instance = new Class_One('Joan');
  21.     }
  22. }
  23. ?>


Je ne sais pas comment appeler ensuite le function_one () de Class_One???

Quelqu'un at-il toutes les ressources / idées à ce sujet???
Je amnt sûr, même si son OK pour le faire avec les classes PHP.

Merci

Ben Image
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Août 2nd, 2009, 7:31 am

  • UPSGuy
  • Lurker ಠ_ಠ
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Juil 25, 2005
  • Messages: 2735
  • Loc: Nashville, TN
  • Status: Offline

Message Août 2nd, 2009, 9:09 am

Votre appel function_one de class_twos constructeur - est que ce que vous vous renseignez sur? Si oui, alors je ne vois aucune raison pour laquelle il wouldnt être autorisée. Sera-t-il fonctionner comme prévu?
I'd love to change the world, but they won't give me the source code.
  • benwade9721
  • Novice
  • Novice
  • Avatar de l’utilisateur
  • Inscription: Jan 20, 2009
  • Messages: 17
  • Status: Offline

Message Août 2nd, 2009, 11:33 am

Salut UPSGuy,

Je peux appeler à l'aide:

$ my_class_two = new Class_Two;
$ my_class_two-> new_class_instance-> function_one ();


Est-il possible que je peux appeler function_one () en utilisant:

$ my_class_two-> function_one ();

au lieu de

$ my_class_two-> new_class_instance-> function_one ();

?

Merci,
Ben
  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Mai 21, 2004
  • Messages: 3229
  • Loc: South Africa
  • Status: Offline

Message Août 5th, 2009, 10:39 am

Non, vous ne pouvez pas le faire sauf si vous déclarer une méthode / fonction appelée function_one dans Class_Two.
Watch me grow
  • Bogey
  • Bogey
  • Genius
  • Avatar de l’utilisateur
  • Inscription: Juil 14, 2005
  • Messages: 8211
  • Loc: USA
  • Status: Offline

Message Août 5th, 2009, 8:18 pm

Vous pouvez le faire
Code: [ Select ]
<?php
class one
{
    function two()
    {
        return 'Blue dog!';
    }
}

class three extends one
{
    function __construct()
    {

    }
}

$class = new three();

$class->two();
?>
  1. <?php
  2. class one
  3. {
  4.     function two()
  5.     {
  6.         return 'Blue dog!';
  7.     }
  8. }
  9. class three extends one
  10. {
  11.     function __construct()
  12.     {
  13.     }
  14. }
  15. $class = new three();
  16. $class->two();
  17. ?>

Son œuvre soit ou étend...
"Bring forth therefore fruits meet for repentance:" Matthew 3:8
  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Mai 21, 2004
  • Messages: 3229
  • Loc: South Africa
  • Status: Offline

Message Août 6th, 2009, 1:34 am

Oui, vous pouvez étendre la classe, mais ce n'est pas le cadre de la première illustration :)
Watch me grow
  • Bogey
  • Bogey
  • Genius
  • Avatar de l’utilisateur
  • Inscription: Juil 14, 2005
  • Messages: 8211
  • Loc: USA
  • Status: Offline

Message Août 6th, 2009, 2:56 pm

Rabid Dog a écrit:
Oui, vous pouvez étendre la classe, mais ce n'est pas le cadre de la première illustration :)

J'avais l'impression de l'utilisateur veut utiliser une fonction à une autre fonction sans avoir à faire deux objets...ce qui vous permet de faire $ this-> function_that_is_insdide_another_class ()
"Bring forth therefore fruits meet for repentance:" Matthew 3:8
  • spork
  • Brewmaster
  • Silver Member
  • Avatar de l’utilisateur
  • Inscription: Sep 22, 2003
  • Messages: 6130
  • Loc: Seattle, WA
  • Status: Offline

Message Août 6th, 2009, 3:48 pm

Oui, mais Bogey theres une très grande différence entre l'emballage et l'extension d'une autre classe.
The Beer Monocle. Classy.
  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Mai 21, 2004
  • Messages: 3229
  • Loc: South Africa
  • Status: Offline

Message Août 7th, 2009, 7:42 am

Je ne vois pas vraiment le but d'envelopper la fonction pour être honnête. Si la classe X facilite votre demande alors pourquoi avoir la classe Y faciliter cette demande ainsi?

La seule fois où je peux vraiment voir une raison à cela est quand vous avez la classe X avec une fonction définie et la classe Y qui doit faire usage de cette fonction. Ça ou vous voulez la case d'un type.

Code: [ Select ]
 
public class ClassOne{
  public void SayHello(String name){
    Console.WriteLine(this.GetHello(name));
  }
 
  public String GetHello(String name){
    return String.Format("Hello: {0}",name);
  }
}
 
public class ClassTwo{
  private ClassOne _classOne = new ClassOne();
  public void SayHelloAndGreeting(String name, String greeting){
    Console.WriteLine(GetHelloAndGreeting(name, greeting));
  }
 
  public String GetHelloAndGreeting(String name, String greeting){
   return String.Format("{0} - {1}", _classOne.GetHello(name), greeting);
  }
  public ClassOne ClassOneInstance{get{return _classOne;}}
}
 
//Usage
public static void Main(String[] args){
  ClassTwo classTwo = new ClassTwo();
  classTwo.SayHelloAndGreeting("Jimmini Cricket", "Just greeting you");
  classTwo.ClassOneInstance.SayHello("Jimmini Cricket");
}
 
  1.  
  2. public class ClassOne{
  3.   public void SayHello(String name){
  4.     Console.WriteLine(this.GetHello(name));
  5.   }
  6.  
  7.   public String GetHello(String name){
  8.     return String.Format("Hello: {0}",name);
  9.   }
  10. }
  11.  
  12. public class ClassTwo{
  13.   private ClassOne _classOne = new ClassOne();
  14.   public void SayHelloAndGreeting(String name, String greeting){
  15.     Console.WriteLine(GetHelloAndGreeting(name, greeting));
  16.   }
  17.  
  18.   public String GetHelloAndGreeting(String name, String greeting){
  19.    return String.Format("{0} - {1}", _classOne.GetHello(name), greeting);
  20.   }
  21.   public ClassOne ClassOneInstance{get{return _classOne;}}
  22. }
  23.  
  24. //Usage
  25. public static void Main(String[] args){
  26.   ClassTwo classTwo = new ClassTwo();
  27.   classTwo.SayHelloAndGreeting("Jimmini Cricket", "Just greeting you");
  28.   classTwo.ClassOneInstance.SayHello("Jimmini Cricket");
  29. }
  30.  


Ok je sais que vous avez sans doute aurait étendu la classe qui comprend les salutations multiples, mais c'est la plus simple façon, je pouvais penser pour illustrer ce que je this.

PS C'est pour cette raison que j'aime les interfaces :) Définitions rigides :)
Watch me grow
  • IcyDragoon
  • Student
  • Student
  • No Avatar
  • Inscription: Mar 12, 2008
  • Messages: 65
  • Status: Offline

Message Août 21st, 2009, 1:10 am

Bon, tout ce que vous les gars ne parvient pas à répondre à la question...

Ses assez simple en fait.

Tout ce que vous devez faire pour appeler une fonction dans une classe est d'utiliser la résolution de portée "::" (deux points doubles).

Code: [ Select ]
<?php
class Class_One {
   
    var $name;
   
    function __construct($my_string) {
        $this->name = $my_string;
        echo 'Hello ' . $this->name;
    }
   
    function function_one() {
        echo 'Hello World';
    }
 
}
 
class Class_Two {
 
    function __construct() {
        //$new_class_instance = new Class_One('Joan');
        Class_One::function_one();
    }
   
    function haha() {
        Class_One::function_one();
    }
}
$Test = new Class_Two(); //in constructor
$Test->haha(); // in method, you can name it function_one if you want
Class_One::function_one(); //this works also =)
?>
  1. <?php
  2. class Class_One {
  3.    
  4.     var $name;
  5.    
  6.     function __construct($my_string) {
  7.         $this->name = $my_string;
  8.         echo 'Hello ' . $this->name;
  9.     }
  10.    
  11.     function function_one() {
  12.         echo 'Hello World';
  13.     }
  14.  
  15. }
  16.  
  17. class Class_Two {
  18.  
  19.     function __construct() {
  20.         //$new_class_instance = new Class_One('Joan');
  21.         Class_One::function_one();
  22.     }
  23.    
  24.     function haha() {
  25.         Class_One::function_one();
  26.     }
  27. }
  28. $Test = new Class_Two(); //in constructor
  29. $Test->haha(); // in method, you can name it function_one if you want
  30. Class_One::function_one(); //this works also =)
  31. ?>
  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Mai 21, 2004
  • Messages: 3229
  • Loc: South Africa
  • Status: Offline

Message Août 21st, 2009, 2:26 am

Oui c'est possible mais il est tout méchant plan. C'est ce que nous avons essayé de le souligner. Un peu comme si quelqu'un vous demande comment faire sauter leur tête, assez simple à faire, mais vous ne voulez pas de l'encourager.
Watch me grow
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Août 21st, 2009, 3:38 am

Je n'allais pas à s'impliquer dans ce sujet, mais il semble que call_user_func_array a devenir un amorti et ne peut pas résister à l'occasion de l'utiliser. :)

Code: [ Select ]
<?php
 
/*
    Utility class #1
*/
class hammer
{
    public function bang(){
        echo 'Bang! ';
        return;
    }
    public function pry(){
        echo 'Pry! ';
        return;
    }
}
 
/*
    Utility class #2
*/
class screwdriver
{
    public function loosen(){
        echo 'Loosen! ';
        return;
    }
    public function tighten(){
        echo 'Tighten! ';
        return;
    }
}
 
/*
    Implementer of utility classes
*/
class handyman
{
    /*
        A place to keep our utilities
    */
    public $toolbelt = array();
 
    public function __construct($tools = array())
    {
        foreach($tools as $tool)
        {
            /*
                http://www.php.net/get_class
                Make sure we only have one of any given tool, does not _have_ to be this way
            */
            $this->toolbelt[get_class($tool)] = $tool;
        }
        return $this;
    }
 
    /*
        http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods
    */
    public function __call($method_name, $args)
    {
        foreach($this->toolbelt as $tool)
        {
            /*
                http://www.php.net/is_callable
                See if the utility object has a callable method matching the one asked for
            */
            if(is_callable(array($tool, $method_name)))
            {
                /*
                    http://www.php.net/call_user_func_array
                    Forward the method call to the utility object along with the arguments
                */
                return call_user_func_array(array($tool, $method_name), $args);
            }
        }
        /*
            http://www.php.net/trigger_error
        */
        trigger_error("Do not have a tool that can $method_name!", E_USER_ERROR);
    }
}
 
$me = new handyman(array(new hammer(), new screwdriver()));
 
$me->bang();
$me->pry();
$me->tighten();
$me->loosen();
$me->gitrdone();
 
?>
  1. <?php
  2.  
  3. /*
  4.     Utility class #1
  5. */
  6. class hammer
  7. {
  8.     public function bang(){
  9.         echo 'Bang! ';
  10.         return;
  11.     }
  12.     public function pry(){
  13.         echo 'Pry! ';
  14.         return;
  15.     }
  16. }
  17.  
  18. /*
  19.     Utility class #2
  20. */
  21. class screwdriver
  22. {
  23.     public function loosen(){
  24.         echo 'Loosen! ';
  25.         return;
  26.     }
  27.     public function tighten(){
  28.         echo 'Tighten! ';
  29.         return;
  30.     }
  31. }
  32.  
  33. /*
  34.     Implementer of utility classes
  35. */
  36. class handyman
  37. {
  38.     /*
  39.         A place to keep our utilities
  40.     */
  41.     public $toolbelt = array();
  42.  
  43.     public function __construct($tools = array())
  44.     {
  45.         foreach($tools as $tool)
  46.         {
  47.             /*
  48.                 http://www.php.net/get_class
  49.                 Make sure we only have one of any given tool, does not _have_ to be this way
  50.             */
  51.             $this->toolbelt[get_class($tool)] = $tool;
  52.         }
  53.         return $this;
  54.     }
  55.  
  56.     /*
  57.         http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods
  58.     */
  59.     public function __call($method_name, $args)
  60.     {
  61.         foreach($this->toolbelt as $tool)
  62.         {
  63.             /*
  64.                 http://www.php.net/is_callable
  65.                 See if the utility object has a callable method matching the one asked for
  66.             */
  67.             if(is_callable(array($tool, $method_name)))
  68.             {
  69.                 /*
  70.                     http://www.php.net/call_user_func_array
  71.                     Forward the method call to the utility object along with the arguments
  72.                 */
  73.                 return call_user_func_array(array($tool, $method_name), $args);
  74.             }
  75.         }
  76.         /*
  77.             http://www.php.net/trigger_error
  78.         */
  79.         trigger_error("Do not have a tool that can $method_name!", E_USER_ERROR);
  80.     }
  81. }
  82.  
  83. $me = new handyman(array(new hammer(), new screwdriver()));
  84.  
  85. $me->bang();
  86. $me->pry();
  87. $me->tighten();
  88. $me->loosen();
  89. $me->gitrdone();
  90.  
  91. ?>


Code: [ Select ]
joebert@home:~/Desktop$ php -f _.php
Bang! Pry! Tighten! Loosen!
Fatal error: Do not have a tool that can gitrdone! in /_.php on line 79
  1. joebert@home:~/Desktop$ php -f _.php
  2. Bang! Pry! Tighten! Loosen!
  3. Fatal error: Do not have a tool that can gitrdone! in /_.php on line 79
Strong with this one, the sudo is.
  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Mai 21, 2004
  • Messages: 3229
  • Loc: South Africa
  • Status: Offline

Message Août 21st, 2009, 4:19 am

OUCH! Où est mon 9mm, quelqu'un peut me montrer comment faire un trou dans ma tête, parce que, après la lecture que je suis sûr que j'ai une hémorragie interne!
Watch me grow
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Août 21st, 2009, 4:38 am

Je me demande ce que le succès de la performance en utilisant __call est, pour commencer.
Strong with this one, the sudo is.
  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de l’utilisateur
  • Inscription: Mai 21, 2004
  • Messages: 3229
  • Loc: South Africa
  • Status: Offline

Message Août 21st, 2009, 4:52 am

Probablement le même que toute réflexion, parce que c'est effectivement ce qu'il fait
Watch me grow
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Août 21st, 2009, 4:52 am

Afficher de l'information

  • Total des messages de ce sujet: 16 messages
  • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 150 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC