Heim  >  Artikel  >  Backend-Entwicklung  >  PHP面向对象中new self( )和 new static 的区别

PHP面向对象中new self( )和 new static 的区别

高洛峰
高洛峰Original
2016-11-16 11:13:261196Durchsuche

首先阐明结论,在PHP中 self指向定义了当前被调用方法的类, static指向调用当前静态方法的类。

接下来通过一个例子来证明上面的结果

class A 
{
    public static $_a = 'Class A';
 
    public static function echoProperty()
    {
        echo self::$_a . PHP_EOL;
    }
}
 
class B extends A 
{
    public static $_a = 'Class B';
}
 
$obj = new B();
B::echoProperty();//输出 ‘Class A

之所以会这样是因为使用self:: 或者__CLASS__对当前类的静态引用,取决于定义被调用方法所在的类,将上面Class A的方法echoProperty做一下修改变成:

class A 
{
    public static $_a = 'Class A';
 
    public static function echoProperty()
    {
        echo static::$_a . PHP_EOL;
    }
}
//再次调用B::echoProperty将输出   'CLASS B'

为了避免上面第一个例子中看到的子类重写父类的静态属性后,使用继承来的方法仍然访问父类的静态属性, PHP5.3增加了一个新的语法:后期静态绑定(Late static binding), 使用static关键字替代self关键字,使得static指向与get_called_class()返回的相同的类,即当前调用静态方法的类, 该关键字对于静态方法的访问同样有效。

下面的例子更好的说明了new self()和new static()之间的差异(后者使用了PHP的后期静态绑定指向调用方法的当前类)

class A 
{
    public static function get_self() 
    {
        return new self();
    }
 
    public static function get_static() 
    {
        return new static();
    }
}
 
class B extends A {}
 
echo get_class(B::get_self());  // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:PHP的ImageMagick使用;Nächster Artikel:PHP类方法重写原则