Loading

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就代表对应对象

posted @ 2021-06-03 09:29  凌野  阅读(158)  评论(0)    收藏  举报