php中静态类与静态变量用法的区别分析
本文实例分析了php中静态类与静态变量用法的区别。分享给大家供大家参考。具体分析如下:
static是定义一个静态对象或静态变量,关于static定义的变量或类方法有什么特性我们看完本文章的相关实例后就见分晓了.
1.创建对象$object=newClass(),然后使用”->”调用:$object->attribute/function,前提是该变量/方法可访问.
2.直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以,但是有前提条件.
A.如果是变量,需要该变量可访问.
B.如果是方法,除了该方法可访问外,还需要满足.
①如果是静态方法,没有特殊条件.
②如果是非静态方法,需要改方法中没有使用$this,即没有调用非静态的变量/方法,当然,调用静态的变量/方法没有问题.
然后我们再看一下使用$object->…和使用class::…都有什么区别:
1.使用$object->…,需要执行构造函数创建对象.
2.使用class::…调用静态方法/变量,不需要执行构造函数创建对象.
3.使用class::…调用非静态方法/变量,也不需要执行构造函数创建对象.
然后奇怪的地方就出来了,既然2和3都一样,那静态方法/变量存在还有什么意义呢?
静态static:声明类成员或方法为static,就可以不实例化类而直接访问,不能通过一个对象来访问其中的静态成员(静态方法除外),静态成员属于类,不属于任何对象实例,但类的对象实例都能共享.
例子,代码如下:
<?php
ClassPerson{
//定义静态成员属性
publicstatic$country="中国";
//定义静态成员方法
publicstaticfunctionmyCountry(){
//内部访问静态成员属性
echo"我是".self::$country."人<br/>";
}
}
classStudentextendsPerson{
functionstudy(){
echo"我是".parent::$country."人<br/>";
}
}
//输出成员属性值
echoPerson::$country."<br/>"; //输出:中国
$p1=newPerson();
//echo$p1->country; //错误写法
//访问静态成员方法
Person::myCountry(); //输出:我是中国人
//静态方法也可通过对象访问:
$p1->myCountry();
//子类中输出成员属性值
echoStudent::$country."<br/>";//输出:中国
$t1=newStudent();
$t1->study(); //输出:我是中国人
?>运行该例子,输出:
中国
我是中国人
我是中国人
中国
我是中国人
小结:在类内部访问静态成员属性或者方法,使用self::(注意不是$slef),代码如下:
slef::$country
slef::myCountry()