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

2022-08-30 12:02:01

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


答案 1

封装只是在对象中包装一些数据。术语“封装”通常与“信息隐藏”互换使用。维基百科有一篇非常详尽的文章

以下是Google搜索“php封装”的第一个链接的示例:

<?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();

?>

答案 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行代码制作一个函数,而应该把它分解成一些单独的函数,这些函数会破坏代码并提高代码的可读性。现在,通过封装,您可以将这些函数设为私有,这意味着外部人员无法访问它,稍后当您想要修改函数时,当您看到私有关键字时,您会非常高兴。

(糟糕的方式)

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

推荐