关闭

php面向对象的static关键字

标签: php面向对象class
128人阅读 评论(0) 收藏 举报
分类:

在写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是调用类中的东西与实例化出来的对象无关,所以静态属性是这样调用的。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6209次
    • 积分:230
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    文章分类