开发者学堂课程【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();
定义类中有静态属性以及静态方法,静态方法为了访问静态属性,想要访问类在外部触发静态方法即可。
实现了访问,具体的业务有更多的现实的业务意义或者更加复杂的逻辑来解决它。但此时如果类名由 Saler 改为 Buyer,找到使用类的地方去修改,会告诉内部出问题。
因为内部用了 Saler,内部还要改里面的才能解决问题。
假设用的是 self 关键字,
说明 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();
系统显示这种构造方法不能调用,因为创建的对象调用一个私有的方法,在类的外部,不让调用,所以这种方式解决不了问题。为解决这种问题,在类的内部提供静态方法(静态方法不需要对象就可以直接访问),实现对象实例化。
#提供静态方法:实现对象实例化
public static function getInstance(){
return new Saler();
}
这样
做意义在于可以控制对象的生产,在外部可以无限 new saler ,这里可以用逻辑控制。此时外部不再是实例化对象,而是获取实例,用 saler::getInstance()方法就可以得到一个对象,刷新后得到 saler 类的对象。
#获取实例
$s = Saler::getInstance();
var_ dump($s);
这个问题同样面临一个新的问题,比如类名修改之后 new sale()又要报错,此时可以使用 self 代替类名进行内部实例化。
#可以使用 self 代替类名进行内部实例化
return new self();
没有报任何错误,而且得到的依然是个对象,说明 self new 的过程中确实 new 了 saler,此时想改类名,会发现真正要改的只是类名和外部使用类的地方,真正类的内部结构是不需要任何修改,它就代表 Buyer。这就是 self 很特殊的意义,它能够代表类名,让类名实现修改。
四、小结
1、self 是一种内部用来代替类名的关键字。
2、self 可以用来访问静态成员。
3、self 也可以在类内部用来实例化对象,前提是要在类的内部实例化。
4、self 的特殊意义,可以帮助类名修改时,不用修改任何类的内部结构,虽然内部用了类,但是外部修改类名的时候根本不需要修改内部结构,保证内部结构是统一的、完整的,因为在做面向对象开发的时候有一个开闭原则,对外是开放的,但是对内修改通常是不允许修改的,这样才能保证类的真正的实用性,而不会被外部改变这种逻辑,也不需要在维护代码的时候改了这个还要改那个,改了外面还要改里面,这就是 self 关键字的应用和作用。