2010-05-19 13 views
6

Así que tienen dos clases de este tipo:PHP dentro de otra clase

class foo { 
    /* code here */ 
} 
$foo = new foo(); 
class bar { 
    global $foo; 
    public function bar() { 
     echo $foo->something(); 
    } 
} 

Quiero tener acceso a los métodos de foo en todos los métodos de barras, sin declarar en cada método en el interior de la barra, así:

class bar { 
    public function bar() { 
     global $foo; 
     echo $foo->something(); 
    } 
    public function barMethod() { 
     global $foo; 
     echo $foo->somethingElse(); 
    } 
    /* etc */ 
} 

No quiero extenderlo tampoco. Intenté usar la palabra clave var, pero no pareció funcionar. ¿Qué debo hacer para acceder a la otra clase "foo" dentro de todos los métodos de la barra?

Respuesta

7

Se podría hacer como esto también:

class bar { 
    private $foo = null; 

    function __construct($foo_instance) { 
     $this->foo = $foo_instance; 
    } 

    public function bar() { 
     echo $this->foo->something(); 
    } 
    public function barMethod() { 
     echo $this->foo->somethingElse(); 
    } 
    /* etc, etc. */ 
} 

Más tarde se podía hacer:

$foo = new foo(); 
$bar = new bar($foo); 
+0

Nunca pensé en pasarlo como parámetro; ahora funciona. ¡Gracias! –

+0

@arxanas: De nada :) – Sarfraz

+3

FYI, eso se conoce como Inyección de Dependencia –

4

Hazlo miembro de la barra. Intenta nunca usar globos globales.

class bar { 
    private $foo; 

    public function __construct($foo) { $this->foo = $foo; } 

    public function barMethod() { 
     echo $this->foo->something(); 
    } 
} 
2

La respuesta corta: No, no hay manera de poner en práctica lo que quiere.

Otra respuesta corta: estás trabajando con las clases de forma "incorrecta". Una vez que haya seleccionado el paradigma orientado a objetos, olvídese de la palabra clave "global".

La forma correcta de hacer lo que desea es crear una instancia de foo como miembro de bar y usar sus métodos. Esto se llama delegation.

0

Una opción es autocargar sus clases. Además, si usted hace su clase de una clase estática, se puede llamar así, sin $classname = new classname():

//Autoloader 
spl_autoload_register(function ($class) { 
$classDir = '/_class/'; 
$classExt = '.php'; 
include $_SERVER['DOCUMENT_ROOT'] . $classDir . $class . $classExt; 
}); 

//Your code 
class bar { 
    private static $foo = null; //to store the class instance 

    public function __construct(){ 
     self::$foo = new foo(); //stores an instance of Foo into the class' property 
    } 

    public function bar() { 
     echo self::$foo->something(); 
    } 
} 

Si convierte su clase (foo) en una clase estática

//Autoloader 
spl_autoload_register(function ($class) { 
$classDir = '/_class/'; 
$classExt = '.php'; 
include $_SERVER['DOCUMENT_ROOT'] . $classDir . $class . $classExt; 
}); 

//Your code 
    class bar { 
     public function bar() { 
      echo foo::something(); 
     } 
    } 
1

Y si su único objetivo es los métodos en sí mismos en oposición a la instancia de otra clase, puede usar x extends y.

class foo { 
    function fooMethod(){ 
    echo 'i am foo'; 
    } 
} 

class bar extends foo { 
    function barMethod(){ 
    echo 'i am bar'; 
    } 
} 

$instance = new bar; 
$instance->fooMethod(); 
Cuestiones relacionadas