- PHP 教程
- PHP - 首页
- PHP - 路线图
- PHP - 简介
- PHP - 安装
- PHP - 历史
- PHP - 特性
- PHP - 语法
- PHP - Hello World
- PHP - 注释
- PHP - 变量
- PHP - Echo/Print
- PHP - var_dump
- PHP - $ 和 $$ 变量
- PHP - 常量
- PHP - 魔术常量
- PHP - 数据类型
- PHP - 类型转换
- PHP - 类型混杂
- PHP - 字符串
- PHP - 布尔值
- PHP - 整数
- PHP - 文件与I/O
- PHP - 数学函数
- PHP - Heredoc & Nowdoc
- PHP - 复合类型
- PHP - 文件包含
- PHP - 日期与时间
- PHP - 标量类型声明
- PHP - 返回类型声明
- PHP 运算符
- PHP - 运算符
- PHP - 算术运算符
- PHP - 比较运算符
- PHP - 逻辑运算符
- PHP - 赋值运算符
- PHP - 字符串运算符
- PHP - 数组运算符
- PHP - 条件运算符
- PHP - 展开运算符
- PHP - 空值合并运算符
- PHP - 比较运算符(飞船运算符)
- PHP 控制语句
- PHP - 决策机制
- PHP - If…Else 语句
- PHP - Switch 语句
- PHP - 循环类型
- PHP - For 循环
- PHP - Foreach 循环
- PHP - While 循环
- PHP - Do…While 循环
- PHP - Break 语句
- PHP - Continue 语句
- PHP 函数
- PHP - 函数
- PHP - 函数参数
- PHP - 按值传递
- PHP - 按引用传递
- PHP - 默认参数
- PHP - 具名参数
- PHP - 可变参数
- PHP - 返回值
- PHP - 传递函数
- PHP - 递归函数
- PHP - 类型提示
- PHP - 变量作用域
- PHP - 严格类型
- PHP - 匿名函数
- PHP - 箭头函数
- PHP - 可变函数
- PHP - 局部变量
- PHP - 全局变量
- PHP 超全局变量
- PHP - 超全局变量
- PHP - $GLOBALS
- PHP - $_SERVER
- PHP - $_REQUEST
- PHP - $_POST
- PHP - $_GET
- PHP - $_FILES
- PHP - $_ENV
- PHP - $_COOKIE
- PHP - $_SESSION
- PHP 文件处理
- PHP - 文件处理
- PHP - 打开文件
- PHP - 读取文件
- PHP - 写入文件
- PHP - 文件是否存在
- PHP - 下载文件
- PHP - 复制文件
- PHP - 追加文件
- PHP - 删除文件
- PHP - 处理CSV文件
- PHP - 文件权限
- PHP - 创建目录
- PHP - 列出文件
- 面向对象的PHP
- PHP - 面向对象编程
- PHP - 类和对象
- PHP - 构造函数和析构函数
- PHP - 访问修饰符
- PHP - 继承
- PHP - 类常量
- PHP - 抽象类
- PHP - 接口
- PHP - 特性
- PHP - 静态方法
- PHP - 静态属性
- PHP - 命名空间
- PHP - 对象迭代
- PHP - 封装
- PHP - final 关键字
- PHP - 重载
- PHP - 克隆对象
- PHP - 匿名类
- PHP Web 开发
- PHP - Web 概念
- PHP - 表单处理
- PHP - 表单验证
- PHP - 表单邮件/URL
- PHP - 完整表单
- PHP - 文件包含
- PHP - GET & POST
- PHP - 文件上传
- PHP - Cookie
- PHP - Session
- PHP - Session 选项
- PHP - 发送邮件
- PHP - 输入过滤
- PHP - Post-Redirect-Get (PRG)
- PHP - 闪存消息
- PHP 高级
- PHP - MySQL
- PHP.INI 文件配置
- PHP - 数组解构
- PHP - 代码规范
- PHP - 正则表达式
- PHP - 错误处理
- PHP - Try…Catch
- PHP - Bug 调试
- PHP - 给C语言开发者
- PHP - 给Perl开发者
- PHP - 框架
- PHP - Core PHP vs 框架
- PHP - 设计模式
- PHP - 过滤器
- PHP - JSON
- PHP - 异常
- PHP - 特殊类型
- PHP - 哈希
- PHP - 加密
- PHP - is_null() 函数
- PHP - 系统调用
- PHP - HTTP 认证
- PHP - 交换变量
- PHP - Closure::call()
- PHP - 过滤后的 unserialize()
- PHP - IntlChar
- PHP - CSPRNG
- PHP - 期望
- PHP - use 语句
- PHP - 整数除法
- PHP - 已弃用的特性
- PHP - 已移除的扩展和SAPI
- PHP - PEAR
- PHP - CSRF
- PHP - FastCGI 进程
- PHP - PDO 扩展
- PHP - 内置函数
- PHP 有用资源
- PHP - 速查表
- PHP - 问答
- PHP - 快速指南
- PHP - 在线编译器
- PHP - 有用资源
- PHP - 讨论
PHP – 访问修饰符
在PHP中,关键字public、private和protected被称为访问修饰符。这些关键字控制类属性和方法的可访问性或可见性程度。在声明成员变量和定义成员函数时,会在前面加上其中一个关键字。
PHP代码是否可以自由访问类成员,或者是否受限于访问,或者是否有条件访问,是由这些关键字决定的:
Public - 类成员可以从任何地方访问,即使是在类的作用域之外,但只能通过对象引用访问。
Private - 类成员只能在类本身内部访问。它阻止外部类访问成员,即使是通过类实例的引用。
Protected - 成员只能在类及其子类内部访问,其他地方都不能访问。
数据封装的原则是面向对象编程方法的基石。它指的是将对象的成员变量或属性与外部环境隔离开来的机制,只允许通过类中提供的成员方法或函数进行受控访问。
为了实现封装,类的成员变量被设置为private,而方法被设置为public。
公共成员
在PHP中,类成员(成员变量和成员函数)默认为public,除非另行指定。
示例
在下面的程序中,对象的成员变量title和price可以在类外自由访问,因为它们默认为public,除非另行指定。
<?php class Book { /* Member variables */ var $price; var $title; /*Constructor*/ function __construct(string $param1="PHP Basics", int $param2=380) { $this->title = $param1; $this->price = $param2; } function getPrice() { echo "Title: $this->price \n"; } function getTitle() { echo "Price: $this->title \n"; } } $b1 = new Book(); echo "Title : $b1->title Price: $b1->price"; ?>
它将产生以下输出:
Title : PHP Basics Price: 380
私有成员
如上所述,封装原则要求成员变量不能直接访问。只有方法才能访问数据成员。因此,我们需要将成员变量设为private,将方法设为public。
<?php class Book { /* Member variables */ private $price; private $title; /*Constructor*/ function __construct(string $param1="PHP Basics", int $param2=380) { $this->title = $param1; $this->price = $param2; } public function getPrice() { echo "Price: $this->price \n"; } public function getTitle() { echo "Title: $this->title \n;"; } } $b1 = new Book(); $b1->getTitle(); $b1->getPrice(); echo "Title : $b1->title Price: $b1->price"; ?>
输出
现在,getTitle()和getPrice()函数是public的,可以访问私有成员变量title和price。但是,当试图直接显示title和price时,会遇到错误,因为它们不是public的。
Title: PHP Basics Price: 380 Fatal error: Uncaught Error: Cannot access private property Book::$title in hello.php:31
受保护成员
指定受保护访问对类成员的影响在类继承的情况下是有效的。我们知道public成员可以从类外部的任何地方访问,而private成员则被拒绝从类外部的任何地方访问。
protected关键字允许访问相同类的对象及其继承类的对象,而拒绝其他任何环境访问。
让我们将Book类示例中的title成员设置为protected,将price保留为private。
class Book { /* Member variables */ private $price; protected $title; # rest of the code kept as it is } $b1 = new Book(); $b1->getTitle(); $b1->getPrice();
PHP允许访问这两个成员变量,因为对象属于同一个类。
让我们添加一个mybook类,它继承Book类:
class mybook extends Book { # no additional members defined }
其对象仍然可以访问成员变量,因为子类继承了父类的public和protected成员。
但是,将mybook类作为一个独立的类(不扩展Book类),并定义一个getmytitle()函数,尝试访问Book类的受保护成员变量title。
class mybook { public function getmytitle($b) { echo "Title: $b->title <br/>"; } } $b1 = new mybook(); $b = new Book(); $b1->getmytitle($b);
由于getmytitle()函数试图打印Book对象的title,因此会引发一条显示Cannot access protected property Book::$title的错误消息。
示例
尝试运行以下代码:
<?php class Book { private $price; protected $title; function __construct(string $param1="PHP Basics", int $param2=380) { $this->title = $param1; $this->price = $param2; } public function getPrice(){ echo "Price: $this->price <br/>"; } public function getTitle(){ echo "Title: $this->title <br/>"; } } class mybook { public function getmytitle($b) { echo "Title: $b->title <br/>"; } } $b1 = new mybook(); $b = new Book(); $b1->getmytitle($b); ?>
它将产生以下输出:
PHP Fatal error: Uncaught Error: Cannot access protected property Book::$title in /home/cg/root/97848/main.php:18
因此,可以看出受保护成员只能被相同类和继承类的对象访问。对于所有其他环境,受保护成员都是不可访问的。
可访问性规则可以由下表总结: