PHP self与static区别

this,static和self。

self和this还是很好区分的,可是self和static就很糊涂了,两者都能调用静态的方法和属性,看似使用上没有什么太大的分别,但是实际上分别很大,先来看下面这一段代码:

      class Boo {

          protected static $str = "This is class Boo";

          public static function get_info(){

              echo get_called_class()."<br>";
              echo self::$str;
          }
      }
      class Foo extends Boo{

          protected static $str = "This is class Foo";

      }

       Foo::get_info();

 输出结果:

 

下面我们稍作修改代码:

 

      class Boo {

          protected static $str = "This is class Boo";

          public static function get_info(){

              echo get_called_class()."<br>";
              echo static::$str;
//              echo self::$str;
          }
      }
      class Foo extends Boo{

          protected static $str = "This is class Foo";

      }

       Foo::get_info();

 输出结果:

我们惊奇的发现结果不是我们预期的那样,为什么呢?

php官方也说过,大概意思是说self调用的就是本身代码片段这个类,而static调用的是从堆内存中提取出来,访问的是当前实例化的那个类,那么 static 代表的就是那个类,例子比较容易明白些。

准确说,这是后期静态绑定的功能。后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);

 

posted on 2017-07-17 16:46  会学习的猪  阅读(199)  评论(0编辑  收藏  举报

导航