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 相关文章推荐
PHP配置心得包含MYSQL5乱码解决
Nov 20 PHP
PHP中通过ADO调用Access数据库的方法测试不通过
Dec 31 PHP
yii框架中的Url生产问题小结
Jan 16 PHP
PHP不用第三变量交换2个变量的值的解决方法
Jun 02 PHP
php获取网页请求状态程序示例
Jun 17 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
Jul 28 PHP
php通过exif_read_data函数获取图片的exif信息
May 21 PHP
PHP之图片上传类实例代码(加了缩略图)
Jun 30 PHP
PHP验证终端类型是否为手机的简单实例
Feb 07 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
May 09 PHP
Laravel核心解读之异常处理的实践过程
Feb 24 PHP
50个优秀经典PHP算法大集合 附源码
Aug 26 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基于curl重写file_get_contents函数实例
2016/11/08 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
PHP中mysqli_get_server_version()的实例用法
2020/02/03 PHP
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
通过Mootools 1.2来操纵HTML DOM元素
2009/09/15 Javascript
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
jquery制作搜狐快站页面效果示例分享
2014/02/21 Javascript
jQuery自动添加表单项的方法
2015/07/13 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
2018/01/10 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
2020/04/12 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
简单了解JavaScript作用域
2020/07/31 Javascript
python中正则表达式的使用详解
2014/10/17 Python
Python标准库之itertools库的使用方法
2017/09/07 Python
python+mongodb数据抓取详细介绍
2017/10/25 Python
对python 矩阵转置transpose的实例讲解
2018/04/17 Python
python+numpy+matplotalib实现梯度下降法
2018/08/31 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
2019/07/11 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
2020/04/18 Python
Python 实现顺序高斯消元法示例
2019/12/09 Python
pycharm激活码有效到2020年11月底
2020/09/18 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
html svg生成环形进度条的实现方法
2019/09/23 HTML / CSS
迪卡侬比利时官网:Decathlon比利时
2019/12/28 全球购物
ASOS西班牙官网:英国在线时尚和美容零售商
2020/01/10 全球购物
法律系毕业生自荐信范文
2014/03/27 职场文书
护士长竞聘书
2014/03/31 职场文书
婚前协议书范本
2014/04/15 职场文书
2015年教师见习期工作总结
2015/05/20 职场文书
2016全国“质量月”活动标语口号
2015/12/26 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
Win11筛选键导致键盘失灵怎么解决? Win11关闭筛选键的技巧
2022/04/08 数码科技