【问题标题】:PHP: What is the purpose of encapsulation?PHP:封装的目的是什么?
【发布时间】:2011-04-08 08:14:05
【问题描述】:

我说的是可以应用于属性和方法的公共、私有和受保护的关键字。我到处寻找,我知道它们做什么以及如何使用它们,但看不到它们在编程时如何实用。有人可以解释或举个例子吗?

【问题讨论】:

    标签: php methods properties encapsulation


    【解决方案1】:

    封装(作用域)的主要目的是确保您编写的代码不会被破坏。这通常适用于作用域,所以让我使用一个更简单的函数内部局部变量示例:

    function xyz ($x) {
      $y = 1;
      while ($y <= 10) {
        $array[] = $y * $x;
        $y++;
      }
      return $array;
    }
    

    这个函数的目的是传递一个数字并返回一个数组。示例代码非常基本。为了使函数 xyz() 可靠,您需要保证它每次都执行完全相同的操作。那么,如果有人能够从外部更改 $y 或 $array 的初始值呢?甚至$x?如果您能够从函数外部执行此操作,则您无法再保证该函数返回什么。

    这就是作用域(封装)发挥作用的地方。它是一种设置边界的方法,分配对变量(以及函数、属性、方法、对象)可以做什么和不可以做什么的权限,以确保那段代码总是能完全按照预期做.

    以任何内置的 php 函数为例,例如 ...strtolower() 或 preg_match() 或 ...以及任何东西。他们期望参数被传递给他们,并且他们返回一些特定的东西。内部有变量、循环等……来获取输入并输出输出。如果您能够从外部更改这些内容,则无法保证 strotolower() 将返回您提供的小写字符串,这违背了拥有可重用代码块的目的。

    当您为自己编程时,这不一定很有用,但是当您编写供许多人使用和共享的代码时,尤其是使用涉及插件/插件等的代码时...它是无价的用于确保您的代码完成它应该做的事情,并以预期的方式访问/使用/调用。

    【讨论】:

      【解决方案2】:

      私有/受保护方法用于 C++ 和 Java 等编译语言。如果代码被编译而不是以脚本形式保留,则这些规则是可执行的。在这些语言中,特别是可以隐藏繁琐的内部或机器级实现。

      PHP 仅具有这些功能,因为它的开发人员认为缺少受保护/私有方法意味着人们嘲笑 PHP4 不是一种合适的面向对象语言。
      在 PHP 中使用封装作为设计理念是无可争议的。然而,这些语言结构的使用并不是必需的,并且无论如何都可以在源代码中轻松删除。但是,如果没有适当的库文档,或者如果协同程序员不尊重编码风格,限制访问会很有用。

      因此,总而言之:技术用例很少,鼓励使用指定的接口来抽象流程没问题。然而,通常更有意义的是设计 API 以使所有需要的功能和数据都易于使用,从而减少访问无关内部的诱惑。你暴露的越多,以后改变内部处理就越困难。您公开的固有数据越多,出现的变通方法或复杂的对象结构就越少。

      【讨论】:

        【解决方案3】:

        我认为 Grady Booch 总结得很好:

        “封装用于分离抽象的合同接口及其实现”

        【讨论】:

          【解决方案4】:

          您可以在同一 here 上找到很好的讨论。虽然它与 .net 相关(与 php 无关)但仍然是一个非常笼统的讨论,其中还包括对 wikipedia 文章的讨论。

          【讨论】:

            猜你喜欢
            • 2011-08-30
            • 2010-11-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-27
            • 2019-05-20
            相关资源
            最近更新 更多