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编程开发“虚拟域名”系统
Oct 09 PHP
php 目录遍历、删除 函数的使用介绍
Apr 28 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
Jun 25 PHP
php利用单例模式实现日志处理类库
Feb 10 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
May 09 PHP
php上传文件并存储到mysql数据库的方法
Mar 16 PHP
PHP调用.NET的WebService 简单实例
Mar 27 PHP
ThinkPHP表单数据智能写入create方法实例分析
Sep 27 PHP
PHPCMS手机站伪静态设置详细教程
Feb 06 PHP
thinkphp框架page类与bootstrap分页(美化)
Jun 25 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 PHP
利用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
上海无线电三厂简史修改版
2021/03/01 无线电
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
PHP伪静态Rewrite设置之APACHE篇
2014/07/30 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
JavaScript经典效果集锦
2010/07/06 Javascript
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
javascript中全局对象的parseInt()方法使用介绍
2013/12/19 Javascript
JQuery菜单效果的两个实例讲解(3)
2015/09/17 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
使用vue.js制作分页组件
2016/06/27 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
利用Javascript开发一个二维周视图日历
2017/12/14 Javascript
深入理解Puppeteer的入门教程和实践
2019/03/05 Javascript
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
2019/09/11 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
2018/05/30 Python
html5中JavaScript removeChild 删除所有节点
2014/05/16 HTML / CSS
美国Randolph太阳镜官网:美国制造的飞行员太阳镜和射击眼镜
2018/06/15 全球购物
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
教师自荐书
2013/10/08 职场文书
幼儿园元旦家长感言
2014/02/27 职场文书
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
2014年员工工作总结范文
2014/11/18 职场文书
检讨书模板
2015/01/29 职场文书
荒岛余生观后感
2015/06/09 职场文书
药房管理制度范本
2015/08/06 职场文书
采购员工作总结范文
2015/08/12 职场文书
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android
Python sklearn分类决策树方法详解
2022/09/23 Python