39

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

4

14 回答 14

39

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

以下是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();

?>
于 2009-06-12T06:49:02.840 回答
20

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

访问和设置类参数

(好办法)

<?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
        ...
        ...
        ...
        ...
    }
}
于 2015-07-28T03:56:02.323 回答
11

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

于 2010-05-26T07:24:16.587 回答
8

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

例如

class OuterClass
{
  private var $innerobject;

  function increment()
  {
    return $this->innerobject->increment();
  }
}

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

于 2009-06-12T06:52:10.383 回答
4
/* 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/

于 2018-05-08T08:09:59.677 回答
3

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

  • 可以使用单个引用传递,例如 increment(myDate) 而不是 increment(year,month,day)
  • 具有存储在单个程序单元(类、模块、文件等)中的一组适用操作
  • 不允许任何客户端查看或操作其子组件,除非通过调用适用的操作

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

于 2012-11-13T17:08:26.580 回答
3

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

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

我再举一个现实生活(日常使用)的例子,那就是“电视操作”。许多人在日常生活中操作电视。

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

于 2017-03-07T06:38:48.547 回答
2

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

于 2014-08-20T16:53:09.867 回答
2

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

于 2014-01-16T06:59:34.230 回答
2

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

于 2009-06-12T06:52:03.770 回答
1

只是我更喜欢你的类的属性和方法的可见性。例如--公共-私有-保护

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

 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/

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

于 2014-08-26T16:56:35.567 回答
0

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

于 2015-04-09T05:29:20.257 回答
0

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

于 2019-06-18T18:49:48.057 回答
0

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

class ecap {

public $name;

private $id;

protected $tax;

}

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

在类中,添加以下方法:

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

我们可以像这样访问它:

 $obj = new ecap();
 echo $obj->userId();
于 2015-10-20T10:09:12.673 回答