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

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

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

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PHP

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

Q&A

解決済

2回答

6015閲覧

[PHP]親クラス内で生成したインスタンスは、親クラスのメンバ変数にアクセスできますか?

RioNishino

総合スコア36

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

PHP

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

0グッド

0クリップ

投稿2015/06/17 08:36

編集2015/06/17 08:54

親クラスのメソッド内で生成した子クラスのインスタンスは、親クラスのメンバ変数にアクセスできるのでしょうか?

以下がソースコードです

lang

1 2// 親クラス 3class Parent { 4 5 public $db; 6 7 function __construct() { 8 $this->db = new Database(); 9 } 10 11 public function create_child() { 12 require_once(dirname(__FILE__)."Child.php"); 13 $child = new Child(); 14 $child->show_data(); 15 } 16} 17 18// 子クラス 19class Child extends Parent { 20 21 public function show_data() { 22 $this->db->select_query(); 23 // DBからデータを取得する処理 24 } 25 26}

上記のようにParentクラスで生成したDatabaseクラスに、Childクラスからアクセスしたいのですが、記載したソースコードでは動きません。

何かソースコードを見て、間違えてる点や、他に良い方法があればご教示ください。

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

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

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

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

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

guest

回答2

0

Database()のクラスが未定義とかじゃなくてですか?

publicがついてるなら、参照できると思いますよ。
単純に生成されてないとか、エラーがでてるとかです?

投稿2015/06/17 09:49

MasaakiIrie

総合スコア1021

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

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

nanndemoiikara

2015/06/17 09:52

Fatal error: Call to a member function select_query() on a non-object in というエラーですのでDatabaseクラスが未定義ではなくメソッドが未定義の可能性があるかと思っております。
MasaakiIrie

2015/06/17 09:53

そのようですね・・・ メソッドがないですね。
MasaakiIrie

2015/06/17 09:54

class Database{ public function select_query() { // DBへ送信するコード } } ですね。
RioNishino

2015/06/17 10:03

回答ありがとうございます。 select_query()というメソッドは定義されています。 以下のようなコードなら動くのですが、、、 class Child extends Parent {   public $db2; function __construct() { $this->db2 = new Database(); } public function show_data() { $this->db2->select_query(); // DBからデータを取得する処理 } } このようにChildクラスでインスタンス化すれば処理が走るのですが、親クラスのメンバ変数にアクセスしようとするとエラーになってしまうのです。
nanndemoiikara

2015/06/17 10:09

では、Childクラスでインスタンス化せずにvar_dump($this->db);をするとどうなりますか?
RioNishino

2015/06/17 23:37

var_dump($this->db)だとNULLと表示されます。
nanndemoiikara

2015/06/18 00:04

それだと$this->dbのなかにDatabaseクラスがインスタンス化されてないのでエラーが発生して当たり前だと思います。 他のところを見なおしてください。
MasaakiIrie

2015/06/18 00:15

class Parents { //fuck!! public db; public $db; function __construct() { $this->db = new Database(); // ログを入れてみましょう } まずは、$dbが作られてるかどうか見てみましょう。
RioNishino

2015/06/18 08:35

Parentクラスで「var_dump($this->db)」で中身を表示すると、object(Database)#2 (1) { ["database"]=> NULL }と表示されるので、インスタンスは生成されていると思います。
nanndemoiikara

2015/06/18 09:23

> Parentクラスで「var_dump($this->db)」で中身を表示すると、object(Database)#2 (1) { ["database"]=> NULL }と表示されるので、インスタンスは生成されていると思います。 これは、NULLではないですよね? new Databaseのインスタンス化する時に引数でconfigデータを渡してDBと接続させたインスタンスが生成されるとかではないでしょうか?(あくまで憶測です。Databaseの中を読んで判断して下さい。) FWは何をお使いなんですか?
guest

0

ベストアンサー

lang

1<?php 2//fuck!! class Parent { 3class Parents { 4 5 //fuck!! public db; 6 public $db; 7 8 function __construct() { 9 $this->db = new Database(); 10 } 11 12 public function create_child() { 13 require_once(dirname(__FILE__)."Child.php"); 14 //fuck!! child = new Child(); 15 $child = new Child(); 16 $child->show_data(); 17 } 18} 19 20// 子クラス 21//fuck!! class Child extends Parent { 22class Child extends Parents { 23 24 public function show_data() { 25 $this->db->select_query(); 26 // DBからデータを取得する処理 27 } 28 29} 30 31//add 32class Database{ 33 public function select_query() 34 { 35 echo 'yahoo'; 36 } 37} 38 39$child = new Child(); 40$child->show_data();

fuckってコメントのところです。

その2

lang

1<?php 2class Parents { 3 4 public $db; 5 6 function __construct() { 7 $this->db = new Database('Fuck'); 8 } 9 10 public function create_child() { 11 require_once(dirname(__FILE__)."Child.php"); 12 $child = new Child(); 13 $child->show_data(); 14 } 15} 16 17 18class Child extends Parents { 19 20 21 public function show_data() { 22 $this->db->select_query(); 23 } 24 25} 26class Database{ 27 private $hoge; 28 29 function __construct($a) 30 { 31 $this->hoge = $a; 32 } 33 34 public function select_query() 35 { 36 var_dump($this->hoge); 37 } 38} 39 40$parents = new Parents(); 41$parents->create_child(); 42

投稿2015/06/17 08:38

編集2015/06/17 09:14
nanndemoiikara

総合スコア775

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

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

RioNishino

2015/06/17 08:59

回答ありがとうございます。 いくつかのタイプミス、申し訳ありませんでした。 ソースコードを見ていただけると分かると思うのですが、掲載していただいたコードのように他のところでChildクラスを利用するわけではなく、Parentクラスのcreate_child() というメソッド内でChildクラスのshow_data()を利用したいのです。 そうすると$dbが利用できないのです。
nanndemoiikara

2015/06/17 09:12

その2が動きます。 string(4) "Fuck" となるかと思います。
RioNishino

2015/06/17 09:35

またまた申し訳ありません。 上記のコードでを実行すると、思い通りに実現されるのですが、私のプログラムだとうまく動きません。ちなみに「Fatal error: Call to a member function select_query() on a non-object in 」というエラーが表示されます。
nanndemoiikara

2015/06/17 09:44

child classで呼び出しているdb内のselect_queryメソッドが存在しないよというエラーが発生しておりますね。 申し訳ございません。現在の情報だけでは調べようがございません。
RioNishino

2015/06/17 10:05

select_queryメソッドは存在しているのですが、エラーが出ています。 何度もご回答いただきありがとうございました。 実現できることが分かっただけでも、勉強になりました。 感謝申し上げます。
RioNishino

2015/06/18 09:32

申し訳ありません。解決できました。 これまでのコードを一度消して、nanndemoiikaraさんのソースコードを真似て作ったら、成功しました。 何度も親切に対応していただき有難うございました。 大変勉強になりました。 心より感謝いたします。
nanndemoiikara

2015/06/18 09:50

解決してなによりです。 後学のため、お時間ございましたら何が原因であったかを教えて頂けますと幸いでございます。 何卒よろしくお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問