POO this dans fonction statique

Default
,

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 !

6 Réponse

17162
,

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.

Default
,

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

45633
,

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

29676
,

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.

Default
,

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,

29676
,

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.