web-dev-qa-db-ja.com

PHPの簡単な例でのカプセル化とは何ですか?

PHPの簡単な例でのカプセル化とは何ですか?

33
Moon

カプセル化は、オブジェクトの一部のデータをラップするだけです。 「カプセル化」という用語は、「情報隠蔽」と同じ意味で使用されることがよくあります。ウィキペディアには かなり徹底した記事 があります。

以下は 最初のリンク の例です 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();

?>
37
Jeremy Logan

カプセル化は、コードとそれが操作するデータを結び付けるメカニズムであり、外部の干渉や誤用から保護します。データとメソッドを単一のユニット(クラスと呼ばれる)にまとめることをカプセル化と呼びます。カプセル化の利点は、心配することなく内部でタスクを実行することです。

カプセル化は、クラスとデータ構造の保護メカニズムです。それはあなたの人生をずっと楽にします。カプセル化を使用すると、クラスのパラメーターとメソッドにアクセスして設定するコントロールを使用できます。どの部分が部外者に表示され、どのようにオブジェクトパラメータを設定できるかを制御することができます。

Accessおよびsettクラスのパラメーター

(良い方法)

<?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
        ...
        ...
        ...
        ...
    }
}
11
Saman Shafigh

カプセル化は、オブジェクトまたはデータをプロパティとして別のオブジェクトに格納する方法であり、外部オブジェクトが内部データまたはオブジェクトにアクセスできます。

例えば

class OuterClass
{
  private var $innerobject;

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

カプセル化されたオブジェクトの周りに追加のレイヤーがあり、外側のオブジェクトが内側のオブジェクトにアクセスする方法を制御できます。これは、内部オブジェクト/プロパティprivateの作成と組み合わせて、情報の隠蔽を有効にします。

7
thomasrutter

人々は、オブジェクト指向の詳細をカプセル化と混同しているようです。カプセル化は、はるかに古くて広い概念です。カプセル化されたデータ構造

  • たとえば、increment(year、month、day)ではなくincrement(myDate)のように、単一の参照で渡すことができます
  • 単一のプログラム単位(クラス、モジュール、ファイルなど)に保存された一連の適用可能な操作がある
  • 該当する操作を呼び出すことにより、クライアントがサブコンポーネントを参照または操作することを許可しない

ほぼすべての言語でカプセル化を行うことができ、モジュール化と保守性の面で大きなメリットを得ることができます。

3
Graham Perkins

ラッピングデータメンバーとメソッドを単一のユニット(つまり、クラス)にまとめることをカプセル化と呼びます。 カプセル化はカプセルに入れるようなものです。これは、オブジェクトに関連する関連操作とデータをそのオブジェクトに囲みます。カプセル化は、ペンや本などを保管できるバッグのようなものです。これは、これがメンバーと機能をカプセル化するプロパティであることを意味します。

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

私は別の実生活の例(毎日の使用)を与えています。これは「TV操作」です。多くの人々が日常生活でテレビを操作しています。

カバーでカプセル化されており、リモートで操作でき、テレビを開いてチャンネルを変更する必要はありません。ここでは、リモートを除くすべてがプライベートになっているため、誰でもアクセスしてテレビの操作や変更を行うことはできません。

3
Neha Sinha
/* 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/

3
Saifullah khan

カプセル化:-単一ユニットでのデータのラッピング。また、重要な詳細情報を隠すこともできます。 :あなたは携帯電話を持っています。..それは、携帯電話と対話するのに役立つインターフェースで、携帯電話のサービスを使用できます。しかし、携帯電話で実際に働いているのは非表示です。内部でどのように機能するかわかりません。

2
Qazi Ahmad

カプセル化は、オブジェクトのデータを外部から隠すプロセスであり、そのデータへのアクセスはクラスのメンバーに制限されています。

2

カプセル化の反対は、すべてのメソッドに変数を渡すようなもの(すべてのファイル関連メソッドへのファイルハンドルなど)またはグローバル変数です。

2
VVS

単純に、それはクラスのプロパティとメソッドの可視性です。例--パブリック-プライベート-保護

カプセル化の実際の例を見てみましょう。

 class MyClass{
    private $name;

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


 //instantiate object

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

この場合、カプセル化とは、一部のプロパティを制限することを意味します。名前プロパティのように、クラスの外部からはアクセスできません。一方、1つのプライベートパラメータでshowName()という名前のパブリック関数にアクセスできます。

単にカプセル化の方が好きなのは

プロパティとメソッドの可視性。

ただし、カプセル化をさらに理解する意図がある場合は、カプセル化に基づいた特別なチュートリアルを参照してください。

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

それがあなたのコンセプトをより明確にすることを願っています。楽しんで!

1
tisuchi

基本的には、プロパティとメソッドの可視性を定義する方法です。クラスを作成するときは、クラスの外部でアクセスできるプロパティとメソッドを自問する必要があります。 fooというプロパティがあるとします。クラスがクラスを拡張する場合、fooを操作およびアクセスできますか?誰かがあなたのクラスのインスタンスを作成したらどうなりますか? fooの操作とアクセスは許可されていますか?

0
Zaheer Babar

カプセル化は、オブジェクト/メソッドまたはプロパティ/変数をアプリケーションで表示する方法です。例えば、 :

class ecap {

public $name;

private $id;

protected $tax;

}

プライベートプロパティまたは保護されたプロパティにアクセスする場合は、クラスの外部からアクセスできるgetterおよびsetterメソッドをクラスで使用する必要があります。つまり、クラスの外部からプライベートまたは保護されたプロパティに直接アクセスすることはできませんが、どのメソッドを使用しても使用できます。見てみましょう-

クラスで、次のメソッドを追加します。

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

次のようにアクセスできます。

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

単一ユニット内のデータのラップアップはカプセル化と呼ばれます。メソッドやプロパティなどのクラスメンバーは、クラス内で一緒にバインドして、外部からのアクセスを回避することを意味します。これは、クラスの変数と関数をプライベートにすることによって行われます。

0