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月前
|
C#
30.C# 关键字 this初步学习
30.C# 关键字 this初步学习
38 1
|
6月前
|
存储 程序员 编译器
C++-关键字
C++-关键字
47 1
|
3月前
|
C# 计算机视觉
C#中out关键字
C#中out关键字
61 0
|
5月前
|
Java API
RentrantLock关键字详解
RentrantLock关键字详解
|
6月前
|
Java
|
Java
关键字this
关键字this
54 0
|
数据库 开发者 Python
With 关键字的使用 | 学习笔记
快速学习 With 关键字的使用
With 关键字的使用 | 学习笔记
单链表删除第一次关键字
删除第一次出现关键字为key的节点
|
编译器 程序员 Linux
C++关键字之likely和unlikely
C++关键字之likely和unlikely
740 0
C++关键字之likely和unlikely