设为首页 收藏本站
查看: 618|回复: 0

[经验分享] php中的static

[复制链接]

尚未签到

发表于 2015-8-28 08:33:38 | 显示全部楼层 |阅读模式
  静态成员是一种类变量,可以把它看成时属于整个类而不是属于类的某个实例。与一般的实例变量不同的是,静态成员只保留一个变量值,而这个变量值对所有的实例都是有效的,也就是说,所有的实例共享这个成员。
  $this只表示类的当前实例,而 self:: 表示的是类本身,在类之外的代码中不能使用这个操作符,而且它不能识别自己在继承树层次结构中的位置。也就是说,在扩展类中使用self 作用域时,self 可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法。与$this不同的是,在使用静态变量时,必须在作用域限定符后面加上$符号。
  在扩展类中,在基类的方法被重写的情况下,使用 parent 作用域调用定义在基类中的方法。静态成员也可以只属于父类。如果在子类和父类中同时声明了某个成员,也可以使用parant::在子类中访问父类中的变量。在这种情况下,父类的静态成员和子类的静态成员保存的是不同的值。
  可以在 :: 操作符的左边写上类的名称来静态地访问某个成员,这样避免创建类的实例。不仅省略掉实例化类的代码,而且还会更高效,因为类的每个实例都会占用一小部分的系统资源。
  在使用 :: 操作符访问成员变量时,需要再次注意对$符号的使用。因为PHP当前不支持动态的静态变量的使用,也就是说不支持可变的静态变量。在使用$this->$var时,被访问的成员是包含在$var中的变量的值。而不用$符号访问某个变量实际上查找的是类的某个常量,而常量是不能通过$this来访问的。
  PHP6中提出的static::作用域使我们不再需要使用self::和parent::。当希望指向最终的实现功能的类时,就可以使用static::,这个限定符会在代码执行之前立即计算出继承层次机构上最后那个类的成员。之一过程被称为延迟绑定,它使我们可以在子类中重写某个静态变量,并且也可以从某个在父类中声明的函数中反问这个最终成员。
  有时,可能有必要创建供所有类实例共享的字段和方法,这些字段和方法与所有的类实例有关,但不能由任何特定对象调用。例如,假设要编写一个类,跟踪网页访问者的数量。你一定不希望每次实例化该类时都把访问者数量重置为0 ,此时就可以将该字段设置为static作用域:



<?php
class visitors
{
private static $visitors = 0;
function __construct()
{
self::$visitors++;
}
static function getVisitors()
{
return self::$visitors;
}
}
/* Instantiate the visitors class. */
$visits = new visitors();
echo visitors::getVisitors()."<br />";
/* Instantiate another visitors class. */
$visits2 = new visitors();
echo visitors::getVisitors()."<br />";
?>
  
  程序运行结果:
  1
  2
  因为$visitors字段声明为static,所以对其值的任何改变都会反映到所有实例化对象中。还要注意,静态字段和方法应使用self关键字和类名来引用,而不是通过this和箭头操作符。这是因为使用“正常”方法引用静态字段是不可能的,会导致语法错误。
  不能在类中使用$this来引用为static字段。

静态变量
  静态变量是只存在于函数作用域的变量,不过,在函数执行完成后,这种变量的值不会丢失,也就是说,在下一次调用这个函数时,变量仍然会记得原来的值。要将某个变量定义为静态的,只需要在变量前加上 static 关键字即可。
  在类中,static关键字有两种主要用法,一是用来定义静态成员,一是用来定义静态方法。在类的内部,可以使用作用域限定符 (::) 来访问不同层次作用域的变量。

静态方法
  静态方法和非静态方法之间有一个重要的区别:在调用静态方法时,不再需要拥有类的实例。
  静态方法和非静态方法使用原则:一是如果某个方法中不包含$this变量,就应该时静态方法;如果不需要类的实例,可能还应该使用静态类,这样可以免去实例化类的工作。另,在静态方法中时不能使用$this变量的,因为静态方法不属于某个特定的实例。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-105238-1-1.html 上篇帖子: 学习PHP编程语言的一些总结 下篇帖子: 黄聪:Discuz X2.0 SEO:论坛面包屑导航伪静态 去掉面包屑导航forum.php(转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表