PHP - Crear un nuevo ejemplo de clase dentro de otra clase

  • benwade9721
  • Novice
  • Novice
  • Avatar de Usuario
  • Registrado: Ene 20, 2009
  • Mensajes: 17
  • Status: Offline

Nota Agosto 2nd, 2009, 7:31 am

Hola chicos,

Me pregunto si está bien para crear una instancia nueva clase dentro de la __construct de otra clase???
Traté de mirar para arriba a través de Google oráculo almight y no puede encontrar mucho sobre él...

Código: [ 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. ?>


No estoy seguro de cómo se llame a la function_one () método de Class_One???

¿Alguien tiene los recursos o ideas sobre esto???
I amnt seguro de si su aún puede hacer esto con las clases PHP.

Gracias

Ben Imagen
  • Anonymous
  • Bot
  • No Avatar
  • Registrado: 25 Feb 2008
  • Mensajes: ?
  • Loc: Ozzuland
  • Status: Online

Nota Agosto 2nd, 2009, 7:31 am

  • UPSGuy
  • Lurker ಠ_ಠ
  • Web Master
  • Avatar de Usuario
  • Registrado: Jul 25, 2005
  • Mensajes: 2735
  • Loc: Nashville, TN
  • Status: Offline

Nota Agosto 2nd, 2009, 9:09 am

Youre llamando function_one de class_twos constructor - es que lo que se le preguntaba sobre? Si es así, entonces yo no veo ninguna razón por la que se permita wouldnt. ¿Funcionará como se pretende?
I'd love to change the world, but they won't give me the source code.
  • benwade9721
  • Novice
  • Novice
  • Avatar de Usuario
  • Registrado: Ene 20, 2009
  • Mensajes: 17
  • Status: Offline

Nota Agosto 2nd, 2009, 11:33 am

Hola UPSGuy,

Me puede llamar a la utilización de:

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


¿Hay alguna forma de que me pueden llamar function_one () usando:

$ my_class_two-> function_one ();

en lugar de

$ my_class_two-> new_class_instance-> function_one ();

?

Gracias,
Ben
  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de Usuario
  • Registrado: May 21, 2004
  • Mensajes: 3229
  • Loc: South Africa
  • Status: Offline

Nota Agosto 5th, 2009, 10:39 am

No no puedes hacer menos que declarar que un método / función llamada function_one en Class_Two.
Watch me grow
  • Bogey
  • Bogey
  • Genius
  • Avatar de Usuario
  • Registrado: Jul 14, 2005
  • Mensajes: 8212
  • Loc: USA
  • Status: Offline

Nota Agosto 5th, 2009, 8:18 pm

Usted puede hacer eso
Código: [ 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. ?>

Sus instrumentos o bien se extiende...
"Bring forth therefore fruits meet for repentance:" Matthew 3:8
  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de Usuario
  • Registrado: May 21, 2004
  • Mensajes: 3229
  • Loc: South Africa
  • Status: Offline

Nota Agosto 6th, 2009, 1:34 am

Sí se puede ampliar la clase, pero que no es el contexto de la primera ilustración :)
Watch me grow
  • Bogey
  • Bogey
  • Genius
  • Avatar de Usuario
  • Registrado: Jul 14, 2005
  • Mensajes: 8212
  • Loc: USA
  • Status: Offline

Nota Agosto 6th, 2009, 2:56 pm

Rabid Dog escribió:
Sí se puede ampliar la clase, pero que no es el contexto de la primera ilustración :)

Yo tenía la impresión de que el usuario quiere utilizar una función de otra función sin tener que llamar a dos objetos...esto le permite hacer $ this-> function_that_is_insdide_another_class ()
"Bring forth therefore fruits meet for repentance:" Matthew 3:8
  • spork
  • Brewmaster
  • Silver Member
  • Avatar de Usuario
  • Registrado: Sep 22, 2003
  • Mensajes: 6134
  • Loc: Seattle, WA
  • Status: Offline

Nota Agosto 6th, 2009, 3:48 pm

Sí, pero Bogey theres una diferencia muy grande entre el envasado y la ampliación de otra clase.
The Beer Monocle. Classy.
  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de Usuario
  • Registrado: May 21, 2004
  • Mensajes: 3229
  • Loc: South Africa
  • Status: Offline

Nota Agosto 7th, 2009, 7:42 am

Realmente no puedo ver el propósito de envolver la función para ser honesto. Si la clase X facilita su solicitud a continuación, ¿por qué la clase Y, de facilitar esa petición así?

La única vez que realmente puedo ver el uso de esto es cuando se tiene la clase X con una función definida y la clase Y, que tiene que hacer uso de esa función. O que quiere un tipo de cuadro.

Código: [ 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 Sé que probablemente se habría extendido por una clase para incluir a los saludos múltiples, pero es la forma más sencilla de lo que podía pensar para ilustrar lo que estoy diciendo.

PS es por eso que me encanta interfaces :) Definiciones rígidas :)
Watch me grow
  • IcyDragoon
  • Student
  • Student
  • No Avatar
  • Registrado: Mar 12, 2008
  • Mensajes: 65
  • Status: Offline

Nota Agosto 21st, 2009, 1:10 am

Bueno, todos ustedes no responder a la pregunta...

Su bastante simple en realidad.

Todo lo que necesitas hacer para llamar a una función en una clase es utilizar la resolución de alcance "::" (dos puntos dobles).

Código: [ 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 Usuario
  • Registrado: May 21, 2004
  • Mensajes: 3229
  • Loc: South Africa
  • Status: Offline

Nota Agosto 21st, 2009, 2:26 am

Sí es posible, pero es sólo plan desagradable. Eso es lo que están tratando de señalar. Un poco como si alguien le pregunta cómo volar su cabeza, bastante sencillo de hacer, pero usted no quiere alentar a la misma.
Watch me grow
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13458
  • Loc: Florida
  • Status: Offline

Nota Agosto 21st, 2009, 3:38 am

Yo no iba a participar en este tema, pero parece que call_user_func_array ha convertido en un amortizado y no pueden resistir la oportunidad de usarlo. :)

Código: [ 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. ?>


Código: [ 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 Usuario
  • Registrado: May 21, 2004
  • Mensajes: 3229
  • Loc: South Africa
  • Status: Offline

Nota Agosto 21st, 2009, 4:19 am

OUCH! ¿Dónde está mi 9mm, puede alguien me enseñes a poner un agujero en mi cabeza, porque después de la lectura que estoy seguro de que tienen hemorragias internas!
Watch me grow
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13458
  • Loc: Florida
  • Status: Offline

Nota Agosto 21st, 2009, 4:38 am

Me pregunto cuál es la de rendimiento de la utilización de __call es, para empezar.
Strong with this one, the sudo is.
  • Rabid Dog
  • Web Master
  • Web Master
  • Avatar de Usuario
  • Registrado: May 21, 2004
  • Mensajes: 3229
  • Loc: South Africa
  • Status: Offline

Nota Agosto 21st, 2009, 4:52 am

Probablemente lo mismo que cualquier reflexión, ya que es efectivamente lo que está haciendo
Watch me grow
  • Anonymous
  • Bot
  • No Avatar
  • Registrado: 25 Feb 2008
  • Mensajes: ?
  • Loc: Ozzuland
  • Status: Online

Nota Agosto 21st, 2009, 4:52 am

Publicar Información

  • Total de mensajes en este tema: 16 mensajes
  • Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 163 invitados
  • No puede abrir nuevos temas en este Foro
  • No puede responder a temas en este Foro
  • No puede editar sus mensajes en este Foro
  • No puede borrar sus mensajes en este Foro
  • No puede enviar adjuntos en este Foro
 
 

© 2011 Unmelted, LLC. Ozzu® es una marca registrada de Unmelted, LLC