Подтвердить что ты не робот

PHP Может static:: replace self::?

Я немного смущен этим. Я проектирую класс ORM, который пытается вести себя так же, как ActiveRecord в рубине на рельсах, но это рядом с точкой.

Я пытаюсь сказать, что мой класс широко использует статическое наследование атрибутов, особенно для обработки баз данных и таблиц. Мой вопрос в том, должен ли я использовать self:: вообще?

4b9b3361

Ответ 1

Вы должны спросить себя: "Я нацелен на проблему с адекватным подходом?"

self:: и static:: выполняют две разные вещи. Например, self:: или __CLASS__ являются ссылками на текущий класс, поэтому в определенной области он не будет нуждаться в статическом вызове вперед.

Что произойдет при наследовании?

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

Откроется

A

С другой стороны, с static:: Он имеет ожидаемое поведение

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

Откроется

B

Это называется поздняя статическая привязка в PHP 5.3.0. Он решает ограничение вызова класса , указанного во время выполнения.

Имея это в виду, я думаю, что вы теперь можете увидеть и решить проблему адекватно. Если вы наследуете несколько статических членов и нуждаетесь в доступе к родительскому и дочернему элементам, self:: не будет достаточным.

Ответ 2

попробуйте использовать приведенный ниже код, чтобы увидеть разницу между self и 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();
?>

и вы получите этот результат:

, используя класс Parent_

  • self = > parent
  • static = > parent

, используя класс Child_

  • self = > parent
  • static = > child