3 votes

Erreur fatale : Utilisation de $this en dehors du contexte de l'objet

Je reçois ce message d'erreur fatal : Using $this when not in object context. Cette classe est configurée comme une bibliothèque dans CodeIgniter.

C'est ma classe :

class My_class {

    function __construct()
    {
            $this->app = base_url('application') . '/cache/';
            if ($this->expire_after == '')
            {
                $this->expire_after = 300;
            }
    }

    static function store($key, $value)
    {
        $key = sha1($key);
        $value = serialize($value);
        file_put_contents( $this->app . $key.'.cache', $value);
    }
}

Je l'initialise via autoload.php . La ligne sur laquelle l'erreur se produit :

file_put_contents( $this->app . $key.'.cache', $value);

Où est mon problème ?

5voto

Simeon Visser Points 30697

Vous ne pouvez pas utiliser $this dans une méthode statique. La variable $this n'est disponible que pour les méthodes de classe, car celles-ci reçoivent l'objet sur lequel la méthode est appelée.

C'est ce que signifie l'expression "hors contexte d'objet" : aucun objet n'est transmis à cette méthode statique parce qu'elle est statique. Une méthode statique fait partie de la classe, et non des objets qui sont instanciés à l'aide de cette classe.

3voto

rjz Points 9046

$this ne sera pas disponible dans une fonction statique. Vous voudrez probablement recréer la fonction $app dans la fonction statique :

static function store($key, $value)
{
    $app = base_url('application') . '/cache/';
    $key = sha1($key);
    $value = serialize($value);
    file_put_contents( $app . $key.'.cache', $value);
}

Je ne sais pas exactement ce que vous essayez de faire dans le contexte général de votre application, mais il se peut que vous n'ayez même pas besoin d'une fonction static en premier lieu.

1voto

amphetamachine Points 7384

Pour être honnête, la store doit être une fonction d'instance (supprimer static ), sinon en utilisant le mot-clé $this à l'intérieur de celui-ci n'aura aucune idée de l'objet auquel il se réfère.

Il est également possible de demander aux objets de transmettre des références à eux-mêmes afin que la fonction statique sache sur quel objet agir : static function store($obj, $key, $value) [...] $obj->app [...]

Ou bien, il suffit de passer le contenu de $obj->app puisque la fonction statique n'a besoin que de cet élément d'information et non de l'accès à l'objet entier :

static function store($app, $key, $value)
{
    $key = sha1($key);
    $value = serialize($value);
    file_put_contents( $app . $key.'.cache', $value);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X