J'écris une classe PHP et j'ai inclus quelques fonctions statiques pour un accès rapide car elles sont courantes à utiliser et sont simples en fonction. Cependant, ils utilisent un objet en eux pour l'accès à la base de données. Je vais probablement utiliser ces méthodes statiques à partir d'un contexte statique et non statique tout au long de mon code, je souhaite donc être capable de vérifier si la fonction a été appelée à partir d'un contexte statique ou non statique afin de pouvoir éviter de créer un objet en double. Si la fonction a été appelée à partir d'un contexte non statique (cet objet d'instance et celui de la fonction à utiliser statiquement). Est-ce que je peux tester cela dans la fonction afin de pouvoir utiliser l'objet d'instance si la fonction est appelée à partir d'un contexte non statique et crée son propre objet si la fonction est appelée à partir d'un contexte statique?
Code Exemple: P>
class MyClass { private $db; function __constuct(){ $this->db = new DBConnect(); } public static function myFunction(){ if(/* Is static */){ $db = new DBConnect(); } else { $db =& $this->db; } // Do processing with $db, etc. } }
5 Réponses :
Solution 1: Faites le Solution 2: Implémentez un motif singleton sur le côté Dbal. P> $ dB code> variable privé et utilisez-le via un getter. p>
Vous pouvez vérifier l'accès non statique que si vous ne forcez pas la méthode pour être statique uniquement. Laisser le mot clé code> statique code> de la déclaration de fonction et testez avec: (il peut toujours être appelé comme une fonction statique, même si vous ne l'avez pas déclarée comme telle .) p> p>
L'accès statique pas à une fonction sans le mot clé statique ne produit une erreur?
Il génère un avis ou un avertissement E_STRICT (pas sûr de la classification). Au moins dans la version que j'ai. (Ces choses ont tendance à être parfois obsolètes et indépectées.)
Lorsqu'une méthode est déclarée statique, non seulement la variable magique $ ceci indisponible (retourne null), mais c'est impossible à dire si la fonction était effectivement appelé d'un contexte statique. Une backtrace implique que pour un statique méthode, appelant $ objet-> méthode () est traduit intérieurement à Nom de classe :: Méthode () au moment de l'exécution. P> blockQuote>
Merci pour cette Shakti, qui répond à ma question. Je vais devoir créer un objet pour chacune des méthodes statiques en interne si je veux les utiliser à partir d'un contexte statique.
Ou il semble que je puisse simplement déclarer la variable code> db code> comme statique. En utilisant statique privé code> sur quelque chose semble étrange pour moi.
même lorsque vous appelez une méthode statique à partir d'une instance (non recommandée), vous n'avez pas
Accès à $ CU code>, votre classe sera donc fatale.
class sns {
public static function moo() {
var_dump($this->fng);
}
public function goo() {
var_dump($this);
}
}
sns::moo();
$_ = new sns;
$_->moo();
$_->goo();
Bottom Line - Ne faites pas de cours qui ne contiennent que des fonctions statiques. Ce n'est pas un oop, ce n'est que votre ancien code procédural qui masqueurading sous forme de OOP
si vous exécutez des fonctions statiquement, il n'y a pas de $ ceci, car il n'y a pas d'objet.
Vous finirez par faire le qui dit, je voudrais Recommandez de déposer ce modèle et d'écrire quelque chose comme: p> et vous utilisez cette classe comme ceci: p> de cette façon Vous partagez la même connexion avec toutes les classes qui le nécessitent. Et maintenant, la classe db privé db code> une variable statique aussi et utilisez-le comme
auto :: $ db code>. P>
foobar code> n'est pas responsable de la connexion ou de connaître vos coordonnées de connexion. P> p>
5 réponses, pas une uppote pour la question.