什么是自:: $吧和静:: $酒吧PHP之间的区别? [重复](What is the diff

2019-06-17 14:02发布

可能重复:
新的自我与新的静态

什么是两者的区别selfstatic在下面的例子吗?

class Foo
{
    protected static $bar = 1234;

    public static function instance()
    {
        echo self::$bar;
        echo "\n";
        echo static::$bar;
    }

}

Foo::instance();

产生

1234
1234

Answer 1:

当您使用self指一类成员,你指的是在其中您使用关键字的类。 在这种情况下,你Foo类定义称为保护静态属性$bar 。 当您使用selfFoo类指的财产,如果引用相同的类。

因此,如果你试图用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与性能以及。



Answer 2:

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.自这两种方法,因为它是在一个的实施方法定义绑定到,而静态的,尽管事实上绑定到调用的类,它也是在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


文章来源: What is the difference between self::$bar and static::$bar in PHP? [duplicate]