PhP 面向对象基础知识
3、类成员
目标:了解类成员的类型,类成员的作用,能够运用类成员去创建有效类
概念
类成员: 指直接定义在类结构{}内部的一级成员,既直接依赖{}的成员
-
类成员分类
- 成员变量(属性):给对象存储数据的变量
- 成员函数(方法):给对象调用解决问题的函数
- 类常量:属于内部的常量,使用const关键字定义
-
属性和方法需要使用访问修饰限定符修饰,姑且使用public修饰
class 类名{
# 类常量 (可以多个)
const 类常量 = 值;
# 属性 (可以多个)
public $属性名 [ = 值];
# 方法(可以多个)
[public] function 方法名([形参列表]){
# 方法体(返回值)
}
}
- 成员访问:属性和方法都属于对象访问,类常量属于类访问
- 对象访问属性和方法,使用
->
- 对象访问属性和方法,使用
# 实例化
$object = new 类名();
# 属性访问
$object->属性名(); # 此时不带属性本身$符号(前面保存对象的变量带$符号,$object->属性是整体)
# 方法访问
$object->方法名([实参列表]);
步骤
1、声明类结构
2、明确类产生的对象是否需要有数据的存储:确定属性
3、明确类产生的对象是否需要函数实现功能:确定方法
4、明确类是否需要定义常量:确定类常量
5、对象实例化
6、类成员访问(属性和方法)
示例
1、声明类结构
#类成员
#
# 定义买家类、买家有姓名、有钱
class Buyer{
# 属性声明
// $name; #错误,类内部属性必须使用访问修饰限定符
public $name; #正确:没有赋值
public $money = 0; #正确:有赋值
# 方法声明
function display(){
echo __CLASS__; #魔术常量,输出类名
}
# 类常量声明
const BIG_NAME = 'BUYER';
}
2、成员变量访问(属性和方法):成员必须通过对象实例化才能进行访问,需要先通过实例化得到对象,然后通过对象实现对进行操作
# 实例化
#
# 实例化对象
$b = new Buyer();
# 访问属性
echo $b->money;
# 修改属性
$b->money = 1000;
# 删除属性
unset($b->name)
# 新增属性
$b->age = 20;
# 访问方法
$b->display();
注意
- 删除属性和新增属性通常使用较少,更多的操作是访问和修改
- 类常量不是由对象进行访问
- 属性和方法的使用都必须确保类中已经定义(属性可以新增)
3、类成员中:属性、类常量和方法都可以无限定义,但是定义的原则是相关性。除了以上三个类成员,不能再类结构{}中写其他任何代码
class BuyerP{
echo __CLASS_; #错误
define('PI',3.14); #错误
if(true){echo 'hello world'} #错误
}
小结
1、PHP类结构中有且仅有三种成员:属性、方法和类常量,其他直接属于类的内容都会报错
2、类声明需要根据业务来确定类成员的存在和数量
3、类中属性和方法的访问方式都是通过对象来调用:$对象->属性名/方法名(); 注意属性名不带$符号
4、类中定义属性不能直接属性名,需要使用public修饰(访问修饰限定符中的一种)
4、访问修饰限定符
目标:理解访问修饰限定符的作用,掌握访问修饰限定符的实际作用
概念
访问修饰限定符:用在属性或者方法前的修饰关键字,是用来控制属性或者方法的访问位置
-
访问修饰限定符分类
-
public:公有,类内和类外都可以访问
-
protected:受保护,只允许相关类内部访问
-
private:私有,只允许在定义类内部访问
-
-
属性必须有访问修饰限定符,方法可以没有访问修饰限定符(默认public)
步骤
1、声明类结构
2、确定类成员
3、确定类成员的访问位置锁定、使用对应访问修饰限定符
4、只能在对应位置访问被修饰的成员
实例
1、公有成员访问
class Saler{
# 属性
public $count = 100;
# 方法
public function getCount(){
echo __METHOD__; #魔术常量,显示当前方法名(包含类名)
}
function setCount(){
echo __METHOD__;
}
}
# 实例化对象
$s = new Saler();
# 访问(类外)
echo $s->count;
$s->getCount();
$s->setCount();
2、受保护和私有成员设定(当前受保护和私有一致,需要高阶只是才会有区别)
class Buyer{
# 属性
protected $money = 10;
private $account = '157668440';
#方法
protected function getMoney(){
echo __METHOD__;
}
private function getAccount(){
echo __METHOD__;
}
}
$b->new Buyer();
echo $b->money; #错误:当前属于类外部,不能访问
echo $b->account; #错误,当前属于类外部,不能访问
$b->getMoney(); #错误:当前属于类外部,不能访问
$b->getAccount(); #错误:当前属于类外部,不能访问
总结
1、访问修饰限定符分为三种:public、protected和private,访问权限一次降低(类对成员控制权限依次增加)
2、访问修饰限定符限定的是成员到底在哪里能被访问,私有和受保护都只能在类内部访问,公有可以在任何地方访问(但都必须是对象去访问)
3、属性必须写清楚访问修饰限定符,方法可以省去(不建议),因为系统默认是public
5、类内部对象
目标:理解内部对象的概念,掌握内部对象对成员的访问
概念
内部对象:$this,方法内部的一个对象,会自动指向来调用方法的对象
-
$this存在于方法内部(仅限内部使用),所以相当于在类的结构内部
-
- 可以访问任意访问修饰限定符修饰的成员
- 私有成员都是通过公有方法来实现访问(公有方法可以在类外部访问)
-
类内部对类成员的访问也需要通过对象才能访问,所以必须通过$this内部对象访问类成员
步骤
1、声明类结构
2、明确私有成员(不限定成员的访问修饰限定符)
3、私有成员需要在某种情况下被访问:增加方法,在方法里使用$this访问
实例
1、尝试在类内部中访问属性
class Saler{
# 属性
public $count = 100;
protected $discount = 0.8;
private $money = 100;
public function getAll(){
# echo $count,$discount,$money; # 全部错误:提示未定义的“变量”
# 引入对象
global $s;
echo $s->count,$s->discount,$s->money;
}
}
$s = new Saler();
$s->getAll();
注意:$this代表的是对象,而$this所在环境为类内部的方法内部,所以$this对象是在类内部访问,因此可以访问所有的属性和方法,不受访问修饰限定符限制
$this、class和new之间的关系原理
-
class是定义类结构,属于非执行代码,因此会被加载到代码段(编译阶段)
-
new是实例化对象,先判定类内存(代码段)是否存
-
类不存在,报错;
-
类存在,将类内部的属性部分复制一份,然后在内存(堆区)开辟一块内存空间,将属性放到里面,同时内部有一个指针指向类的内存空间(代码段)
-
对象访问属性即访问的是对象空间里存储的部分
-
对象访问方法是对象通过内部指针找到类空间中的方法,然后在内存(栈区)开辟运行
-
-
$this是系统在方法内置的对象通用名
- 对象在调用方法的时候,系统会自动找到对象所保存的内存地址(堆区),然后把地址赋值给$this
-
方法内部的$this就代表调用当前$this所在方法的外部对象
- $this的本质是函数内部的一个局部变量,只是系统自动对其进行赋值,而且一定是调用方法的对象本身
-
面向对象变成代码运行内存关系 PPT
小结
1、类内部方法内有一个内置对象$this,代表访问该方法的外部对象
2、类在实例化对象的时候要保证内存中有该类
3、一个类可以实例化多个对象,每个对象访问成员方法时,$this就代表对应对象

浙公网安备 33010602011771号