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

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

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

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

Q&A

解決済

1回答

4087閲覧

[PHP]親クラスのconstructに引数を渡し、処理結果をprotectedの変数に格納し、小クラスから変数を呼び出す場合の考え方

junkboy

総合スコア45

PHP

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

0グッド

0クリップ

投稿2015/12/17 09:12

オブジェクト指向、MVCについて勉強中です。

ソースに難があるため、便宜的にDB接続をする体で説明させていただきます。

例えばDBに接続するためのクラスを作り、ユーザー名とパスワードを引数として受け取りconstructで処理します。

lang

1namespace app\Model; 2 3class Db { 4 protected $db; 5 public function __construct($db_user, $db_pass) { 6 try { 7 $this->db = new \PDO(PDO_DSN, $db_user, $db_pass); 8 } catch (\PDOException $e) { 9 echo $e->getMessage(); 10 exit; 11 } 12 } 13}

次にDBクラスを継承した、小クラスを作成。

lang

1namespace app\Model\Db; 2 3class Serch extends \app\Model\Db { 4 public function hoge_serch() { 5 $sql = "select * from table"; 6 $stmt = $this->db->prepare($sql); 7 $stmt->execute(); 8 } 9}

最後にこれを実行する処理ですが、ここでどのように考えて良いのかわからず、躓いています。
下記のソースを実行すると、引数が指定されてないよ、というエラーが出力されます。

__Warning: Missing argument 1 for app\Model\Db::__construct()

lang

1$db_user = hoge_user; 2$db_pass = hoge_pass; 3 4$hoge = new app\Model\Db\Serch; 5$hoge->hoge_serch($db_user, $db_pass);

instanceDB = new app\Model\DB($db_user, $db_pass)

とすればclassDBの$dbに指定した引数を元に実行した結果が格納されるのは、確認しているのですが、小クラスから実行した場合、どのような考え方をすれば良いのかわかりません。

もしくは、親クラスに引数を渡して処理を行なうような考え方はトリッキーな部類になりますでしょうか。

宜しくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

子クラス Serchでコンストラクタが指定されていないので、親クラスのコンストラクタと同じコンストラクタを持っていることなります。なので

PHP

1$db_user = hoge_user; 2$db_pass = hoge_pass; 3 4$hoge = new app\Model\Db\Serch($db_user, $db_pass); 5$hoge->hoge_serch();

とするのが一般的なアプローチになるかと思います。

投稿2015/12/17 09:25

tanat

総合スコア18711

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

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

junkboy

2015/12/18 00:20

小クラスのインスタンスを作るタイミングで、引数を渡してやると、親クラスのconstructで処理されるのですね。 初歩的な質問にご回答いただき、ありがとうございます、大変助かりました:)
tanat

2015/12/18 00:40

> 小クラスのインスタンスを作るタイミングで、引数を渡してやると、親クラスのconstructで処理されるのですね。 少しニュアンスが違います。 コンストラクタに限らず親で指定されていて子で指定されていないメソッドについて子は親と同じメソッドを持っているものとして扱われます。 そしてコンストラクタはnewする時に自動的に呼び出されるメソッドです。 なのでこの場合、(親と全く同じ)子クラスのコンストラクタが呼び出されて処理されています。引数は渡しても渡さなくてもコンストラクタは処理されますが、引数が無いとエラーが発生します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問