Self 关键字|学习笔记

简介: 快速学习 Self 关键字

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

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


Self 关键字

 

内容介绍:

一、概念

二、步骤

三、示例

四、小结

 

类可以使用范围解析操作符去访问类成员,$this 可以在类的方法内部代表当前外部来访的对象,从而不需要知道外部对象的名字是什么。如果要在类里面来访问类成员,使用类来访问就必须使用类名,假设类名改了怎么办,本节学习的 Self 关键字就能解决这个问题。本节目标是了解 Self 关键字的作用和应用场景。

 

一、概念

self 关键字:在类的内部(方法里面)使用,代替类名的写法。

self 如同$this 代表内部对象一样,能够在方法内部代替当前类名;

能够保障用户方便修改类名字,有保护类的内部结构的作用,比如修改类名时内部结构是不需要修改的;

self 关键字是代替类名,所以需要配合范围解析操作符::来实现类成员的访问,通常是静态成员和类常量。

 

二、步骤

1、定义类结构

2、在内部可以发现定义的方法里需要进行类成员的访问,类成员通常是类常量、静态成员

3、使用 self 关键字代替访问(此处不改也可,它只是提供一种机制)

 

三、示例

1、self 是用来代替类名的,与范围解析操作符::一起使用的

<?php

#self 关键字

class saler{

#静态属性

private static $count = 0;   #私有,不允许外部直接访问

#静态方法

public static function showClass(){

echo Saler::$count;

echo self::$count; #代替类名

}

}

Saler::showClass();

定义类中有静态属性以及静态方法,静态方法为了访问静态属性,想要访问类在外部触发静态方法即可。image.png

实现了访问,具体的业务有更多的现实的业务意义或者更加复杂的逻辑来解决它。但此时如果类名由 Saler 改为 Buyer,找到使用类的地方去修改,会告诉内部出问题。image.png

因为内部用了 Saler,内部还要改里面的才能解决问题。

假设用的是 self 关键字,

image.png

说明 self 访问到了$count,优势在于如果改了类名。也改了外部调用的地方,但是没有动类的内部,类的内部的完整性和一致性是得到保护的,此时 self 能够很好的去解决这个问题,这就是 self 的价值。

2、self 也可以在类的内部方便实例化对象,实例化对象需要另一个类名,比如构造方法私有化之后,就没有办法在类的外部实例化对象,此时可以在类的内部进行对象实例化。

<?php

#self 关键字

class Saler{

#静态属性

private static $count = 0;#私有,不允许外部直接访问

#静态方法

public static function showClass(){

#echo Saler::$count;

echo self::$count;#代替类名

}

#私有化构造方法

private function_ construct(){}

}//有必要可以初始化,但此时以业务为主

#Saler::showClass();

#实例化对象

new Saler();

image.png

系统显示这种构造方法不能调用,因为创建的对象调用一个私有的方法,在类的外部,不让调用,所以这种方式解决不了问题。为解决这种问题,在类的内部提供静态方法(静态方法不需要对象就可以直接访问),实现对象实例化。

#提供静态方法:实现对象实例化

public static function getInstance(){

return new Saler();

}

这样做意义在于可以控制对象的生产,在外部可以无限 new saler ,这里可以用逻辑控制。此时外部不再是实例化对象,而是获取实例,用 saler::getInstance()方法就可以得到一个对象,刷新后得到 saler 类的对象。

#获取实例

$s = Saler::getInstance();

var_ dump($s);

image.png

这个问题同样面临一个新的问题,比如类名修改之后 new sale()又要报错,此时可以使用 self 代替类名进行内部实例化。

#可以使用 self 代替类名进行内部实例化

return new self();

image.png

没有报任何错误,而且得到的依然是个对象,说明 self new 的过程中确实 new 了 saler,此时想改类名,会发现真正要改的只是类名和外部使用类的地方,真正类的内部结构是不需要任何修改,它就代表 Buyer。这就是 self 很特殊的意义,它能够代表类名,让类名实现修改。

image.png

 

四、小结

1、self 是一种内部用来代替类名的关键字。

2、self 可以用来访问静态成员。

3、self 也可以在类内部用来实例化对象,前提是要在类的内部实例化。

4、self 的特殊意义,可以帮助类名修改时,不用修改任何类的内部结构,虽然内部用了类,但是外部修改类名的时候根本不需要修改内部结构,保证内部结构是统一的、完整的,因为在做面向对象开发的时候有一个开闭原则,对外是开放的,但是对内修改通常是不允许修改的,这样才能保证类的真正的实用性,而不会被外部改变这种逻辑,也不需要在维护代码的时候改了这个还要改那个,改了外面还要改里面,这就是 self 关键字的应用和作用。

相关文章
|
6月前
|
JavaScript 前端开发 Java
实现方法打印a=100,b=200的示例
以上就是如何在不同编程环境下实现方法来打印a=100, b=200。希望这些示例能帮助大家更好地理解并掌握各自所用编程环境下实现该功能所需知识点,并能够灵活运用于各类场景中。
145 21
|
存储 数据可视化 数据挖掘
R语言在生物信息学中的应用
【4月更文挑战第25天】生物信息学是生物学、计算机科学和信息技术相结合的交叉学科,主要研究生物大分子信息的存储、处理、分析和解释。R语言作为一种强大的统计分析工具,被广泛应用于生物信息学领域。本文将介绍R语言在生物信息学中的应用,包括基因组学、转录组学、蛋白质组学、代谢组学等方面,帮助读者了解R语言在生物信息学中的重要性和应用前景。
571 2
|
存储 运维 Cloud Native
「开源人说」|数据库PolarDB开源之路该如何走?听听他们怎么说
10月25日,由阿里云开发者社区、阿里云PolarDB开源社区、InfoQ联合举办的「开源人说」数据库PolarDB专场线下沙龙在杭州召开,5位阿里云数据库超级大咖、10位阿里云数据库开源生态伙伴嘉宾 、数十位业内资深开发者现场进行了深度交流、共话开源。
「开源人说」|数据库PolarDB开源之路该如何走?听听他们怎么说
DataGridView中绑定List泛型的问题
1、数据绑定的问题:  当DataGridView的DataSource绑定的为DataTable时,当DataTable的内容发生改变时,DataGridView中的内容会自动跟随DataTable改变而不用重新绑定数据源;   而把List绑定到DataGridView则不然,当List的内容发生改变是,需要先设置DataGridView的DataSource属性为new List(),   然后再把作过改动的List重新赋于DataGridView的DataSource。
863 0
|
5天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
4天前
|
云安全 人工智能 自然语言处理
阿里云x硅基流动:AI安全护栏助力构建可信模型生态
阿里云AI安全护栏:大模型的“智能过滤系统”。
|
4天前
|
人工智能 自然语言处理 自动驾驶
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知