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

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

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

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

Q&A

解決済

1回答

571閲覧

カプセル化するときのセッター・ゲッター

take_take_take_

総合スコア15

PHP

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

0グッド

1クリップ

投稿2019/07/25 10:10

PHPでMVCのフレームワークを自作しています。

ModelをさらにQuery、Entityの2つの名前空間に分けて、QueryでSQLを発行してDBからデータ取得し、
取得したデータをEntityに格納するという流れにしています。

この流れでやろうとしたときに、Entityのフィールドのセッター、ゲッターを作ると、使用するテーブルのカラム数分のフィールドと、ゲッターが必要になっている状況ですごくコードが長くなります。
(以下の例はサンプルで書いたので少ないですが)

特に何か不都合があるわけではないのですが、カプセル化するときのつくりってこういうものなのでしょうか?
もし別のやり方があるならば、教えていただきたいです。

PHPなのでマジックメソッドの__set()や__get()を使用すればいいのかもしれませんが、今回は使わずにやろうと思います。

よろしくお願いいたします。

php

1namespace Model\Entity; 2 3class SampleEntity extends Entity { 4/** 5 * Entityクラスの各フィールドがDBのテーブルの各カラムに対応しています 6 */ 7 private $field1 = null; 8 private $field2 = null; 9 private $field3 = null; 10 11/** 12 * QueryでDBから取得したデータを各フィールドに格納します 13 */ 14 public function setValues($values = null) { 15 if (!is_array($values)) { 16 return; 17 } 18 19 if (array_key_exists('column_name1', $values)) { 20 $this->field1 = $values['column_name1']; 21 } 22 if (array_key_exists('column_name2', $values)) { 23 $this->field2 = $values['column_name2']; 24 } 25 if (array_key_exists('column_name3', $values)) { 26 $this->field3 = $values['column_name3']; 27 } 28 } 29 30/** 31 * 以下、各ゲッターです 32 */ 33 public function getField1() { 34 return $this->field1; 35 } 36 37 public function getField2() { 38 return $this->field2; 39 } 40 41 public function getField3() { 42 return $this->field3; 43 } 44}

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

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

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

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

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

guest

回答1

0

ベストアンサー

多くのフレームワークではマジックメソッドで実装されています。
マジックメソッドで実装するしかないかと思います。

あとは単純に setField($name,$value)、getField($name)みたいな感じですかね

投稿2019/07/25 12:36

編集2019/07/25 12:42
mikkame

総合スコア5036

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

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

take_take_take_

2019/07/25 12:51

ご回答ありがとうございます! PHPでやってたらやっぱりマジックメソッドを使いますよね。。。 PHPだけの特殊なものだと思うので、できれば使わずにできたらなと思っての質問でした。 ご回答頂いたように、ゲッターも名前で指定して汎用的に使えるようにするのがよさそうですね。
m.ts10806

2019/07/25 13:04

おおよそ方針決まってきてそうなのでこちらにぶら下がらせていただきますが、子クラスには定義だけ持っておいて、 getter/setterは親クラス(Entity )に持っておいたほうがスッキリすると思います。配列をうまく使えばできますね。
take_take_take_

2019/08/25 08:32

すみません、長いこと気づいていませんでした。。。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問