Bonjour,

Ce que je fais

Je veux afficher une liste d'éléments sans instancier la classe Calls à l'aide des fonctions statiques. Or, ici je rencontre un pb car lorsque j'essaie de mettre static à ma seconde fonction ci-jointe, mon editeur (PHP STORM) m'indique une erreur au niveau de $this ... Je ne comprends pas et ne trouve pas comment résoudre mon pb. Pourriez-vous s'il vous plait me donner une piste de recherche ?

class Calls
{
    protected $pdo;
    protected $o;

    public function __construct()
    {
        $this->pdo = Database::getPDO();
    }

     public function getCalls(){
     $rest = $this->pdo->prepare(...);
        ...
     }
}

Ce que je veux

class Calls
{
    protected $pdo;
    protected $o;

    public function __construct()
    {
        $this->pdo = Database::getPDO();
    }

     public static function getCalls(){
     $rest = $this->pdo->prepare(...);
        ...
     }
}

Merci d'avance !

9 réponses


Dimtrovich
Réponse acceptée

Salut. Il est impossible d'utiliser le $this à l'intérieur d'une méthode statique.
tu pourra gérer avec ça

class Calls
{
    protected $pdo;
    protected $o;

    protected static $_instance = null;

    protected static function instance()
    {
        if(is_null(self::$_instance)) {
            $class = __CLASS__;
            self::$_instance = new $class();
         }
         return self::$_instance;
      }

    public function __construct()
    {
        $this->pdo = Database::getPDO();
    }

     public static function getCalls(){
        $instance = self::instance();
        $rest = $instance->pdo->prepare(...);
        ...
     }
}

Bonjour.
C'est impossible ce que tu demandes, surtout avec ton code comme ceci.
Car tu instancies PDO seulement au moment ou la classe elle même est instanciée, par conséquent la propriété pdo n'est pas définie au moment où tu utilises la méthode getCalls, si tu n'instancies pas la classe avant.
Je te recommande de regarder : La POO en PHP » Propriétés et Méthodes statiques.

lz699
Auteur

OK. C'est pas grave mais c'est vrai que j'aurai voulu faire comme ceci... Merci
Je vais (re)regarder la vidéo

La question c'est : Quel est le besoin derrière ça ?

Ca peut marcher mais c'est moche :

class Calls
{
    protected static $pdo = null;
    protected $o;

    public static function getPDO()
    {
        if(self::pdo === null)
        {
            self::pdo = Database::getPDO();
        }
        return self::pdo;
    }

     public static function getCalls(){
     $pdo = self::getPDO();
     $rest = $pdo->prepare(...);
        ...
     }
}

Mais comme quenti77 je ne vois pas le besoin.

lz699
Auteur

Bonjour, désolé pour le retard de réponse, le besoin est de pouvoir appeler la fonction, sans instancier la classe avec le new ...
Merci pour vos propositions,

enfin entre

public function __construct()
    {
        $this->pdo = Database::getPDO();
    }

     public static function getCalls(){
     $rest = $this->pdo->prepare(...);
        ...
     }

et

public function __construct()
    {
        $this->pdo = new \PDO();
    }

     public static function getCalls(){
     $rest = $this->pdo->prepare(...);
        ...
     }

je vois pas la différence à écrire mais bon ce n'est que mon avis.

Sinon moi j'ai une classe statique Providers dans laquelle je charge toutes mes différentes connexions, Mysql, SQLServer, AD, ... et là je fais un provider::get('mysql') et j'ai mon pdo.

lz699
Auteur

Bonjour, merci pour vos propositions. C'était pas forcement dans la classe mais plus du côté du front où ça "m'emmerdais" de devoir faire un new quelque chose.

lz699
Auteur

Merci bien pour cette aide si precieuse. Merci