質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

986閲覧

phpをやっていてカプセル化がわかりません。

satakehirohumi

総合スコア9

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/04/28 16:05

編集2020/04/28 16:51

phpをやっていてカプセル化がわかりません。

カプセル化をしないと値が変更されてしまう可能性があると書いてありましが、値が変更されてしまう場合というのはどのような時ですか?具体的なプログラミングを用いて教えてもらえるとたすかります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/04/28 23:50

自身が調べたこと試したことを記載してください。 「これがなければアプリケーションができない」というようなものではないので、盛り込むのが必須と言うわけではありません。 それも含めて「採用可否」も検討必要があるので(オブジェクト指向自体もそうですが)、全体的なクラス設計などする段階で考慮すべきものだったりします。つまり、「カプセル化って何」だけを理解しても使えないということですね
guest

回答1

0

こんな感じで分かりますか?
カプセル化しても値は変更できます。想定外の使い方をされないようにするのがポイントです。

publicはガードがまったくできませんし、
ただアクセッサーを用意しただけでは、そのクラスの仕様をしらないと正しく利用できない可能性があります。
※よくある、このメソッドを呼んだら、このメソッドをあわせて呼べみたいなやつ

仕様をメソッドにうまく隠ぺいすることをカプセル化といいます。

PHP

1class Worst 2{ 3 public $speed = 0; 4 public $fuel = 100; 5} 6 7class NoGood 8{ 9 private $speed = 0; 10 private $fuel = 100; 11 12 public function setSpeed($speed) { 13 if ($speed < 0) return; 14 15 $this->speed = $speed; 16 } 17 public function setFuel($amount) { 18 if ($amount < 0) return; 19 20 $this->fuel = $amount; 21 } 22} 23 24class Better 25{ 26 private $speed = 0; 27 private $fuel = 100; 28 29 public function speedUp() { 30 $this->fuel -= 1; 31 $this->speed += 1; 32 } 33 public function speedDown() { 34 $this->speed -= 1; 35 } 36} 37

追記

想定外の使われ方をされないためと書いてありますが、それはどのような時ですか?

プログラム内での処理の中でされるのか、それともこのサービスを使ってるユーザーによる想定外の入力によってなのか、教えていただけたら助かります。

"プログラム内での処理の中でされる"方です。
想定外の入力というより(入力も含みますが)、利用方法です。
サンプルの例だとスピードをあげたら、燃料を減らす処理が必要という仕様がある前提で
カプセル化をしないと、燃料を減らす処理を、そのクラスを利用するプログラマが書かないと上記の仕様が満たされません

docコメントに、setSpeedを呼んだら、それに合わせてsetFuelを呼び出してください
なんてのがあったらカプセル化できていないと思っていいです。

クラス化やカプセル化は、そもそもプログラミングの技術・技法の話でプログラマ向けの話です。
そもそもユーザには関係ない話だと思いますが・・・

サービスという表現が気になります。webサービス、WebAPIのようなものを想定しているのでしたら、
それらは基本的にカプセル化されているはずです(厳密にはカプセル化という表現は誤解を招くと思いますが)

WebAPIで、このAPIをたたく前に、これをして・・・あれをして・・・というのがあれば設計がダサイ。

内部の暗黙のルール(仕様)を外部に公開せずに利用できるようにメソッドを作成/公開することをカプセル化といいます。

変数をprivateにしてアクセッサーを用意することをカプセル化という説明を見たことがありますが、
かなり説明不足だと思います。

投稿2020/04/28 20:54

編集2020/04/29 13:10
momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

satakehirohumi

2020/04/29 12:10

回答ありがとうございます! 想定外の使われ方をされないためと書いてありますが、それはどのような時ですか? プログラム内での処理の中でされるのか、それともこのサービスを使ってるユーザーによる想定外の入力によってなのか、教えていただけたら助かります。
momon-ga

2020/04/29 12:50

"プログラム内での処理の中でされる"方です。 想定外の入力というより(入力も含みますが)、利用方法です。 サンプルの例だとスピードをあげたら、燃料を減らす処理が必要という仕様がある前提で カプセル化をしないと、燃料を減らす処理をプログラマが書かないと上記の仕様が満たされません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問