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

时间:2009-06-12 06:44:15

标签: php encapsulation

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

14 个答案:

答案 0 :(得分:36)

封装只是将一些数据包装在一个对象中。术语“封装”通常与“信息隐藏”互换使用。维基百科有a pretty through 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();

?>

答案 1 :(得分:11)

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

答案 2 :(得分:10)

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

访问和设置课程参数

(好方法)

openssl rsa -in src/test/resources/key.pem -pubout -outform DER -out src/test/resources/cert.der

openssl pkcs8 -topk8 -inform PEM -outform DER -in key.pem -nocrypt -out key.der 

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

<?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;
    }
}

(坏道)

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

$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';

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

(坏道)     

<?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...)
    {
      ...
    }
}

答案 3 :(得分:7)

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

例如

class OuterClass
{
  private var $innerobject;

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

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

答案 4 :(得分:3)

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

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

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

答案 5 :(得分:3)

/* class that covers all ATM related operations */
class ATM {

    private $customerId;
    private $atmPinNumber;
    private $amount;

    // Varify ATM card user
    public function verifyCustomer($customerId, $atmPinNumber) {
        ... function body ...
    }

    // Withdraw Cash function
    public function withdrawCash($amount) {
        ... function body ...
    }

    // Retrive mini statement of our account
    public function miniStatement() {
        ... function body ...
    }
}

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

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

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

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

封装是将对象的数据从外部世界隐藏的过程,对它的访问仅限于该类的成员。

答案 8 :(得分:2)

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

答案 9 :(得分:2)

将数据成员和方法一起包装成单个单元(即Class)称为 Encapsulation 封装就像封装在一个胶囊中。这是将与对象相关的相关操作和数据包含在该对象中。 封装就像你的包,你可以保存你的笔,书等。这意味着这是封装成员和功能的属性。

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

我正在提供另一个现实生活的例子(日常使用),即“电视操作”。许多人在日常生活中经营电视。

它采用封面封装,可以远程操作,无需打开电视和更换频道。 除了遥控器外,所有东西都是私密的,所以任何人都可以访问不操作和改变电视中的东西。

答案 10 :(得分:1)

我只是希望能看到你班级的财产和方法。例如-  - 上市  - 私人的   - 受保护

让我们来看看封装的真实例子。

 class MyClass{
    private $name;

    public function showName($newName){
        $this->name = $newName;
        return $this->name;
    }
 }


 //instantiate object

 $obj = new MyClass();
 echo $obj->showName("tisuchi");

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

我更喜欢封装的是 -

您的财产和方法的可见性。

虽然,如果您有任何意图进一步理解封装,我会参考基于封装的特殊教程。

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

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

答案 11 :(得分:0)

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

答案 12 :(得分: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();

答案 13 :(得分:0)

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