静态成员|学习笔记

简介: 快速学习静态成员

开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第一阶段静态成员】学习笔记,与课程紧密联系,让用户快速学习知识。  

课程地址:https://developer.aliyun.com/learning/course/711/detail/12667


静态成员

 

内容介绍:

一、概念

二、步骤

三、示例

四、小结

 

范围解析操作符是用来实现类直接访问类成员的,类成员里面有类常量,还有静态成员。这节的目标是理解静态成员的概念,掌握静态成员的性质以及访问方式,能够利用静态实现一些高级的或者高速的、高效的访问操作。

 

一、概念

静态成员:使用 static 关键字修饰的类成员,类成员前面不再仅仅局限于访问修饰限定符,表示使用 static 修饰的该成员属于类访问,它是用类来访问的,不是用对象来访问的。

1. PHP 静态成员有两种:静态属性、静态方法。

属性和方法前面加了 static 关键字就应该变成类的东西而不是对象的东西。

2.静态成员是明确用来给类访问的,而不是对象。

3.静态成员只是多了一个 static 关键字修饰。

本身也可以被对象访问,属性和方法只加了一个 static 关键字,表示应该由类来访问,而对象也可以尝试去访问。

4.静态成员使用不同访问修饰限定符限定,效果一致。

 

二、步骤

定义类结构,确定一些成员(属性、方法),如果确定不需要对象访问,直接通过类访问,使用 static 关键字修饰,让它变成静态成员,静态成员最后直接用类进行访问。

 

三、示例

1、静态属性:在类中定义属性的时候使用 static 关键字修饰,比如 public 就是一个普通的属性,但是 public static $count 就是一个静态属性。

class saler{

#属性

public Smoney = 0;

public static $count = 0;   #静态属性

}

这就相当于定义了一个类,有普通属性、静态属性。

<?php

#静态成员

class Saler{

#属性

public $money = 0;

public static $count = 0;  #静态属性

}

首先,定义了类结构,普通的属性和用 static 关键字修饰的属性,想要访问静态属性可以直接使用类名+范围解析操作符+属性名,注意此时它是带$符号的,因为前面没有$符号。

#静态方法

echo Saler:: $count;

image.png

确实访问了,没有报错。受益于范围解析操作符,类直接访问,此时是没有对象的,意味着内存空间不需要额外的支出对象成本,所以效率自然要高。

2、静态方法:在类中定义方法的时候使用 static 关键字修饰,访问的时候使用类+范围解析操作符+静态方法名字()访问

定义一个方法叫做 static 的方法 showClass,里面的内容只是输出这个类名:

#方法

public static function showClass(){

echo __CLASS__;

}

这样就有了一个方法,但是这个方法是静态方法,为了做对比,再做一个普通的方法:

public function showCount(){

echo __METHOD__;

}

这个普通方法只是做一组对比,然后访问静态属性、静态方法,

#静态属性

echo Saler::$count;

#静态方法

Saler::showClass();

image.png

能够访问,再次证明有了静态的东西,类就可以直接访问。

3、在类的内部也可以访问静态成员,同样是使用类名+范围解析操作符+静态属性/静态方法()

比如要在 showClass 方法里增加访问静态属性,

echo Saler:: $count;

image.png

会发现里面又输出了一次0,第一个0是属性静态访问输出的,第二个都在这里面,所以这是可以访问的,类的内部也可以用类名来实现类成员的访问。

4、静态方法本质也是类中定义的方法,它跟普通的方法是存在一块的,所以对象如果想访问也可以进行访问的,但是不建议

#实例化

$s = new Saler();

拿到类的对象后通过对象来访问,

echo $s -> money;

image.png

刷新,没问题。但是

echo $s-> count;

#对象不能访问静态属性

image.png

没有这样的属性,因为这是静态属性,但是用了非静态,用对象来访问,对象可以理解为动态,因为必须要动态的实例化一个对象,所以动态访问是不行的。

只要加了->,系统就认为是要访问普通的,就是对象来访问。

假设要访问方法,

$s->showClass();

#输出0

image.png

能访问,印证了静态方法、普通方法都是存在类里面,对象要访问只要找到类,找到同名的东西就可以去访问

印证了静态的方法或者普通的方法都存在类里,对象要访问只要找到类、同名的东西就可以访问。

echo $s::$count;

#可以访问,但不建议

image.png

可以访问,因为拿到对象后它会找到对象所属的类,然后替换类名。

5、同理,方法也是在类内部,刚刚操作了所有后,会发现忽略了方法 showCount,那对象自然可以访问了,

$s -> showCount();

image.png

可以访问。

要说明因为方法在内部,编译时就存在,因此可以通过类来进行访问,使用范围解析操作符,但是非常不建议,就是禁止(会报错:因为系统认为类来访问的东西就是静态的东西)

#类访问普通方法

Saler::showCount();

image.png

确实也输出了,不要看前面的报错,但是它告诉我们报错了,这不是一个静态方法 showCount,所有就不应该用静态的方式来访问,范围解析操作符属于静态方式,不应该用类直接来访问。

6、如果想用别的东西,比如在方法里用 $this,此时它不能放在里面,静态方法里面不能放$this。

public static function testThis(){

var_ dump($this);

#静态方法中不能使用$this

}

}

image.png

编译时没问题。

Saler::testThis();

 image.png

虽然编译未报错,但此时有一个致命错误,因为 this 不在对象上下文,说明这个上下文是类的上下文,它是给静态的,静态是给类访问的,所以这里不能用$this。

类能够访问静态的,正常,但是类又能够访问普通的方法,这就矛盾,而对象可以访问普通的属性和方法,还可以访问静态方法,还可以使用范围解析操作符访问对应的静态属性,该如何操作?记住类常量静态的属性或者方法是给类访问的,应该由类来访问,而普通的属性和方法应该由对象访问。它们彼此之间有一些交叉,涉及到它们深入的一些交互的问题,比如类与对象是有关系的,彼此可以穿插,但是不会这么去用。

 

四、小结

1.为了保障类能直接访问数据和操作数据,可以在属性和方法前增加 static 关键字变成静态属性和静态方法,证明是专属于类的,就可以用类来访问,这样类的权限和功能变大,有可能不需要依赖对象就可以做东西,可以定义变量来保存数据,定义方法来操纵数据,只要 static 就行。类的东西既然存在类里,那么它就是固定的,不可能做到每个对象都有不同的数据,是有局限的。

2.类通过类名+范围解析操作符+静态成员的方式进行访问,还包括类常量。

3.静态成员也受访问修饰限定符的限定,要确定是在类外面还是在类内部进行访问。

4.对象本质可以无条件访问静态方法,因为方法本身放在一起,所以可以访问,访问里面没有任何不妥,不会产生任何不存在的问题,而类只能访问不带$this 的普通方法(不建议),$this 叫内部对象,对象是别人来访问时指向外部的对象,而类访问时类是可以脱离对象存在的,没有对象时,类也可以直接访问。

5.静态成员是给类访问的,非静态成员是给对象访问的。

(1)静态属性和方法(静态和非静态)都是保存在类结构中(代码段);

(2)普通属性保存在对象生成的对象空间里(堆),而静态属性存在类的空间里,有多少对象就会有多少普通属性,它们之间是彼此无关的,但是不管进行多少静态属性的访问,它都只有一个,类是唯一的。

6.静态成员的访问效率比非静态成员高,因此有种说法是能用静态的时候就不用非静态,尽可能多的使用静态,因为此时没有对象的开销,它能够让内存效率更高。注意对象的特点是多元化,而类的特点也就是静态是单一化,如果做的事情是单一的,尽可能静态,如果做的事情发现不同的对象就不同,那么只能用非静态。

相关文章
|
新零售 人工智能 Cloud Native
【年度重磅】阿里淘系全年技术总结黑皮书,1500页免费下载!
淘系技术将2020一整年的精华内容梳理合并,重磅推出【淘系技术2020技术年货】。在这本书中,你将看到:各技术栈下时新前沿的技术讲解与方法技巧、淘系技术大牛的职场成长经验&学习问答实录、年度精选技术人员必读书单、淘系经典开源项目介绍、2020淘系顶会 paper 全文。
47521 0
【年度重磅】阿里淘系全年技术总结黑皮书,1500页免费下载!
|
NoSQL 数据安全/隐私保护 Android开发
Jlink使用技巧之读取STM32内部的程序
Jlink使用技巧之读取STM32内部的程序
3057 1
Jlink使用技巧之读取STM32内部的程序
|
SQL 弹性计算 关系型数据库
HTAP数据库 PostgreSQL 场景与性能测试之 3.1 - (OLAP) 大表JOIN统计查询-10亿 join 1亿 agg
标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能、性能、架构以及稳定性。 PostgreSQL社区的贡献者众多
2268 0
|
11月前
|
人工智能 自然语言处理 安全
《人工智能与鸿蒙Next携手,开启智慧教育创新之旅》
在数字化时代,人工智能与鸿蒙Next系统的融合为智慧教育带来创新机遇。通过智能学习路径规划、自适应内容推荐、自动作业批改、课堂互动增强等功能,打造个性化学习体验。鸿蒙Next的分布式技术和安全特性确保多设备无缝切换和数据隐私保护。同时,智能资源管理和优质资源共享平台优化教育资源配置,推动教育公平。这一结合为智慧教育注入新活力,助力全面升级。
410 30
|
5月前
|
数据安全/隐私保护 Python
大话西游自动打怪脚本,大话西游抢摊位脚本,刷图刷怪抢元宝工具
完整的游戏刷怪脚本实现,包含多模块功能(怪物生成、波次控制、掉落系统等),使用Python编写
|
10月前
|
算法 机器人 Python
使用Selenium和ChromeDriver模拟用户操作:从表单填写到数据提交
简介:工程师小王和产品经理莉莉面临无人机市场调研投票数据获取难题,传统方法屡遭封禁。小王通过构建“隐身特工”装备——代理IP、随机UserAgent及有效Cookie,结合Python与Selenium技术,成功绕过问卷星的防刷票系统,实现自动化投票。最终,他们获得了看似真人投票的数据,展示了技术攻防的艺术。这段故事不仅是一场技术较量,更是对算法规则游戏的深刻思考。
234 2
使用Selenium和ChromeDriver模拟用户操作:从表单填写到数据提交
|
JavaScript
VUE element-ui之table表格勾选复选框动态合计某列的值
VUE element-ui之table表格勾选复选框动态合计某列的值
949 0
VUE element-ui之table表格勾选复选框动态合计某列的值
|
SQL FESCAR 数据库
SpringCloud之Seata基本介绍与安装
SpringCloud之Seata基本介绍与安装
软著 | 软著申请又一次的保姆及教学
2020年,为我的毕业设计申请了一份软著,随后不久,中国版权中心改版了,但是申请流程差别不大,这次以个人的身份来申请一份软著(个人博客)。
790 0
软著 | 软著申请又一次的保姆及教学
|
Java API Windows