web-dev-qa-db-fra.com

PHP static :: peut-il remplacer self ::?

Je suis un peu confus avec cette question. Je conçois une classe ORM qui essaie de se comporter de manière très similaire à ActiveRecord dans Ruby on Rails, mais ce n'est pas la question.

Ce que j'essaie de dire, c'est que ma classe utilise largement l'héritage d'attributs statiques, spécialement pour la gestion des bases de données et des tables. Ma question est, dois-je utiliser self :: at all?

52
elite5472

Vous devez vous demander: "Suis-je en train de cibler le problème avec l'approche adéquate?"

self:: et static:: faites deux choses différentes. Par exemple self:: ou __CLASS__ sont des références à la classe actuelle, donc définies dans une certaine portée, cela ne suffira PAS au besoin d'appels statiques en avant.

Qu'arrivera-t-il à l'héritage?

class A {
    public static function className(){
        echo __CLASS__;
    }

    public static function test(){
        self::className();
    }
}

class B extends A{
    public static function className(){
        echo __CLASS__;
    }
}

B::test();

Cela imprimera

A

En revanche avec static:: Il a le comportement attendu

class A {
    public static function className(){
        echo __CLASS__;
    }

    public static function test(){
        static::className();
    }
}

class B extends A{
    public static function className(){
        echo __CLASS__;
    }
}


B::test();

Cela imprimera

B

Cela s'appelle liaison statique tardive dans PHP 5.3. . Il résout la limitation d'appeler la classe qui était référencée lors de l'exécution .

Dans cet esprit, je pense que vous pouvez maintenant voir et résoudre le problème de manière adéquate. Si vous héritez de plusieurs membres statiques et avez besoin d'accéder aux membres parents et enfants self:: ne suffira pas.

104
DarkThrone

essayez d'utiliser le code ci-dessous pour voir la différence entre self et static:

<?php
class Parent_{
    protected static $x = "parent";
    public static function makeTest(){
        echo "self => ".self::$x."<br>";
        echo "static => ".static::$x;       
    }
}

class Child_ extends Parent_{
    protected static $x = "child";
}

echo "<h4>using the Parent_ class</h4>";
Parent_::makeTest();

echo "<br><h4>using the Child_ class</h4>";
Child_::makeTest();
?>

et vous obtenez ce résultat:

en utilisant la classe Parent_

  • soi => parent
  • statique => parent

en utilisant la classe Child_

  • soi => parent
  • statique => enfant
10
Radouane FADEL