- ベストアンサー
クラスについて
クラスについてご教示下さい。 ------------------------------ main.php ------------------------------ <?php include("./a.php"); include("./b.php"); ・ ・ ・ $a_class = new a; $b_class = new b; $b_class->view_sum; ・ ・ ・ ?> ------------------------------ a.php ------------------------------ <?php class a { VAR $int1 = 10; VAR $int2 = 5; function exec_sum(){ $int_sum = $int1 + $int2; return $int_sum } function XXXXXX(){ ・ ・ ・ } } ?> ------------------------------ b.php ------------------------------ <?php class b { function view_sum(){ ※クラスaのexec_sumを呼び出した結果を表示したい。 print ○○○; } function YYYYYY(){ ・ ・ ・ } } ?> ------------------------------------ として結果として15を表示したいと思っております。 ※あくまでの上記動作の可否を知りたいため、ロジックの構成については仕方なくです。。。すみません。 クラスを宣言するmain.phpではすでにclass_a, class_bで宣言していることが前提となります。 この場合、class_bから、class_aのfunctionを呼び出すにはどうすればよいのでしょうか? そもそも呼び出せるのでしょうか? お忙しいところ申し訳ありませんが、ご教示お願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
__autoload() をオーバーライドします。 A.php // クラスファイルのオートロード require_once($_SERVER['DOCUMENT_ROOT']."/common/Autoload.class.php"); function __autoload($className) { $folder = autoload::searchClass($className); if($folder) { require_once($folder.$className.".class.php"); } else { echo "クラス名".$className."は見つかりません。"; } } $_SERVER['DOCUMENT_ROOT']."/common/Autoload.class.phpに、以下の通り書きます。 // クラスファイルのオートロード class Autoload { // 指定したディレクトリ以下の全てのディレクトリから該当するクラスを検索 function searchClass($className, $sub = "/") { $dir = dir($_SERVER['DOCUMENT_ROOT']."/.$sub); if(file_exists($_SERVER['DOCUMENT_ROOT']."/.$sub.$className.".class.php")) return $_SERVER['DOCUMENT_ROOT'.$sub; while(false !== ($folder = $dir->read())) { if($folder != "." && $folder != "..") { if(is_dir($_SERVER['DOCUMENT_ROOT']."/.$sub.$folder)) { $subFolder = self::searchClass($className, $sub.$folder."/"); if($subFolder) { return $subFolder; } } } } $dir->close(); return false; } } と、該当クラスが見つかるまで再起呼び出しを続け、ディレクトリを片っ端から開けていきます。こうすればインクルードを共通化できます(A.phpをインクルードすればよい)。が、システムの規模が大きくなるとちょっと見通しが悪くなります。 クラスファイルは全てXXX.class.php などとして統一します。
その他の回答 (2)
- k17s
- ベストアンサー率47% (9/19)
PHPを勉強中の者です。 あくまで自分の場合ですが、以下のようにしてます。 $b_class->view_sum($a_class->exec_sum()); 又は$b_class->view_sum($a_class);として function view_sum($a_class){ print $a_class->exec_sum(); } クラスBにてAクラスの関数をたくさん必要とするのであれば継承させてみたり・・・等。 でもなんとなくスマートな感じがしないので識者の回答を参考にされた方がいいと思います。自分も興味があったのでコメントさせていただきました。
- yambejp
- ベストアンサー率51% (3827/7415)
こんな風にします。 (b.phpでa.phpを使う前提であれば、やはりinclude_onceすべきでしょう) //main.php <? include_once "./a.php"; include_once "./b.php"; $a_class = new a; $b_class = new b; $b_class->view_sum(); ?> //a.php <? class a{ VAR $int1 = 10; VAR $int2 = 5; function exec_sum(){ $int_sum = $this->int1 + $this->int2; return $int_sum; } } ?> //b.php <? include_once "./a.php"; class b{ function view_sum(){ $this->a=new a; print $this->a->exec_sum(); } } ?> またはextendsしてもよいでしょう(私はあまり使いませんが) //b.php <? include_once "./a.php"; class b extends a{ function view_sum(){ print $this->exec_sum(); } } ?>