访问修饰限定符|学习笔记

简介: 快速学习访问修饰限定符

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

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


访问修饰限定符

 

内容介绍:

一、访问修饰限定符

 

一、访问修饰限定符

1、目标

理解访问修饰限定符的作用,掌握访问修饰限定符的实际运用

属性或方法前面需要加一个 public 。

2、概念

访问修饰限定符:用在属性或者方法前的修饰关键字,是用来控制属性或者方法的访问位置

class Buyer{

#属性声明

# $name; # 错误,类内部属性必须使用访问修饰限定符

public $name; # 正确:没有赋值

public $money 0; # 正确:有赋值

#方法声明

function display(){

echo CLASS ;-#魔术常量,输出类名

}

#类常量声明

const BIG NAME "BUYER';

}

(1)访问修饰限定符分类

①public:公有,类内和类外都可以访问

类是结构,{} 属于类外,{} 里面内容属于类外

②protected:受保护,只允许在相关类内部访问(高级部分的继承详细说明)

③private:私有,只允许在定义类内部访问

只能对大括号里面访问,方法是在类的内部,所以方法内部也属于类的内部,可以去访问私有的东西,私有的东西是为方法准备。

属性必须有访问修饰限定符,方法可以没有访问修饰限定符(默认public)

3、步骤

(1)声明类结构

(2)确定类成员

(3)确定类成员的访问位置限定,使用对应访问修饰限定符

(4)只能在对应位置访问被修饰的成员

本身在任何地方都允许对象去访问公有,如果东西有一定的安全措施,不希望被外部直接访问比较重要,外面不能随便拿东西出去私有,符合人类的思维逻辑。

4、示例

通过例子证明东西共有或者私有可以用在哪里

(1)公有成员访问

class saler{

# 属性

public $count = 100;

# 方法

public function getcount(){

echo __METHOD_; # 魔术常量,显示当前方法名(包含类名)

}

}

#:实例化对象

$s = new saler();|

# 访问(类外)

echo $s->count;

$s->getCount();

$s->setCount();

定义 saler 的类,$count=100,方法有一个为 get 有一个为 set,都是共有意味着拿到外面都可以用

类外调用的方法在内部运行,目前方法在外部调用,前提是能被外部调用,因为为 public 能调用否则不能。

代码 03public.php:

<?php

#访问修饰限定符

class Saler{

#属性

public $count = 100;

#方法

public function getcount(){

echo _METHOD_; #魔术常量,显示当前方法名(包含类名)

}

function setcount(){

echo __METHOD_;

}

}

#实例化对象

$s = new Saler();

#访问(类外)

echo $s->count;

$s->getCount();

$s->setCount();

实例化类的对象,通过实例化公有的属性和公有的方法进行。

结果:100Saler:getCountSaler::setCount

属性、方法都在类的外面可以被访问,内部肯定能被访问。

(2)受保护和私有成员设定(当前受保护和私有一致,需要高阶知识才会有区别)

class buyer{

# 属性

protected $money = 10;

private $account ='6226000000000001';

# 方法

protected function getMoney(){

echo __METHOD_;

}

private function getAccount(){

echo __METHOD_;

}

}

定义一个 Buyer 类,$受保护,账户私有,方法受保护 getmoney,getAccount 私有,私有属性私有方法受保护的属性受保护的方法

代码:(私有)

#访问(类外)

/*echo $s->count;

$s->getCount()

$s->setCount()*/

class Buyer{

# 属性

protected $money = 10;

private $account = '6226000000000001';

#方法

protected function getMoney(){

echo _METHOD_;

}

private function getAccount(){

echo _METHOD_;

}

}

$b = new Buyer();

echo $b->money;

//结果:

Fatal error: Uncaught Error: Cannot access protected property Buyer:$money in D:\server\Web\03public.php:45 Stack trace: #0 D:\server\Web\03public.php on line 45

//不能访问当前受保护的属性,因为当前是在类的外面所有不能访问

# echo $b->money;

echo $b->account;

//结果:

Fatal error: Uncaught Error: Cannot access private property Buye:$account in D:\server’Web\03public php:46 Stack trace: #0 {m D:\server\Web\03public.php on line 46

//依旧不能在外面访问。

//受保护的和私有的都不能在外面访问。

# echo $b->money;

# echo $b->account;

$b->getMoney();

//结果:

Fatal error: Uncaught Error:Call to protected method Buyer:getMoney() from context"in D:\server\Web\03publlic. php:49 Stack D:\server\Web\03public.php on line 49

//一样的错误,把属性换成了方法,from context 说明$b->getMoney() 调用的环境不是在类的内部。

# 实例化

$b=new Buyer();

echo $b->money; # 错误:当前属于类外部,不能访问

echo $b->account; # 错误:当前属于类外部,不能访问

$b->getMoney(); # 错误:当前属于类外部,不能访问

$b->getAccount(): # 错误:当前属于类外部,不能访问

5.总结

(1)访问修饰限定符分为三种:public、protected 和 private,访问权限依次降低(类对成员控制权限依次增加) (pubilc 哪里都可以访问,protected 有限定的访问,private 只有当前类的内部可以访问。)

(2)访问修饰限定符限定的是成员到底在哪里能被访问,私有和受保护都只能在类内部访问,公有可以在任何地方访问(但都必须是对象去访问)

(3)属性必须写清楚访问修饰限定符,方法可以省去(不建议),因为系统默认是 public

相关文章
|
存储 编译器 程序员
【C++】类与对象(一)类的定义 访问限定符 类的实例化 this指针
【C++】类与对象(一)类的定义 访问限定符 类的实例化 this指针
|
7月前
|
设计模式 算法 安全
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
145 1
|
5月前
|
存储 Java
成员变量与实例变量的区别与用途详解
成员变量与实例变量的区别与用途详解
|
7月前
|
存储 编译器 C语言
【C++】类与对象【定义、访问限定符、this指针】
【C++】类与对象【定义、访问限定符、this指针】
34 1
|
7月前
|
存储 监控 编译器
【C++】static关键字及其修饰的静态成员变量/函数详解
【C++】static关键字及其修饰的静态成员变量/函数详解
158 3
|
7月前
|
存储
成员变量和类变量的区别:
成员变量和类变量的区别:
105 0
|
7月前
|
算法 C语言 C++
【C/C++ 关键字 类型限定符 】 C/C++ 中 const的用法:限制变量的作用域和可见性
【C/C++ 关键字 类型限定符 】 C/C++ 中 const的用法:限制变量的作用域和可见性
47 0
|
存储 C++
解析static关键字
解析static关键字
|
C++
【C++知识点】访问限定符
【C++知识点】访问限定符
88 0
|
C++
c++ 类名直接访问非静态函数?
c++ 类名直接访问非静态函数?
110 0
c++ 类名直接访问非静态函数?