2017-08-08 1 views
0

Je me demande s'il est possible en PHP de forcer une classe à protéger son constructeur dans le cadre d'un motif de conception. Jusqu'ici, j'ai essayé de l'implémenter avec des interfaces et des classes abstraites, mais cela ne semble pas fonctionner. Je veux que toutes mes classes de service soient des singletons et j'y parviens (dans une certaine mesure) en protégeant le pays. Comment puis-je appliquer cela?Forcer le constructeur protégé en PHP

+1

_Je veux que toutes mes classes de service soient des singletons ... _ Très mauvaise/mauvaise idée ... –

+0

utilise une méthode statique avec une variable protégée? – MacBooc

+0

@bub pourquoi est-ce? –

Répondre

1

Il est possible de protéger un constructeur.

Voici un exemple pour un singleton:

<?php 

class Test { 

    private static $instance = null; 

    protected function __construct() 
    { 
    } 

    public static function getSingleton() 
    { 
     if (self::$instance === null) { 
      self::$instance = new self(); 
     } 

     return self::$instance; 
    } 
} 

// Does work 
$test = Test::getSingleton(); 

// doesn't work 
$test = new Test(); 

Pour "services" utiliser un conteneur d'injection de dépendance. Par exemple, j'utilise une implémentation de conteneur simple, mais il y en a beaucoup plus. http://container.thephpleague.com/2.x/getting-started/

<?php 

interface ExampleServiceInterface { 

} 

class ImplementationA implements ExampleServiceInterface { 

} 

class ImplementationB implements ExampleServiceInterface { 

} 

$container = new League\Container\Container; 

// add a service to the container 
$container->share(ExampleServiceInterface::class, function() { 
    $yourChoice = new ImplementationA(); 
    // configure some stuff? etc 
    return $yourChoice; 
}); 

// retrieve the service from the container 
$service = $container->get(ExampleServiceInterface::class); 

// somewhere else, you will get the same instance 
$service = $container->get(ExampleServiceInterface::class); 
+0

J'utilise juste ce modèle. Cependant, je cherche un moyen de forcer le modèle lui-même, afin que seuls les services de ce modèle puissent être écrits. Avez-vous une idée? –

+0

Connaissez-vous des conteneurs? Je vais ajouter une belle façon de le faire –

+0

Merci beaucoup, cela semble très prometteur et ressemble beaucoup à ce que j'espérais. –

1

vous pouvez le forcer en lançant une exception?

final class Foo { 
    private static $meMyself = null; 
    protected function __construct() { 

     if(!is_null(Foo::$meMyself)) { 
     throw new \Exception("ouch. I'm seeing double"); 
     } 
     // singleton init code 
    } 
} 

mais là contre parle: Les personnes qui l'utilisent auront probablement accès à vos méthodes/code et peuvent juste le changer.