”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 了解 PHP OOP 中的访问修饰符:公共、受保护和私有

了解 PHP OOP 中的访问修饰符:公共、受保护和私有

发布于2024-11-08
浏览:510

Understanding Access Modifiers in PHP OOP: Public, Protected, and Private

在 PHP 面向对象编程 (OOP) 中,访问修饰符控制类属性和方法的可见性。 PHP 中的主要访问修饰符是 public、protected 和 private。

本文将引导您了解这些访问修饰符的目的和用法,并解释如何在 PHP OOP 中有效地应用它们。

1.公共访问修饰符

  • 关键字:公开
  • 可见性:可从任何地方访问——类内部、类外部以及派生类中。
  • 用例:将 public 用于应可从任何上下文访问的属性或方法。

例子:

class User {
    public $name = "John";

    public function greet() {
        return "Hello, " . $this->name;
    }
}

$user = new User();
echo $user->greet();  // Output: Hello, John

在此示例中,属性 $name 和方法greet() 都是公共的,允许从类外部直接访问它们。

2.受保护的访问修饰符

  • 关键字:受保护
  • 可见性:可以在类本身内部和子类(子类)访问,但不能从类外部访问。
  • 用例:使用 protected 允许派生类访问某些属性或方法,同时保持它们对外部代码隐藏。

正确访问的示例:

class Person {
    protected $age = 30;

    protected function getAge() {
        return $this->age;
    }
}

class Employee extends Person {
    public function showAge() {
        return $this->getAge();  // Correct: Accesses protected method within a subclass
    }
}

$employee = new Employee();
echo $employee->showAge();  // Output: 30

在此示例中,getAge() 是受保护的方法,可以在 Employee 类(Person 的子类)中访问该方法。

错误示例:

class Person {
    protected $age = 30;

    protected function getAge() {
        return $this->age;
    }
}

$person = new Person();
echo $person->getAge();  // Error: Cannot access protected method Person::getAge()

错误消息:致命错误:未捕获错误:无法访问受保护的方法 Person::getAge()

在这种情况下,尝试直接从 Person 的实例访问受保护的方法 getAge() 会导致错误,因为无法从类外部访问受保护的方法。

3.私有访问修饰符

  • 关键字:私有
  • Visibility:只能在定义它的类中访问。 无法从子类或外部代码访问
  • 用例:使用 private 对类外部的任何代码(包括派生类)隐藏属性或方法。

正确访问的示例:

class BankAccount {
    private $balance = 1000;

    private function getBalance() {
        return $this->balance;
    }

    public function showBalance() {
        return $this->getBalance();  // Correct: Accesses private method within the same class
    }
}

$account = new BankAccount();
echo $account->showBalance();  // Output: 1000

在此示例中,getBalance() 方法是私有的,因此只能在 BankAccount 类中访问它。 showBalance() 方法是公共的,可用于间接访问私有 getBalance()。

错误示例:

class BankAccount {
    private $balance = 1000;

    private function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount();
echo $account->getBalance();  // Error: Cannot access private method BankAccount::getBalance()

错误消息:致命错误:未捕获错误:无法访问私有方法 BankAccount::getBalance()

在这种情况下,尝试直接从 BankAccount 的实例访问私有方法 getBalance() 会导致错误,因为私有方法无法从类外部访问。

子类中出现错误的示例:

class BankAccount {
    private $balance = 1000;

    private function getBalance() {
        return $this->balance;
    }
}

class SavingsAccount extends BankAccount {
    public function showBalance() {
        return $this->getBalance();  // Error: Cannot access private method BankAccount::getBalance()
    }
}

$savings = new SavingsAccount();
echo $savings->showBalance();

错误消息:致命错误:未捕获错误:无法访问私有方法 BankAccount::getBalance()

这里,私有方法 getBalance() 即使对于像 SavingsAccount 这样的子类也是不可访问的,这表明私有方法不能在其定义类之外访问。

4.访问修饰符总结

修饰符 课堂内 派生类 课外
民众 是的 是的 是的
受保护 是的 是的
私人的 是的

5.最佳实践

  • 谨慎使用public,仅公开必要的内容。更喜欢通过公共方法封装和公开功能。
  • 使用protected允许子类访问必要的属性或方法,同时对外部代码隐藏它们。
  • 使用private完全封装类内部并防止来自外部或派生类的访问。

结论

PHP 的访问修饰符(public、protected、private)提供了一种管理 OOP 中可见性和封装的机制。通过正确理解和应用这些修饰符,您可以创建更安全且可维护的代码。

版本声明 本文转载于:https://dev.to/ialaminpro/understanding-access-modifiers-in-php-oop-public-protected-and-private-5bah?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何监控 Guzzle Http 客户端 – PHP 快速提示
    如何监控 Guzzle Http 客户端 – PHP 快速提示
    Guzzle 是一款流行的 PHP HTTP 客户端,可以轻松发送 HTTP 请求和创建 Web 服务库。最流行的 PHP 框架提供了内部 Http Client 服务,它们只是 Guzzle Http Client 的定制实现: Laravel Http 客户端 Symfony Http 客户端 ...
    编程 发布于2024-11-08
  • 使用 Gin/Golang 时如何处理空请求主体:绑定和调试技术指南
    使用 Gin/Golang 时如何处理空请求主体:绑定和调试技术指南
    Gin/Golang 中请求正文为空使用 Gin 处理 POST 请求时,偶尔可能会遇到请求正文显示为空的问题是空的。这可能会令人沮丧,尤其是当您希望从客户端接收数据时。此问题的一个常见原因是尝试直接打印正文。Gin 将请求正文表示为接口类型 ReadCloser。但打印该接口的字符串值并不会泄露实...
    编程 发布于2024-11-08
  • Python 列表理解
    Python 列表理解
    Python 最酷的事情之一是列表推导式如何让在一行代码中创建和操作列表变得非常容易。列表理解是一种通过转换和过滤现有列表中的元素来构建新列表的简洁方法。这个特性是 Python 使代码更具可读性和高效性的众多方法之一,对于初学者来说是一个很好的学习工具。在这里阅读更多示例...... 奥利弗 |图...
    编程 发布于2024-11-08
  • 如何在 Gin 中组织路由:分组路由定义指南?
    如何在 Gin 中组织路由:分组路由定义指南?
    如何在 Gin 中组织路由为了避免路由定义使主文件混乱,您可以将路由分组到单独的文件中。这种方法可以实现更好的代码组织和可维护性。要创建嵌套路由分组,您可以将路由器变量存储在结构体或全局变量中。然后,各个文件可以将处理程序添加到此共享路由器实例。示例实现routes.gopackage app im...
    编程 发布于2024-11-08
  • Leetcode链表问题
    Leetcode链表问题
    反向链表(LeetCode #206) 难度:简单 概念:迭代和递归方法。 合并两个排序列表 (LeetCode #21) 难度:简单 概念:链表遍历和合并技术。 从列表末尾删除第 N 个节点 **(LeetCode #19) **难度:中等 概念:两指针技术(慢指针和快指针)。 链表循环 **(...
    编程 发布于2024-11-08
  • 如何在 C++ 容器中存储异构对象:boost::any 或自定义实现?
    如何在 C++ 容器中存储异构对象:boost::any 或自定义实现?
    在 C 容器中存储异构对象C 容器通常需要同质元素,这意味着它们只能保存单一类型的对象。但是,在某些情况下,您可能需要一个可以容纳混合数据类型的容器。本文探讨了如何使用 boost::any 库和自定义方法来实现此目的。使用 boost::anyboost::any 是一个模板类可以容纳任何 C 类...
    编程 发布于2024-11-08
  • 使用 Pandas 掌握数据分析:从数据中释放洞察力
    使用 Pandas 掌握数据分析:从数据中释放洞察力
    数据分析是数据科学的核心,Python 的 Pandas 库是一个强大的工具,可以使这项任务变得更轻松、更高效。无论您使用简单的电子表格还是大型数据集,Pandas 都可以让您像专业人士一样灵活地操作、分析和可视化数据。在本文中,我们将深入探讨 Pandas 的基础知识,涵盖从数据操作到高级分析技术...
    编程 发布于2024-11-08
  • 最佳免费开源图标库 4
    最佳免费开源图标库 4
    In 2024, finding the best free icon library can significantly enhance the visual appeal of your websites, apps, or digital projects. Whether you're a ...
    编程 发布于2024-11-08
  • React Part 组件、State 和 Props 入门
    React Part 组件、State 和 Props 入门
    欢迎回到我们的 React.js 之旅!在上一篇文章中,我们介绍了 React 的基础知识,强调了它作为构建动态用户界面的库的优势。今天,我们将深入探讨创建 React 应用程序所必需的三个基本概念:组件、状态和属性。让我们详细探讨这些概念! 什么是 React 组件? React ...
    编程 发布于2024-11-08
  • 如何利用原生 ES6 Promises 有效地链接异步 jQuery 函数?
    如何利用原生 ES6 Promises 有效地链接异步 jQuery 函数?
    JavaScript 的互操作性承诺实现异步 jQuery 函数的高效链接链接异步 jQuery 函数时,通常需要避免 jQuery 的内置函数Promises 功能并使用原生 ES6 Promises 代替。这种互操作性允许 jQuery 操作和您想要的 Promise 实现之间的无缝集成。使用 ...
    编程 发布于2024-11-08
  • 在 Python 中使用 ElementTree 的“find”和“findall”方法时如何忽略 XML 命名空间?
    在 Python 中使用 ElementTree 的“find”和“findall”方法时如何忽略 XML 命名空间?
    在 ElementTree 的“find”和“findall”方法中忽略 XML 命名空间使用 ElementTree 模块解析和定位 XML 文档中的元素时,命名空间会带来复杂性。下面介绍了如何在 Python 中使用“find”和“findall”方法时忽略命名空间。当 XML 文档包含命名空间...
    编程 发布于2024-11-08
  • Bitbucket 综合指南:功能、集成和最佳实践
    Bitbucket 综合指南:功能、集成和最佳实践
    Bitbucket简介 Bitbucket 是 Atlassian 旗下基于 Git 的源代码存储库托管服务,以其强大的集成能力和强大的协作功能而闻名。它适合各种规模的团队,提供可简化开发工作流程、提高生产力并确保安全代码管理的解决方案。无论您是小型团队还是大型企业的一部分,Bitbucket 都...
    编程 发布于2024-11-08
  • 如何在 Python 中用逗号连接列表中的字符串?
    如何在 Python 中用逗号连接列表中的字符串?
    从列表中用逗号连接字符串将字符串列表映射到逗号分隔的字符串是编程中的常见任务。可以采用各种方法来实现此目标,每种方法都有自己的优点和缺点。一种流行的方法是将 join 方法与映射函数结合使用。此方法需要创建一个中间字符串,用作各个字符串之间的分隔符。例如:my_list = ['a', 'b', '...
    编程 发布于2024-11-08
  • 如何处理 AngularJS 应用程序中的锚点哈希链接?
    如何处理 AngularJS 应用程序中的锚点哈希链接?
    AngularJS 中的锚点哈希处理使用锚点浏览网页是一种常见的做法,特别是对于具有多个部分的长页面。然而,在 AngularJS 应用程序中,锚链接处理可能会出现问题。当单击 AngularJS 中的锚链接时,默认行为是拦截单击并将用户重定向到不同的页面。为了解决这个问题,AngularJS 提供...
    编程 发布于2024-11-08
  • 用 Java 编写多线程应用程序:综合指南
    用 Java 编写多线程应用程序:综合指南
    在软件开发领域,效率和速度至关重要。随着应用程序复杂性的增加以及需要处理的数据量的增加,利用现代多核处理器的功能变得至关重要。这就是 Java 的并发特性发挥作用的地方,它允许开发人员编写可以同时执行多个任务的多线程应用程序,从而显着提高性能。 了解 Java 并发 Java 中的...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3