php面向对象的static关键字

在写php类的时候总会用到static关键字,也只是知道怎么用,却不知道为什么这么用,最近在看一本讲php面向对象核心知识的书,结合书中的内容和个人的理解谈谈为什么这么使用static。
首先上代码:

  class student
{
    public static $name ="Tom";

    public function staticValue() {
        return self::$name;
    }
}
$tom=new student();
echo $Tom->staticValue();

这样写是没问题的,不知道大家有么有想过为什么要在类里面用self::$name去调用 静态变量而不是$this->name这样子调用。
这就得提到$this,首先稍微讲一下什么是对象,对象是实例化类出来的一组属性的集合但不包含类中的方法(包含指向方法的指针)。而$this 是指向当前对象的指针,意思是$this只能指向所实例化出来的对象的东西。而静态属性存储在单独一块区域(可以把它称作静态数据区,用来存储静态变量和全局变量)。这时候如果用$this去指向静态属性时,由于对象中不存在静态属性,只有在原类中存在,所以会报错。
我们看一下,我先序列化一个没有静态属性的类:

class Foo
{
    public $my_static = 'foo';

    public function staticValue() {
        return $this->my_static;
    }

    $foo = new Foo();
    echo serialize($foo);
    var_dump($foo);
}

返回的是
O:3:"Foo":1:{s:9:"my_static";s:3:"foo";}
object(Foo)[1]
public 'my_static' => string 'foo' (length=3)

而序列化一个有静态属性的类

class Foo
{
    public static $my_static = 'foo';

    public function staticValue() {
        return self::$my_static;
    }
}
$foo = new Foo();
echo serialize($foo);
var_dump($foo);

返回

foo O:3:"Foo":0:{}
object(Foo)[1]

由此可见静态属性并不存在于该对象中,自然$this无法调用。而self是调用类中的东西与实例化出来的对象无关,所以静态属性是这样调用的。

发布了36 篇原创文章 · 获赞 3 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/tyro_blog/article/details/49914677