PHP peut static:: 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 c'est à côté du point.

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, devrais-je utiliser self:: du tout?

48
demandé sur hakre 2011-01-18 01:59:52

2 réponses

Vous devez vous demander: "Est-ce que je cible le problème avec l'approche adéquate?"

self:: et static:: font deux choses différentes. Par exemple self:: ou __CLASS__ sont des références à la classe actuelle, ainsi définie dans une certaine portée, il ne suffira pas d'appeler static sur forward.

Que se passera - t-il sur 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 va imprimer

A

D'autre part 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();

Ce sera imprimer

B

Qui s'appelle liaison statique tardive en PHP 5.3.0 . Il résout la limitation d'appeler la classe qui était référencée au moment 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 que vous avez besoin d'accéder aux membres parents et enfants, self:: ne suffira pas.

97
répondu DarkThrone 2017-08-23 10:48:08

Essayez d'utiliser le code soufflet pour voir la différence entre auto - 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:

Utiliser la classe Parent_

  • auto => parent
  • statique = > parent

Utilisation de la classe Child_

  • auto => parent
  • statique = > enfant
7
répondu Radouane FADEL 2015-08-30 06:22:22