php中静态类与静态变量用法的区别分析


Posted in PHP onJanuary 15, 2015

本文实例分析了php中静态类与静态变量用法的区别。分享给大家供大家参考。具体分析如下:

static是定义一个静态对象或静态变量,关于static 定义的变量或类方法有什么特性我们看完本文章的相关实例后就见分晓了.

1. 创建对象$object = new Class(),然后使用”->”调用:$object->attribute/function,前提是该变量/方法可访问.

2. 直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以,但是有前提条件.

A. 如果是变量,需要该变量可访问.

B. 如果是方法,除了该方法可访问外,还需要满足.

① 如果是静态方法,没有特殊条件.

② 如果是非静态方法,需要改方法中没有使用$this,即没有调用非静态的变量/方法,当然,调用静态的变量/方法没有问题.

然后我们再看一下使用$object->… 和使用class::… 都有什么区别:

1. 使用$object->… ,需要执行构造函数创建对象.

2. 使用class::… 调用静态方法/变量,不需要执行构造函数创建对象.

3. 使用class::… 调用非静态方法/变量,也不需要执行构造函数创建对象.

然后奇怪的地方就出来了,既然2和3都一样,那静态方法/变量存在还有什么意义呢?

静态static:声明类成员或方法为 static,就可以不实例化类而直接访问,不能通过一个对象来访问其中的静态成员(静态方法除外),静态成员属于类,不属于任何对象实例,但类的对象实例都能共享.

例子,代码如下:

<?php 

Class Person{ 

    // 定义静态成员属性 

    public static $country = "中国"; 

    // 定义静态成员方法 

    public static function myCountry() { 

        // 内部访问静态成员属性 

        echo "我是".self::$country."人<br />"; 

    } 

} 

class Student extends Person { 

    function study() { 

        echo "我是". parent::$country."人<br />"; 

    } 

} 

// 输出成员属性值 

echo Person::$country."<br />";  // 输出:中国 

$p1 = new Person(); 

//echo $p1->country;   // 错误写法 

// 访问静态成员方法 

Person::myCountry();   // 输出:我是中国人 

// 静态方法也可通过对象访问: 

$p1->myCountry(); 

 

// 子类中输出成员属性值 

echo Student::$country."<br />"; // 输出:中国 

$t1 = new Student(); 

$t1->study();    // 输出:我是中国人 

?>

运行该例子,输出:
中国
我是中国人
我是中国人
中国
我是中国人

小结:在类内部访问静态成员属性或者方法,使用 self::(注意不是 $slef),代码如下:

slef:: $country
slef:: myCountry()

在子类访问父类静态成员属性或方法,使用 parent::(注意不是 $parent),代码如下:

parent:: $country
parent:: myCountry()

外部访问静态成员属性和方法为 类名/子类名::,代码如下:

Person::$country
Person::myCountry()
Student::$country

但静态方法也可以通过普通对象的方式访问.
例子,声明静态变量,代码如下:

<?PHP 

   function foo(){ 

   static $int = 0;// correct 

   static $int = 1+2;   // wrong (as it is an expression) 

   static $int = sqrt(121); // wrong (as it is an expression too) 

   $int++; 

   echo $int; 

   } 

?>

例子,使用静态变量的例子,代码如下:
<?PHP 

   function Test() 

   { 

   static $w3sky = 0; 

   echo $w3sky; 

   $w3sky++; 

   } 

?>

现在,每次调用 Test() 函数都会输出 $w3sky 的值并加一.

静态变量也提供了一种处理递归函数的方法,递归函数是一种调用自己的函数,写递归函数时要小心,因为可能会无穷递归下去,必须确保有充分的方法来中止递归,一下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止.

例子,静态变量与递归函数,代码如下:

<?PHP 

   function Test() 

   { 

   static $count = 0; 

    

   $count++; 

   echo $count; 

   if ($count < 10) { 

   Test(); 

   } 

   $count--; 

   } 

?>

注:静态变量可以按照上面的例子声明,如果在声明中用表达式的结果对其赋值会导致解析错误.

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
收集的DedeCMS一些使用经验
Mar 17 PHP
一篇有意思的技术文章php介绍篇
Oct 26 PHP
PHP中extract()函数的定义和用法
Aug 17 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
Jul 03 PHP
php函数指定默认值方法的小例子
Dec 04 PHP
PHP jQuery表单,带验证具体实现方法
Feb 15 PHP
php文件读取方法实例分析
Jun 20 PHP
PHP实现生成唯一会员卡号
Aug 24 PHP
实现PHP搜索加分页
Oct 12 PHP
Yii框架中sphinx索引配置方法解析
Oct 18 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
Mar 15 PHP
将FCKeditor导入PHP+SMARTY的实现方法
Jan 15 #PHP
php通过Chianz.com获取IP地址与地区的方法
Jan 14 #PHP
php中JSON的使用与转换
Jan 14 #PHP
php rsa加密解密使用详解
Jan 14 #PHP
ThinkPHP 404页面的设置方法
Jan 14 #PHP
THINKPHP内容分页代码分享
Jan 14 #PHP
php+mysql删除指定编号员工信息的方法
Jan 14 #PHP
You might like
PHP 和 MySQL 基础教程(四)
2006/10/09 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
php算法实例分享
2015/07/14 PHP
PHP基于socket实现客户端和服务端通讯功能
2017/07/13 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
js动态创建表格,删除行列的小例子
2013/07/20 Javascript
jquery实现div拖拽宽度示例代码
2013/07/31 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
2016/02/19 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
2017/07/31 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
python数据结构之二叉树的遍历实例
2014/04/29 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
Anaconda的安装及其环境变量的配置详解
2020/04/22 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
2021/01/06 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
2021/02/16 Python
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
毕业生的自我鉴定该怎么写
2013/12/02 职场文书
高中毕业自我鉴定
2013/12/19 职场文书
人事主管岗位职责
2014/01/30 职场文书
绿化工程实施方案
2014/03/17 职场文书
党课培训心得体会
2014/09/02 职场文书
公务员年度个人总结
2015/02/12 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
Python语言规范之Pylint的详细用法
2021/06/24 Python