- 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 - Flash 消息
- PHP 高级
- PHP - MySQL
- PHP.INI 文件配置
- PHP - 数组解构
- PHP - 代码规范
- PHP - 正则表达式
- PHP - 错误处理
- PHP - Try…Catch
- PHP - Bug 调试
- PHP - 给C语言开发者
- PHP - 给Perl开发者
- PHP - 框架
- PHP - Core PHP 与框架
- 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 实现**封装**,这是 OOP 的重要原则之一,它使用访问控制关键字:**public、private** 和 **protected**。
封装是指将对象的成员变量或属性与外部环境隔离开来的机制,只允许通过类中提供的成员方法或函数进行控制访问。
下图说明了面向对象编程方法中封装的原则。
PHP 的关键字列表包含以下关键字,这些关键字决定了对象的属性和方法的可访问性,这些对象是 PHP 中类的实例:
**Public** - 类成员可以从任何地方访问,即使是在类作用域之外,但只能通过对象引用访问。
**Private** - 类成员只能在类内部访问。它阻止外部类访问成员,即使是通过类实例的引用。
**Protected** - 成员只能在类及其子类中访问,其他地方都不能访问。
这三个关键字“**public、private** 和 **protected**”通常称为访问修饰符。它们也称为可见性模式,因为它们决定某个类成员的可用程度。
公共成员
在 PHP 中,类成员(成员变量和成员函数)默认是公共的,除非另有说明。
示例
在下面的程序中,对象的成员变量 title 和 price 可以在类外部自由访问,因为它们默认为公共的,除非另有说明。
<?php class Person { /* Member variables */ var $name; var $age; /*Constructor*/ function __construct(string $param1="Ravi", int $param2=28) { $this->name = $param1; $this->age = $param2; } function getName() { echo "Name: $this->name" . PHP_EOL;; } function getAge() { echo "Age: $this->age" . PHP_EOL;; } } $b1 = new Person(); $b1->getName(); $b1->getAge(); echo "Name : $b1->name Age: $b1->age" . PHP_EOL; ?>
它将产生以下**输出**:
Name: Ravi Age: 28 Name : Ravi Age: 28
**注意**,所有类成员的属性默认都是公共的,如果需要,您可以显式地将它们声明为公共的。因此,实例方法 getName() 和 getAge() 可以从类外部调用。
由于属性 name 和 age 也是公共的,因此它们也可以从类外部访问,这与封装的原则不符。
私有成员
如上所述,封装的原则要求不应直接访问成员变量。只有方法才能访问数据成员。因此,我们需要将成员变量设为私有,将方法设为公共。
示例
让我们将 name 和 age 属性的声明更改为私有,并运行以下 PHP 脚本:
<?php class Person { /* Member variables */ private $name; private $age; /*Constructor*/ function __construct(string $param1="Ravi", int $param2=28) { $this->name = $param1; $this->age = $param2; } public function getName() { echo "Name: $this->name" . PHP_EOL;; } public function getAge(){ echo "Age: $this->age" . PHP_EOL;; } } $b1 = new Person(); $b1->getName(); $b1->getAge(); echo "Name : $b1->name Age: $b1->age" . PHP_EOL; ?>
它将产生以下**输出**:
Name: Ravi Age: 28 PHP Fatal error: Uncaught Error: Cannot access private property Person::$name in person.php:27
错误消息说明了私有属性无法从公共作用域访问的原因。
受保护的成员
指定受保护访问对类成员的影响在类继承的情况下有效。我们知道公共成员可以在类外部的任何地方访问,而私有成员则被拒绝在类外部的任何地方访问。
**protected** 关键字允许访问同一类的对象及其继承类的对象,而拒绝访问任何其他环境。
示例
让我们继承 person 类并定义一个 student 类。我们将 name 属性从私有更改为受保护。student 类有一个新的公共方法 getDetails(),它打印 name 和 age 属性的值。
Person 类
<?php class Person { /* Member variables */ protected $name; private $age; /*Constructor*/ function __construct(string $param1="Ravi", int $param2=28) { $this->name = $param1; $this->age = $param2; } public function getName(){ echo "Name: $this->name" . PHP_EOL;; } public function getAge() { echo "Age: $this->age" . PHP_EOL;; } }
Student 类
class student extends Person { public function getDetails() { echo "My Name: $this->name" . PHP_EOL; echo "My age: $this->age" . PHP_EOL; } } $s1 = new student(); $s1->getDetails(); ?>
它将产生以下**输出**:
My Name: Ravi PHP Warning: Undefined property: student::$age in person.php on line 28 My age:
下表说明了 PHP 中类成员的可访问性规则: