Par exemple, pour Log::getInstance->addTrace(), je suis plus tenté d'utiliser directement quelque chose comme trace::add() en ayant un object qui ne fait que des traces dans les log. J'ai du mal à imaginer ce qui pourrait changer dans une tel fonction.
Cette phrase montre que tu as mal compris l'intérêt du singleton.
Tu le conçois comme une manière aisée d'utiliser une classe, alors que ce n'est pas ça.
Pour reprendre ton exemple, pourquoi utiliser un singleton est utilise, c'est qu'utiliser une seule instance de ton logger va te permettre d'ouvrir le fichier une seule fois, de poser un verrou dessus, puis d'écrire. Tu n'auras pas à ouvrir le fichier en lecture plusieurs fois au cours de ton exécution, contrairement à un trace::log()
Pour ce qui est de l'injection de dépendance, ca reste mystérieux. Je récupère des objets pour utiliser des fonctions, tant que la fonction existe, il n'y a pas d'impact sur le code extérieur à mon object. Que j'utilise une fonction pour récupérer l'objet externe ou une fonction pour envoyer l'objet, j'ai du mal à voir ce que ca change. Pour moi dans un cas, mon objet fait des getinstance() et dans l'autre il faut que je fasse des set après chaque création.
La différence tiens en la maintenabilité de ton code. S'il est gavé de déclaration de classe externe, ce code n'est pas indépendant de cette classe externe.
Exemple :
<?php
class Foo {
protected $logger;
public function __construct()
{
$this->logger = new Logger(); // Si je veux déplacer la classe Foo, il faut que j'emporte la classe Logger
}
}
<?php
class Foo {
protected $logger;
public function __construct()
{
$this->logger = new Logger(); // Si je veux déplacer la classe Foo, il faut que j'emporte la classe Logger.
// De plus, si je veux remplacer ma classe Logger par autre chose, ça représente beaucoup de travail
}
public function setLogger(InterfaceLogger $logger)
{
$this->logger = $logger; // Ici, je n'ai que l'interface à emporter, et si je compte changer ma classe de Log, à partir du moment où elle implémente l'interface, c'est ok
}
}
Est-ce plus clair maintenant ?