|
|
|
|
Bonjour à tous,
j'ai lu cette article (ce tuto) : http://www.apprendre-php.com/...
Qui explique comment créer une instance unique d'une classe. Je pense avoir saisie comment ça fonction. Mais je vois pas à quoi cela peut servir dans un cas concret.
Ou plutôt qu'est ce que cela peut apporter de créer un objet de ce type dans d'autres classes ?
Merci d'avance de votre éclaircissement.
Il n'y a pas de problèmes, il n'y a que des solutionsConfiguration: vista
Firefox
Salut,
|
Bonsoir,
|
Oui, c'est nécessaire, car en appelant directement le constructeur, tu auras une autre instance de ta classe, ce qui n'a plus aucun intérêt.
|
Ton idée est intéressante ! Qui plus est elle se rapproche de mon type de projet ;)
|
J'avais mit des guillemets justement pour dire que ce n'était pas plusieurs pages au sens réel, mais plusieurs code de pages html mit bout à bout.
|
Oui, c'est pas faux.
Oui, c'est nécessaire, car en appelant directement le constructeur, tu auras une autre instance de ta classe, ce qui n'a plus aucun intérêt. S'il faut mettre en private le constructeur, on ne peux donc pas faire appel à une extension de class ? Exemple class bibi
{
code ...
}
class bobo extends bibi
{
code avec instance ...
}
Il n'y a pas de problèmes, il n'y a que des solutions |
Houa, tu es toujours sur ton PC ! lol
|
L'intéret aussi est de ne pas créer plein d'objet à chaque fois
|
C'est ça, le final empêche la redéfinition de la méthode par une classe enfant.
|
MMM J'ai essayé un truc de ce genre :
class test
{
private function __construct ( )
{
echo "bibi";
}
public function getInstance ( )
{
static $instance;
if ( !isset ( $instance ) )
{
$instance = new test ( );
}
return $instance;
}
}
puis : class test2
{
public function __contruct ( )
{
$var;
}
}
$var = test::getInstance ( );
$val = new test2 ( );
Mais bien sur ça ne marche pas puisque la variable $var n'est pas définie. Pourquoi ? puisque j'ai déclarer la variable par un singleton. Ou alors est ce que ça marche qu'a partir du moment que les classes sont "empilée" ? Il n'y a pas de problèmes, il n'y a que des solutions |
Il faut toujours accéder à ton instance dans ton singleton avec self.
class Test
{
private $qui;
private static $instance;
private function __construct($qui)
{
$this->qui = $qui;
}
public function getInstance($qui)
{
if( !isset(self::$instance) )
self::$instance = new Test($qui);
return self::$instance;
}
public function getQui()
{
return $this->qui . "\n";
}
}
class Test2
{
private $Test;
public function __construct()
{
$this->Test = Test::getInstance(__CLASS__);
}
public function getQui()
{
return $this->Test->getQui();
}
}
//* Dans cet ordre, affichera Externe 2 fois
$Test = Test::getInstance('Externe');
echo $Test->getQui();
$Test2 = new Test2();
echo $Test2->getQui();//*/
// À l'inverse, affichera Test2 2fois
$Test2 = new Test2();
echo $Test2->getQui();
$Test = Test::getInstance('Externe');
echo $Test->getQui(); |
Oui, maintenant je comprends mieux. En faite on pourrait considéré que cette instance, pourrait être une mémoire tampon entre plusieurs classes !
|