【问题标题】:What is encapsulation with simple example in php?php中简单示例的封装是什么?
【发布时间】:2010-11-02 09:17:08
【问题描述】:

什么是php中的简单示例封装?

【问题讨论】:

    标签: php encapsulation


    【解决方案1】:

    封装只是将一些数据包装在一个对象中。术语“封装”通常与“信息隐藏”互换使用。维基百科有a pretty thorough article

    这是来自the first linkGoogle search for 'php encapsulation' 中的示例:

    <?php
    
    class App {
         private static $_user;
    
         public function User( ) {
              if( $this->_user == null ) {
                   $this->_user = new User();
              }
              return $this->_user;
         }
    
    }
    
    class User {
         private $_name;
    
         public function __construct() {
              $this->_name = "Joseph Crawford Jr.";
         }
    
         public function GetName() {
              return $this->_name;
         }
    }
    
    $app = new App();
    
    echo $app->User()->GetName();
    
    ?>
    

    【讨论】:

    • 嗨,fixedd,我不认为这是一个简单的 php 封装示例。对于初学者来说很难理解 Singleton 的概念。
    • 请注意示例链接现已损坏。单例也被认为是反模式。
    • 命名 App->User() 真的不是很好,不是吗?阅读代码的人以及学习者都会感到困惑。 App->getUser() 我觉得会更好。
    • 知道了,$app->User() 正在调用“APP”类的函数,因此它返回了 User 类的对象,我们可以用它调用 User 类的方法。
    【解决方案2】:

    封装是类和数据结构的保护机制。它使您的生活更加轻松。使用封装,您可以控制访问和设置类参数和方法。您可以控制说明哪些部分对外人可见,以及如何设置您的对象参数。

    访问和设置类参数

    (好方法)

    <?php
    
    class User
    {
        private $gender;
    
        public function getGender()
        {
            return $this->gender;
        }
    
        public function setGender($gender)
        {
            if ('male' !== $gender and 'female' !== $gender) {
                throw new \Exception('Set male or female for gender');
            }
    
            $this->gender = $gender;
        }
    }
    

    现在您可以从 User 类创建一个对象,并且可以安全地设置性别参数。如果你为你的班级设置了任何错误的东西,那么它将抛出异常。您可能认为这是不必要的,但是当您的代码增长时,您希望看到有意义的异常消息,而不是系统中没有异常的尴尬逻辑问题。

    $user = new User();
    $user->setGender('male');
    
    // An exception will throw and you can not set 'Y' to user gender
    $user->setGender('Y');
    

    (不好的方式)

    如果您不遵循封装角色,那么您的代码将是这样的。非常难维护。请注意,我们可以为用户性别属性设置任何内容。

    <?php
    
    class User
    {
        public $gender;
    }
    
    $user = new User();
    $user->gender = 'male';
    
    // No exception will throw and you can set 'Y' to user gender however 
    // eventually you will face some logical issue in your system that is 
    // very hard to detect
    $user->gender = 'Y';
    

    访问类方法

    (好方法)

    <?php
    
    class User
    {
        public function doSomethingComplex()
        {
            $this->doThis(...);
            ...
            $this->doThat(...);
            ...
            $this->doThisExtra(...);
        }
    
        private function doThis(...some Parameters...)
        {
          ...
        }
    
        private function doThat(...some Parameters...)
        {
          ...
        }
    
        private function doThisExtra(...some Parameters...)
        {
          ...
        }
    }
    

    我们都知道,我们不应该用 200 行代码来做一个函数,而应该把它分解成一些单独的函数,这样可以破坏代码并提高代码的可读性。现在通过封装,您可以将这些函数设为私有,这意味着外部人员无法访问它,以后当您想要修改一个函数时,当您看到 private 关键字时,您会非常高兴。

    (不好的方式)

    class User
    {
        public function doSomethingComplex()
        {
            // do everything here
            ...
            ...
            ...
            ...
        }
    }
    

    【讨论】:

      【解决方案3】:

      封装是一种将代码和它操作的数据绑定在一起的机制,可以保护两者免受外部干扰和误用。将数据和方法封装到一个单元(称为类)中称为封装。封装的好处是它执行里面的任务而不用担心。

      【讨论】:

        【解决方案4】:

        封装是将对象或数据作为属性存储在另一个对象中的一种方式,这样外部对象就可以完全控制内部数据或对象的访问方式。

        例如

        class OuterClass
        {
          private var $innerobject;
        
          function increment()
          {
            return $this->innerobject->increment();
          }
        }
        

        您在封装的对象周围有一个额外的层,它允许外部对象控制内部对象的访问方式。这与使内部对象/属性private 相结合,可以启用information hiding

        【讨论】:

          【解决方案5】:
          /* class that covers all ATM related operations */
          class ATM {
          
              private $customerId;
              private $atmPinNumber;
              private $amount;
          
              // Verify ATM card user
              public function verifyCustomer($customerId, $atmPinNumber) {
                  ... function body ...
              }
          
              // Withdraw Cash function
              public function withdrawCash($amount) {
                  ... function body ...
              }
          
              // Retrieve mini statement of our account
              public function miniStatement() {
                  ... function body ...
              }
          }
          

          在上面的例子中,我们已经用私有访问修饰符声明了所有的 ATM 类属性(变量)。它只是意味着外部世界的最终用户不能直接访问 ATM 类属性。因此,外部世界的最终用户无法直接更改或更新它们。

          更改类属性(数据)的唯一可能方法是方法(函数)。这就是我们使用公共访问修饰符声明 ATM 类方法的原因。用户可以将所需的参数传递给类方法以执行特定操作。

          这意味着用户没有 ATM 类的完整实现细节。它简称为数据隐藏。

          参考: http://www.thecreativedev.com/php-encapsulation-with-simple-example/

          【讨论】:

            【解决方案6】:

            人们似乎将面向对象的细节与封装混为一谈,这是一个更古老、更广泛的概念。封装的数据结构

            • 可以通过单个引用传递,例如增量(myDate) 而不是增量(年、月、日)
            • 在单个程序单元中存储了一组适用的操作 (类、模块、文件等)
            • 不允许任何客户端查看或操作其子组件 除了调用适用的操作

            您几乎可以用任何语言进行封装,并且在模块化和可维护性方面获得了巨大的好处。

            【讨论】:

              【解决方案7】:

              包装将数据成员和方法组合成一个单元(即类)称为封装封装就像封装在一个胶囊中。也就是将与一个对象相关的相关操作和数据封装到该对象中。 封装就像你的包,你可以在里面放你的笔、书等。这意味着这是封装成员和函数的属性。

              <?php
               class YourMarks
                {
                 private $mark;
                 public Marks
                {
                 get { return $mark; }
                 set { if ($mark > 0) $mark = 10; else $mark = 0; }
                }
                }
              ?>
              

              我给出了另一个现实生活的例子(日常使用),即“电视操作”。许多人在日常生活中操作电视。

              它是用盖子封装的,我们可以用遥控器操作,不需要打开电视和改变频道。 这里除了远程之外,一切都是私密的,因此任何人都可以访问而不是操作和更改电视中的内容。

              【讨论】:

                【解决方案8】:

                封装的反面是将变量传递给每个方法(如每个文件相关方法的文件句柄)或全局变量。

                【讨论】:

                • 封装的另一种替代方法是继承——即“扩展”包含数据的对象,而不是封装它。
                【解决方案9】:

                封装是对外界隐藏对象数据的过程,并且仅限于类成员访问。

                【讨论】:

                  【解决方案10】:

                  封装: - 将数据包装在单个单元中。我们也可以说隐藏了重要细节的信息。 例子:你有一部手机……那里有一些界面可以帮助你与手机交互,你可以使用手机的服务。但实际上在手机中工作是隐藏的。你不知道它在内部是如何工作的。

                  【讨论】:

                  • 好而简单的答案。谢谢!
                  【解决方案11】:

                  我更喜欢你的类的属性和方法的可见性。例如- - 民众 - 私人的 - 受保护

                  让我们来看一个真实的封装示例。

                   class MyClass{
                      private $name;
                  
                      public function showName($newName){
                          $this->name = $newName;
                          return $this->name;
                      }
                   }
                  
                  
                   //instantiate object
                  
                   $obj = new MyClass();
                   echo $obj->showName("tisuchi");
                  

                  在这种情况下,封装意味着,我们限制了一些属性。比如,name 属性,我们不能从类外部访问。另一方面,我们可以使用一个私有参数访问名为 showName() 的公共函数。

                  我更喜欢封装是-

                  您的属性和方法的可见性。

                  不过,如果您有任何深入了解封装的意图,我会参考我的基于封装的特别教程。

                  http://tisuchi.com/object-oriented-php-part-3-encapsulation-php/

                  希望,它会让您的概念更加清晰。玩得开心!

                  【讨论】:

                    【解决方案12】:

                    简单来说,这是我们定义属性和方法可见性的方式。在创建类时,您必须问自己可以在类之外访问哪些属性和方法。假设我们有一个名为 foo 的属性。如果一个类扩展了您的类,是否允许操作和访问 foo?如果有人创建了你的类的实例怎么办?是否允许他们操纵和访问 foo?

                    【讨论】:

                      【解决方案13】:

                      封装就是您希望对象/方法或属性/变量在应用程序中可见的方式。 例如, :

                      class ecap {
                      
                      public $name;
                      
                      private $id;
                      
                      protected $tax;
                      
                      }
                      

                      如果您想访问私有或受保护的属性,那么您必须在您的类中使用可从您的类外部访问的 getter 和 setter 方法。这意味着,您不能直接从类外部访问您的私有或受保护属性,但您可以通过任何方法使用。一起来看看——

                      在类中,添加以下方法:

                      class ecap 
                      {
                       public function userId(){
                       return $this->id;
                       }
                      } 
                      

                      我们可以像这样访问它:

                       $obj = new ecap();
                       echo $obj->userId();
                      

                      【讨论】:

                        【解决方案14】:

                        将数据封装在单个单元内称为封装。意味着方法和属性等类成员在类内部绑定在一起,以避免从外部访问。这是通过将类的变量和函数设为私有来完成的。

                        【讨论】:

                        • 是的,您给出了封装的定义?可以添加 PHP 示例吗?
                        猜你喜欢
                        • 2011-04-08
                        • 2012-04-12
                        • 1970-01-01
                        • 2014-09-11
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2010-09-19
                        • 1970-01-01
                        相关资源
                        最近更新 更多