Je veux créer une classe statique en PHP et la faire se comporter comme elle le fait en C #, donc
- Le constructeur est automatiquement appelé au premier appel de la classe
- Aucune instanciation requise
Quelque chose de ce genre ...
static class Hello {
private static $greeting = 'Hello';
private __construct() {
$greeting .= ' There!';
}
public static greet(){
echo $greeting;
}
}
Hello::greet(); // Hello There!
php
design-patterns
oop
static
Aleemb
la source
la source
Réponses:
Vous pouvez avoir des classes statiques en PHP mais elles n'appellent pas automatiquement le constructeur (si vous essayez d'appeler,
self::__construct()
vous obtiendrez une erreur).Par conséquent, vous devrez créer une
initialize()
fonction et l'appeler dans chaque méthode:la source
Therefore you'd have to create an initialize() function and call it in each method:
il serait plus facile de faireinitialize
une fonction publique et de l'appeler juste après la déclaration de la classe.__callStatic
, vous pourrez voir si elle a été initialisée et faireself::$method
ce que vous appelez. S'il appelle toujours la méthode directement, essayez de tout changer en privé et voyez là.En plus de la réponse de Greg, je recommanderais de définir le constructeur private afin qu'il soit impossible d'instancier la classe.
Donc, à mon humble avis, c'est un exemple plus complet basé sur celui de Greg:
la source
vous pouvez avoir ces classes "statiques". mais je suppose qu'il manque quelque chose de vraiment important: en php, vous n'avez pas de cycle d'application, vous n'obtiendrez donc pas de véritable statique (ou singleton) dans toute votre application ...
voir Singleton en PHP
la source
la structure de b est appelée un gestionnaire singeton, vous pouvez également le faire dans un
c'est l'usage singleton
$a = a::getA(...);
la source
Je préfère généralement écrire des classes non statiques régulières et utiliser une classe factory pour instancier des instances uniques (sudo static) de l'objet.
De cette façon, le constructeur et le destructeur fonctionnent comme d'habitude, et je peux créer des instances non statiques supplémentaires si je le souhaite (par exemple une deuxième connexion DB)
Je l'utilise tout le temps et est particulièrement utile pour créer des gestionnaires de session de magasin de base de données personnalisés, car lorsque la page se termine, le destructeur pousse la session vers la base de données.
Un autre avantage est que vous pouvez ignorer l'ordre dans lequel vous appelez les choses, car tout sera configuré à la demande.
La classe DB ...
Partout où vous voulez l'utiliser, appelez simplement ...
Ensuite, traitez simplement toutes les méthodes comme non statiques (car elles le sont)
la source
l'objet ne peut pas être défini de manière statique mais cela fonctionne
la source