读书频道 > 网站 > 网页设计 > PHP编程实战
1.6 类的作用域与静态成员
14-10-31    奋斗的小年轻
收藏    我要投稿   

本文所属图书 > PHP编程实战

本书主要内容包括:PHP 5 3 面向对象编程、PHP 的一些新特性、如何编写基于SQL 和NoSQL 的数据库交互程序、如何使用流行的PHP 相关工具、如何编写社交媒体应用程序,并介绍了NoSQL 数据存储以及为云生态编立即去当当网订购
 
到目前为止,我们一直在讲成员和方法,它们都在对象作用域中定义,并且每个对象有单独的成员和方法。但是也有成员和方法存在于类作用域中,这意味着它们在类的所有对象中通用。我们试图解决的问题如下:怎么才能计算脚本中创建的特定类的对象个数呢?显然,我们需要特定类的一个计数器,而不是特定对象的计数器。变量和方法在类的作用域内,而不在每个对象的作用域内,被叫做静态变量。如代码清单1-12所示。
 
代码清单1-12 静态变量示例
<?php  
class test4 {  
    private static $objcnt;  
    function __construct() {  
        ++self::$objcnt;  
    }  
    function get_objcnt() {  
        return (test4::$objcnt);  
    }  
    function bad() {  
        return($this->objcnt);  
    }  
}  
$x = new test4();  
printf("X: %d object was created\n", $x->get_objcnt());  
$y = new test4();  
printf("Y: %d objects were created\n", $y->get_objcnt());  
print "Let's revisit the variable x:\n";  
printf("X: %d objects were created\n", $x->get_objcnt());  
print "When called as object property, PHP will invent a new member of X...\n";  
printf("and initialize it to:%d\n", $x->bad());  
?>  
 
当执行这个脚本时,输出如下。
X: 1 object was created  
Y: 2 objects were created  
Let's revisit the variable x:  
X: 2 objects were created  
When called as object property, PHP will invent a new member of X...  
and initialize it to:0  
 
变量test4:$objcnt是一个静态变量,存在于类作用域内。创建$y时,它递增到2,$x中也是如此。另一方面,如果尝试把$objcnt作为对象的一个属性访问(就像在bad函数中访问那样),PHP将创造一个新的公共对象属性并称之为objcnt。这么做似乎很复杂。事实上,在类作用域内声明的静态对象与其可见性无关。无论是公共、私有,还是受保护的静态对象,都拥有和正常的方法和成员相同的可见性限制。另外请注意,相同的变量以self::$objcnt构造被调用,同时也可以test4::$ objcnt这样调用。关键字self就是“这个类”的缩写,但它始终是指定义它的类。换句话说,self不会通过继承传递,它保持不变。具体示例如代码清单1-13所示。
 
代码清单1-13 关键字self总是指定义它的类
<?php 
class A { 
    protected static $prop = 2; 
    function __construct() { 
        self::$prop*= 2; 
    } 
    function get_prop() { 
        return (self::$prop); 
    } 
class B extends A { 
    protected static $prop = 3; 
    function __construct() { 
        self::$prop*= 3; 
    } 
    #    function get_prop() { 
    #        return(self::$prop); 
    #    } 
 
$x = new A(); 
$y = new B(); 
printf("A:%d\n", $x->get_prop()); 
printf("B:%d\n", $y->get_prop()); 
?>
 
如果在B类中get_prop函数的代码已被注释掉,两行都会打印出数字4,因为这两个函数将在A类情况下调用。如果在类中get_prop函数没有注释,读取printf("B:%d\n", $y->get_prop());的行将打印9。我个人偏好用合适的类名来调用类变量,可以减少混乱并使代码更具可读性。
 
除了静态成员,也有静态方法,它们也被称为类的上下文class::static_method(...)。重要的是,要注意有没有任何形式的序列化,这是使用者的唯一责任。
点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站