2009-06-19 8 views
0

J'ai une classe qui initie une autre classe, je ne suis pas concerné par une référence à l'objet, je n'ai besoin que de la méthode et je dois passer de nouveaux paramètres.initiation de classe avec php

class A { 
    __set ..... 
} 

class B extends A { 
    $anotherA = new A; 
    $anotherA->myName = 'stackoverflow'; 
} 

Bref je voudrais avoir étendre la classe B A, init une nouvelle instance de A, mais je ne veux pas avoir à taper « nouveau » à chaque fois, je l'ai vu la syntaxe suivante:

B::A // something like that 

mais je ne sais pas si comment l'utiliser ou si cela ferait ce que je suis en train de faire?

Répondre

0

Je voudrais créer l'instance de A dans le constructeur de B, alors vous pouvez instancier B en utilisant soit son constructeur ou B::create() statique, qui agit comme un raccourci. Vous pouvez rendre le constructeur privé si vous voulez que toutes les instanciations passent par create().

class A { 
    // __set ..... 
} 

class B extends A { 
    public function __construct() { 
     parent::__construct(); 
     $anotherA = new A; 
     $anotherA->myName = 'stackoverflow'; 
    } 

    public static function create() { 
     return new self(); 
    } 
} 


new B(); 
B::create(); 
0

Puisque vous étendez A dans B, vous pouvez appeler la méthode de la classe A:

class B extends A { 
    public function someMethod() { 
     parent::someMethodName(); 
    } 
} 

Sinon, vous pouvez créer une méthode statique dans la classe:

class A { 
    public static function someStaticMethod() { ... } 
} 

A::someStaticMethod(); 

Si vous avez vraiment voulez une nouvelle instance de A, vous devez utiliser l'opérateur new. C'est pour ça.

2

Ce que vous pouvez faire est de définir une méthode statique sur la classe qui retourne la nouvelle instance. C'est fondamentalement un "raccourci", mais il fait exactement la même chose en arrière-plan.

class C { 
    public static function instance() 
    { 
     return new C(); 
    } 

    public function instanceMethod() 
    { 
     echo 'Hello World!'; 
    } 
} 

Maintenant, vous pouvez l'appeler comme:

C::instance()->instanceMethod(); 
+0

C'est une approche viable, mais je ne vois pas comment cela est mieux que d'utiliser 'new', à moins qu'il est censé être un singleton ou un raccourci tel que Doctrine_Query :: create() -> ... –

+0

Parfois, vous voulez récupérer les instances suivantes statiquement et la seule façon de le faire en PHP <5.3 est d'utiliser une méthode d'usine comme celle-ci, ou en redéfinissant les méthodes d'usine dans les descendants. –

1

Voici quelques exemples de fonctions statiques - ils peuvent être appelés sans utiliser « nouvelle A » ou «B nouveau.

class A { 
    static function message($msg = 'I am Alpha') { 
     echo "hi there, $msg\n"; 
    } 
} 

class B { 
    static function message() { 
     A::message("I am Beta"); 
    } 
} 

A::message(); 
B::message(); 
Questions connexes