В чем разница между self::$bar и static::$bar в PHP? [дубликат]
Возможные Дубликаты:
новое я против нового статического
в чем разница между использованием self
и static
в примере ниже?
class Foo
{
protected static $bar = 1234;
public static function instance()
{
echo self::$bar;
echo "n";
echo static::$bar;
}
}
Foo::instance();
производит
1234
1234
2 ответа:
при использовании
self
чтобы обратиться к члену класса, вы ссылаетесь на класс, в котором вы используете ключевое слово. В этом случае, вашFoo
класс определяет защищенное статическое свойство с именем$bar
. Когда вы используетеself
наFoo
класс для ссылки на свойство, вы ссылаетесь на тот же класс.поэтому, если вы пытались использовать
self::$bar
в любом местеFoo
класс аBar
класс с другим значением для свойства, он будет использоватьFoo::$bar
вместоBar::$bar
, что может быть не то, что вы намереваетесь:class Foo { protected static $bar = 1234; } class Bar extends Foo { protected static $bar = 4321; }
при использовании
static
, вы вызываете функцию, называемую позднего статического связывания (введено в PHP 5.3).в приведенном выше сценарии, используя
static
вместоself
в результатеBar::$bar
используется вместоFoo::$bar
, потому что интерпретатор затем принимает во внимание повторное объявление вBar
класса.обычно используется поздняя статика привязки для методов или даже самого класса, а не свойства, поскольку вы не часто повторно объявляете свойства в подклассах; пример использования
static
ключевое слово для вызова конструктора с поздней привязкой можно найти в этом связанном вопросе:новое я против нового статическогооднако, это не исключает использования
static
свойства, а также.
self - refers to the same class whose method the new operation takes place in. static - in PHP 5.3's late static binding refers to whatever class in the hierarchy which you call the method on.
в следующем примере (см. get_called_class ()), класс B наследует оба метода от класса A. Self привязан к A, потому что он определен в реализации метода A, тогда как static привязан к вызываемому классу, несмотря на то, что он также находится в реализации метода A.
class A { public static function get_A() { return new self(); } public static function get_me() { return new static(); } } class B extends A {} echo get_class(B::get_A()); // A echo get_class(B::get_me()); // B echo get_class(A::get_me()); // A