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

33 php encapsulation

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

Jer*_*gan 37

封装只是将一些数据包装在一个对象中.术语"封装"通常与"信息隐藏"互换使用.维基百科有一篇很好的文章.

以下是Google搜索"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();

?>
Run Code Online (Sandbox Code Playgroud)

  • 嗨,fixedd,我不认为这是在 php 中封装的一个好的和简单的例子。对于初学者来说,很难理解单例的概念。 (3认同)

Sam*_*igh 12

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

访问和设置类参数

(好办法)

<?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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

$user = new User();
$user->setGender('male');

// An exception will throw and you can not set 'Y' to user gender
$user->setGender('Y');
Run Code Online (Sandbox Code Playgroud)

(坏道)

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

<?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';
Run Code Online (Sandbox Code Playgroud)

访问类方法

(好办法)

<?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...)
    {
      ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

(坏道)

class User
{
    public function doSomethingComplex()
    {
        // do everything here
        ...
        ...
        ...
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 11

封装是将代码及其操作的数据绑定在一起的机制,并保护它们免受外部干扰和误用.将数据和方法包装到单个单元(称为类)中称为封装.封装的好处是它可以执行内部任务而不会让您担心.


tho*_*ter 7

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

例如

class OuterClass
{
  private var $innerobject;

  function increment()
  {
    return $this->innerobject->increment();
  }
}
Run Code Online (Sandbox Code Playgroud)

在封装的对象周围有一个额外的层,它允许外部对象控制如何访问内部对象.这与内部对象/属性相结合private,可以实现信息隐藏.