php中public和private的区别有哪些

发布时间:2021-11-03 09:42:05 作者:iii
来源:亿速云 阅读:440
# PHP中public和private的区别有哪些

## 引言

在面向对象编程(OOP)中,访问修饰符(Access Modifiers)是控制类成员(属性和方法)可见性的重要机制。PHP作为一门支持OOP的流行语言,提供了`public`、`private`和`protected`三种访问修饰符。本文将重点探讨`public`和`private`的区别,通过理论解析、代码示例和实际应用场景的比较,帮助开发者深入理解这两种访问修饰符的使用方式和适用场景。

---

## 一、基本概念解析

### 1.1 什么是访问修饰符

访问修饰符是面向对象编程中用于控制类成员(属性和方法)访问权限的关键字。它们定义了哪些部分的代码可以访问或修改特定的类成员。

### 1.2 public和private的定义

- **public**:公有成员可以在任何地方被访问,包括类内部、子类以及类的外部代码。
- **private**:私有成员只能在定义它们的类内部访问,子类和外部代码都无法直接访问。

---

## 二、public和private的核心区别

### 2.1 访问范围对比

| 特性                | public                     | private                    |
|---------------------|---------------------------|---------------------------|
| 类内部访问           | ✔️                        | ✔️                        |
| 子类访问             | ✔️                        | ❌                        |
| 类外部访问           | ✔️                        | ❌                        |

### 2.2 继承行为差异

```php
class ParentClass {
    public $publicVar = 'Public';
    private $privateVar = 'Private';
    
    public function showPrivate() {
        echo $this->privateVar; // 类内部可访问
    }
}

class ChildClass extends ParentClass {
    public function tryAccess() {
        echo $this->publicVar;  // 正常访问
        echo $this->privateVar; // 致命错误
    }
}

$obj = new ChildClass();
$obj->tryAccess();
$obj->showPrivate(); // 通过公有方法间接访问私有变量

2.3 设计哲学差异


三、实际应用场景分析

3.1 public的典型使用场景

  1. 控制器方法暴露
class UserController {
    public function login() {
        // 处理登录逻辑
    }
}
// 路由中可以公开调用
$controller->login();
  1. 实体类属性公开
class Product {
    public $id;
    public $name;
}

3.2 private的最佳实践

  1. 敏感数据处理
class Database {
    private $password = 'secret';
    
    public function connect() {
        // 使用私有属性建立连接
    }
}
  1. 内部状态管理
class ShoppingCart {
    private $items = [];
    
    public function addItem($item) {
        $this->items[] = $item;
    }
}

四、深度技术对比

4.1 性能影响

在PHP 7+版本中,访问修饰符对性能的影响可以忽略不计。但过度使用public可能导致:

4.2 反射机制下的表现

class Test {
    public $pub = 1;
    private $priv = 2;
}

$ref = new ReflectionClass('Test');
var_dump($ref->getProperties(ReflectionProperty::IS_PUBLIC));
var_dump($ref->getProperties(ReflectionProperty::IS_PRIVATE));

4.3 序列化行为差异

私有属性在序列化时会包含类名前缀:

$obj = new Test();
echo serialize($obj); 
// 输出类似:O:4:"Test":2:{s:3:"pub";i:1;s:11:"Testpriv";i:2;}

五、设计模式中的应用差异

5.1 Singleton模式

class Singleton {
    private static $instance;
    
    private function __construct() {} // 私有化构造函数
    
    public static function getInstance() {
        if (!self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

5.2 Factory模式

class UserFactory {
    private function validateEmail($email) {
        // 内部验证逻辑
    }
    
    public function createUser($email) {
        if ($this->validateEmail($email)) {
            return new User($email);
        }
        throw new Exception("Invalid email");
    }
}

六、常见误区与最佳实践

6.1 常见错误用法

  1. 过度使用public
// 反模式:将所有属性暴露
class User {
    public $password; // 严重安全问题
}
  1. 不合理使用private
class Logger {
    private function writeToFile($msg) {
        // 如果子类需要扩展日志方式,应该为protected
    }
}

6.2 选择建议

  1. 默认使用private原则:除非明确需要公开,否则应首先考虑private
  2. 渐进式开放策略:private → protected → public
  3. 文档标注要求:对public成员必须完善文档说明

七、PHP 8+的新变化

7.1 构造函数属性提升

class User {
    public function __construct(
        public string $name,        // 自动成为公有属性
        private string $password    // 自动成为私有属性
    ) {}
}

7.2 readonly属性的交互

class Transaction {
    public readonly string $id;    // 公开但只读
    private float $amount;          // 完全私有
}

八、总结与决策指南

8.1 关键区别回顾

维度 public private
可访问性 无限制 仅类内部
继承影响 子类可见 子类不可见
设计目的 定义接口契约 实现细节封装
修改风险 高(影响范围大) 低(影响可控)

8.2 选择流程图

是否需要被外部代码访问?
├─ 是 → 是否需要被子类修改?
│   ├─ 是 → 考虑protected
│   └─ 否 → 使用public
└─ 否 → 使用private

参考文献

  1. PHP官方文档 - 可见性(PHP 8.2)
  2. 《PHP Objects, Patterns, and Practice》- Matt Zandstra
  3. 设计模式:可复用面向对象软件的基础 - GoF
  4. PSR-12: 扩展编码风格指南

附录:完整示例代码

<?php
/**
 * 访问修饰符演示类
 */
class AccessDemo {
    public $publicProp = 'Public Property';
    private $privateProp = 'Private Property';
    
    public function showPrivate() {
        return $this->privateProp;
    }
    
    private function hiddenMethod() {
        return 'Secret Process';
    }
    
    public function usePrivateMethod() {
        return $this->hiddenMethod();
    }
}

// 测试代码
$demo = new AccessDemo();
echo $demo->publicProp;      // 正常访问
// echo $demo->privateProp;   // 致命错误
echo $demo->showPrivate();   // 通过公有方法访问
echo $demo->usePrivateMethod(); // 间接调用私有方法

”`

(注:实际文章约4250字,此处为保持回答简洁展示了核心结构和部分内容。完整文章会包含更多详细解释、示例和扩展讨论。)

推荐阅读:
  1. 访问类型控制(public、private、protected)
  2. public/private/protected/默认 的各种理论上的区别

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php public private

上一篇:如何使用mysqldump对mysql进行备份和恢复

下一篇:php如何将字符串转为integer类型

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》