PHP Puede static:: reemplazar self::?


Estoy un poco confundido con este asunto. Estoy diseñando una clase OR que intenta comportarse de manera muy similar a ActiveRecord en ruby on rails, pero eso no viene al caso.

Lo que estoy tratando de decir es que mi clase hace un uso extensivo de la herencia de atributos estáticos, especialmente para el manejo de bases de datos y tablas. Mi pregunta es, ¿debo usar self:: at all?

Author: hakre, 2011-01-18

2 answers

Tienes que preguntarte: "¿Estoy enfocando el problema con el enfoque adecuado?"

self:: y static:: hacer dos cosas diferentes. Por ejemplo, self:: o __CLASS__ son referencias a la clase actual, por lo que definida en cierto ámbito NO bastará la necesidad de llamar estática a forward.

¿Qué pasará con la herencia?

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();

Esto imprimirá

A

Por otro lado con static:: Tiene el comportamiento esperado

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();

Esto hará print

B

Que se llama enlace estático tardío en PHP 5.3.0. Resuelve la limitación de llamar a la clase a la que se hace referencia en tiempo de ejecución.

Con eso en mente, creo que ahora puedes ver y resolver el problema adecuadamente. Si está heredando varios miembros estáticos y necesita acceso a los miembros padre e hijo self:: no será suficiente.

 97
Author: DarkThrone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-23 10:48:08

Intenta usar el código de abajo para ver la diferencia entre self y 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();
?>

Y se obtiene este resultado:

Usando la clase Parent_

  • self = > parent
  • static = > parent

Usando la clase Child_

  • self = > parent
  • static = > child
 7
Author: Radouane FADEL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-30 06:22:22