4.0 类常量和静态成员


通过上几篇博客我们了解到,类在实例化对象时,该对象中的成员只被当前对象所有。如果希望在类中定义的成员被所有实例共享。

此时可以使用类常量或静态成员来实现,接下来将针对类常量和静态成员的相关知识进行详给讲解。

4.1 类常量


在类中,有些属性的值不能改变,并且希望被所有对象所共享,例如圆周率,它是个数学常数,在数学物理计算中广泛使用,此时可以将表示圆周率的成员属性定义为常量。类常量在定义时需要使用const关键字来申明。示例代码如下:

 const  PI=3.1415926;  //定义一个常量属性PI

上述示例代码中,使用const关键字来声明常量,常量名前不需要添加$符号,并且在声明的同时必须对其进行初始化工作。为了方便更好地理解类常量,接下来通过一个案例来学习类常量的使用和声明,如例4-8所示,

例4-8

<?php
class MathTool{
const PI = 3.1415926; //定义一个类常量
public function show(){
echo MathTool::PI."<br>"; //通过类名访问
}
public function display(){
echo self::PI."<br>"; //通过self关键字访问
}
}
echo MathTool::PI."<br>"; //在类外部直接访问
$obj = new MathTool(); //实例化一个对象
$obj->show();
$obj->display();
?>

运行结果

在例4-8中,定义了一个类常量P1.由于在类中声明的常量PI是属于类本身而非对象的、所以需要使用范围解析操作符(:)来连接类名和类常量来访问。如果在类的内部访问类常量,还可以使用关键字self来代替类名,最后将常量的值输出。

需要注意的是,在类中定义的常量只能是基本数据类型的值,而且必须是一个定值。不能是变量、类的属性、数学运算的结果或函数调用。类常量一旦设置后就不能改变,如果试图在程序中改变它的值,则会出现错误。且在声明类常量时一定要赋初始值,因为后期没有其他方式为其赋值。

4.2 静态成员


在上一小节学习了类常量,它是属于类的、可以实现类的所有对象共享一份数据。当然在类中使用静态成员也可以达到同样的效果,静态成员被static关键字修饰,它不属于任何对象,只属于类。静态成员包括静态属性和静态方法。接下来分别进行详细讲解。

1.静态属性

有时候。我们希望某此特定的数据在内存中只有一份,并且可以被类的所有实例对象所出享。例如某个学校所有学生共享-一个学校名称,此时完全不必在每个学生对象所古用的内存办间都定又一个字段来存储这个学校名称,可使用静态属性来表示学校名称让所有对象来共享

定义静态属性的语法格式如下:

访问修饰符 static 变量名

在上述语法格式中,static 关键字写在访问修饰符的后面,访问修饰符可以省略,默认为public 为了更好地理解静态属性。接下来通过一个案例来演示,如例4-9所示。

例4-9

 <?php
class Student{
//定义show()方法,输出学生的学校名称
public static $SchoolName="艾利斯顿商学院";
public function show (){
echo "我的学校是:".self::$SchoolName."<br>";
}
}
$stu1=new Student();
$stu2=new Student();
echo "学生1:<br>";
$stu1->show();
echo "学生2:<br>";
$stu2->show();
?>

运行结果

在例4-9中。学生1和学生2的学校都是 艾利斯顿商学院,这是由于在Student类中定又了一个静态字段schoolName. 该字段会被所有Student类的实例共享,因此在调用学生1和学生2的show()方法时,均输出”我的学校是:艾利斯顿商学院

需要注意的是,静态属性是属于类而非对象,所以不能使用“对象->属性”的方式来访问,面应该通过“类名:属性”的方式来访问,如果是在类的内部,还可以使用self关键字代替类名。

2 静态方法

有时我们希望在不创建对象的情况下就可以调用某个方法,也就是使该方法不必和对象绑在一起。要实现这样的效果,可以使用静态方法 静态方法在定义时只需在方法名前加上static关键字,其语法格式如下:

访问修饰符 static 方法名()

静态方法的使用规则和静态属性相同,即通过类名称和范围解析操作符(:)来访问静态方法。接下来通过一个案例来学习静态方法的使用,如例4-10所示。

 <?php
class Student{
//定义show()方法,输出学生的学校名称
public static $schoolName="艾利斯顿商学院";
public static function show (){
echo "我的学校是:".self::$schoolName;
}
}
Student::show();
?>

运行结果

在例4-10中,代码第4行中定又了一个静态属性schoolName. 在第5~ 7行代码中,定又了一个静态方法用来输出学生所在学校的名称。在第9行代码中通过“类名:方法名”的形式调用了Student 类的静态方法,在静态方法中访向了静态属性$SchoolName.通常情况下静态方法是用未操作静态属性的。

注意:在静态方法中,不要使用$this.因力静态方法是属于关的,而$this则是指对象上下文。在静态方法中,一般只对静态属性进行操作。

浅谈PHP面向对象编程(四、类常量和静态成员)的更多相关文章

  1. 浅谈PHP面向对象编程(一、简介)

    传统的面向过程 将要完成的工作,分作若干个步骤,或再细分为子步骤,然后后步骤从前往后一步一步完成,最初达致目标. 现代的面向对象 将要完成的工作拆分为“一个一个对象”的任务(功能),每个对象独自完成自 ...

  2. 浅谈python面向对象编程和面向过程编程的区别

    面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤一步步实现,使用的时候再一个个的依次调用即可. 优点:性能高 缺点:相较于面向对象而言,不易维护,不易复用,不易扩展 适合于小型的项目面向对象 ...

  3. 浅谈PHP面向对象编程(二、基础知识)

    和一些面向对象的语言有所不同,PHP并不是一种纯面向对象的语言,包PIP它支持面向对象的程序设计,并可以用于开发大型的商业程序.因此学好面向对象输程对PHP程序员来说也是至关重要的.本章并针对面向对象 ...

  4. 浅谈PHP面向对象编程(九、设计模式)

    9.0 设计模式 在编写程序时经常会遇到一此典型的问题或需要完成某种特定需求,设计模式就是针对这些问题和需求,在大量的实践中总结和理论化之后优选的代码结构编程风格,以及解决问题的思考方式. 设计模式就 ...

  5. 浅谈PHP面向对象编程(七、抽象类与接口)

    7.0 抽象类与接口 当定义一个类时,常常需要定义一些方法来描述该类的行为特征.但有时这些方法的实现方式是无法确定的,此时就可以使用抽象类和接口. 抽象类和接口用于提高程序的灵活性.抽象类是一种特殊的 ...

  6. 浅谈PHP面向对象编程(八、多态)

    8.0  多态 在设计一个成员方法时,通常希望该方法具备一定的通用性.例如要实现一个动物叫的方法,由于每个动物的叫声是不同的,因此可以在方法中接收-个动物类型的参数的对象当传人猫类对象时就发出猫类的叫 ...

  7. 浅谈PHP面向对象编程(六、自动加载及魔术方法)

    6.0 自动加载及魔术方法  6.1 自动加载 在PHP开发过程中,如果希望从外部引入一个class.通常会使用incluae和requre方法把定义这个class的文件包含进来.但是,在大型的开发项 ...

  8. 浅谈PHP面向对象编程(五、继承)

    5.0 继承 5.1 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使许多事物之间形成一种关系体系 . 例如猫和狗都属于动物,程序中 ...

  9. 浅谈PHP面向对象编程(三、构造方法和析构方法)

    3.0 构造方法和析构方法 从我之前的博客可以发现,实例化一个类的对象后,如果要为这个对象的属性赋值,需要直接访问该对象的属性.如果想要在实例化对象的同时就为这个对象的属性进行赋值,则可以通过构造方法 ...

随机推荐

  1. GNU Autotools的使用方法

    手工写Makefile是一件很有趣的事情,对于比较大型的项目,如果有工具可以代劳,自然是一件好事.在Linux系统开发环境中,GNU Autotools 无疑就充当了这个重要角色.(在Windows系 ...

  2. (一) ffmpeg filter学习-使用流程

    FFMPEG中有一个类库:libavfilter.该类库提供了各种视音频过滤器.之前一直没有怎么使用过这个类库,最近看了一下它的使用说明,发现还是很强大的,有很多现成的filter供使用,完成视频的处 ...

  3. CSDN博客积分规则

    1.博客积分规则 博客积分是CSDN对用户努力的认可和奖励,也是衡量博客水平的重要标准.博客等级也将由博客积分唯一决定.积分规则具体如下: 每发布一篇原创或者翻译文章:可获得10分: 每发布一篇转载文 ...

  4. 【剑指offer12】矩阵中的路径(回朔法),C++实现

    1.题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...

  5. 颜色叠加模式:mix-blend-mode

    文章转自叠加模式 http://www.cgspread.com/3551.html 注释:1.混合模式的数学计算公式,另外还介绍了不透明度.2.这些公式仅适用于RGB图像,对于Lab颜色图像而言,这 ...

  6. js数组简单总结

    1.创建数组var array = new Array();var array = new Array(size);//指定数组的长度var array = new Array(item1,item2 ...

  7. BZOJ3566 SHOI2014 概率充电器 【概率DP】

    BZOJ3566 SHOI2014 概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技术,实现元件与导线能 ...

  8. Page View Controllers

    Page View Controllers You use a page view controller to present content in a page-by-page manner. A ...

  9. A Corrupt Mayor's Performance Art

    Corrupt governors always find ways to get dirty money. Paint something, then sell the worthless pain ...

  10. 【mysql】VS2017 EF使用 mysql

    要在vs2017中能打开mysql的连接,需要安装以下扩展 mysql-connector-net-6.9.9+.msi [这里注意不要下载最新8.x.y版本,有坑]mysql-for-visuals ...