7
votes

Testez si une fonction est exécutée à partir d'un contexte statique

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.
  }
}


1 commentaires

5 réponses, pas une uppote pour la question.


5 Réponses :


0
votes

Solution 1: Faites le $ dB variable privé et utilisez-le via un getter.

Solution 2: Implémentez un motif singleton sur le côté Dbal.


0 commentaires

3
votes

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é statique de la déclaration de fonction et testez avec: xxx

(il peut toujours être appelé comme une fonction statique, même si vous ne l'avez pas déclarée comme telle .)


2 commentaires

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.)



9
votes

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.

http://php.net/manual/fr/language.oop5.static.php


2 commentaires

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 db comme statique. En utilisant statique privé sur quelque chose semble étrange pour moi.



0
votes

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();


0 commentaires

1
votes

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 db privé db une variable statique aussi et utilisez-le comme auto :: $ db .

qui dit, je voudrais Recommandez de déposer ce modèle et d'écrire quelque chose comme: xxx

et vous utilisez cette classe comme ceci: xxx

de cette façon Vous partagez la même connexion avec toutes les classes qui le nécessitent. Et maintenant, la classe foobar n'est pas responsable de la connexion ou de connaître vos coordonnées de connexion.


0 commentaires