インクルード元を知りたい
- PHP5.2.4を使用しています。a.phpファイルにおいて先にinclude("b.php");があるのでc.phpファイル内でもclassBを認識できると思います。c.phpファイル内でb.phpファイルがどこでインクルードされたか(この例ではa.phpファイル)調べる方法なり関数というのはあるのでしょうか?
- PHP5.2.4を使用しています。c.phpファイルのコンストラクタでb.phpファイルにあるclassBを生成していますが、a.phpファイルにおいて先にinclude("b.php");があるのでc.phpファイル内でもclassBを認識できると思います。c.phpファイル内でb.phpファイルがどこでインクルードされたか(この例ではa.phpファイル)調べる方法なり関数はあるのでしょうか?
- PHP5.2.4を使用しています。c.phpファイル内でb.phpファイルがどこでインクルードされたか(この例ではa.phpファイル)調べる方法なり関数はあるのでしょうか?a.phpファイルにおいて先にinclude("b.php");があるのでc.phpファイル内でもclassBを認識できると思います。
- ベストアンサー
インクルード元を知りたい
PHP5.2.4を使用しています。 [a.php] <?php include("b.php"); include("c.php"); $c = new classC(); [b.php] <?php class classB { } [c.php] <?php class classC { public function __construct() { $c = new classB();//←b.phpファイルがどこでインクルードされたか知りたい } } という3つのファイルがあり、a.phpにアクセスするとします。 c.phpファイルのコンストラクタでb.phpファイルにあるclassBを生成していますが、 これはa.phpファイルにおいて先にinclude("b.php");があるので c.phpファイル内でもclassBを認識できると思います。 そこでc.phpファイル内でb.phpファイルがどこでインクルードされたか(この例ではa.phpファイル) 調べる方法なり関数というのはあるのでしょうか?
- takagoo100
- お礼率85% (739/868)
- PHP
- 回答数1
- ありがとう数2
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
b.phpで下記のようなコーディングをすれば、c.phpでb.phpのインクルード元を取得、出力することができますね。 $parentScript = $_SERVER["SCRIPT_NAME"]; 又は define("PARENT_SCRIPT", $_SERVER["SCRIPT_NAME"]);
関連するQ&A
- 配列であるメンバのコンストラクタを呼ぶ方法
C++のクラスについて教えていただけないでしょうか。以下のような場合、 class ClassA { int A; public: ClassA(int a): A(a) {} }; class ClassB { ClassA A; public: ClassB(): A(10) {} }; class ClassC { ClassA A[2]; public: ClassC() {} //配列であるメンバのコンストラクタを呼び出したい }; ClassBがClassAのコンストラクタを呼ぶには上記のような方法で良いと思うのですが、ClassCのようにメンバが配列の場合、そのメンバのコンストラクタを呼ぶにはどのようにしたら良いのでしょうか。ご教授をお願いします。
- ベストアンサー
- C・C++・C#
- PHP5でクラスを作成しています。
PHP5でクラスを作成しています。 コンストラクタの段階で論理エラーにしたくて、インスタンス値をnullにしたいです。 つまり直ちにプログラムを止めずに、クラスの生成(インスタンス化)を失敗させる 方法を__construct()関数内でどのように書けば良いのでしょうか? class Sample { function __construct() { // この中で処理の異常が発生! // インスタンス作成を失敗させる or インスタンス値をヌルにする。 //? //?どのように書けば?? //? } } $a = new Sample(); if ($a === null) { printf("正しくインスタンスの生成ができませんでした。"); } よろしくお願いします。
- 締切済み
- PHP
- オブジェクト指向の上手い使い方を教えてください
以下のような、クラスにまとめた処理を一度実行してるファイルがあります。 <?php class Hoge { public function __construct() { // 設定値 $this->a = 1; $this->b = 2; $this->c = 3; } public function main() { // 設定値を使った処理 print $this->a + $this->b + $this->c; } } // インスタンス生成・実行 $hoge = new Hoge(); $hoge->main(); ?> 設定値を変更して2回処理を行いたい場合、 一番スマートな形はどれになるか教えてください。 もしくは、それ以外の方法など。 1.設定値を引数で制御し、インスタンスを2回生成する (※設定値自体を引数に渡すことは考えてないです) <?php class Hoge { public function __construct($flg) { // 設定値 if ( $flg ) { $this->a = 1; $this->b = 2; $this->c = 3; } else { $this->a = 4; $this->b = 5; $this->c = 6; } } public function main() { // 設定値を使った処理 print $this->a + $this->b + $this->c; } } // インスタンス生成・実行 $hoge = new Hoge(true); $hoge->main(); // インスタンス生成・実行 $hoge = new Hoge(false); $hoge->main(); ?> 2.インスタンスの生成・実行は1度のままにし、クラスの処理を変更する <?php class Hoge { public function __construct() { // 設定値 $this->a = 1; $this->b = 2; $this->c = 3; $this->a2 = 4; $this->b2 = 5; $this->c2 = 6; } public function main() { // 設定値を使った処理 print $this->a + $this->b + $this->c; // 設定値の変更 $this->a = $this->a2; $this->b = $this->b2; $this->c = $this->c2; // 設定値を使った処理2回目 print $this->a + $this->b + $this->c; } } // インスタンス生成・実行 $hoge = new Hoge(); $hoge->main(); ?> 3.設定値を変更するメソッドを作り、呼び出す <?php class Hoge { public function __construct() { // 設定値 $this->a = 1; $this->b = 2; $this->c = 3; } public function change() { // 設定値変更 $this->a = 4; $this->b = 5; $this->c = 6; } public function main() { // 設定値を使った処理 print $this->a + $this->b + $this->c; } } // インスタンス生成・実行 $hoge = new Hoge(); $hoge->main(); $hoge->change(); $hoge->main(); ?> 4.子クラスを作り、2回インスタンス生成・実行を行う <?php class Hoge { public function __construct() { // 設定値 $this->a = 1; $this->b = 2; $this->c = 3; } public function main() { // 設定値を使った処理 print $this->a + $this->b + $this->c; } } class Hoge2 extends Hoge{ public function __construct() { parent::__construct(); // 設定値 $this->a = 4; $this->b = 5; $this->c = 6; } } // インスタンス生成・実行 $hoge = new Hoge(); $hoge->main(); // インスタンス生成・実行 $hoge = new Hoge2(); $hoge->main(); ?> 5.設定値だけ異なるファイルを作りそれぞれ実行する ※省略 よろしくお願いします。m(__)m
- 締切済み
- PHP
- 外部ファイルのクラスのインスタンスが生成できない
いつもお世話になっております。 PHP(Ver5.2)が利用できるレンタルサーバーを借りていろいろやっているのですが、 include_once した外部PHPファイルの中のクラス定義のコンストラクタがCallされません。 //外部クラスの記述 class A{ public function __construct(){ echo "OK"; } } //メインPHPの記述 include_once "xxx.php"; $obj = new A(); ↑におけるメインPHPをブラウザから呼び出したとき、本来なら OK とechoされるはずなのに、何も表示されません。 また、クラスAに定義したpublicなfunctionをCallしようとすると、定義されてないメソッドをCallした、とエラーになります。(インスタンス自体が生成されていない??) ファイル自体は正常にIncludeされていると思います。(ファイル名を間違ったらエラーになったから) ちなみに、クラスAの記述をメインPHPに記述すると、正常に動きます。 外部ファイルのクラスを正常に動かすにあたって、何かphp.iniあたりの編集が必要なのでしょうか? どうぞよろしくお願いいたします。
- 締切済み
- PHP
- 【PHP】コンストラクタ―について
コンストラクタ―について検索して調べると概ね以下のように説明されています。 ---------------------------------- コンストラクタ インスタンス生成時にオブジェクトを初期化したい場合にコンストラクタメソッドを使用できます。 コンストラクタメソッドは以下のように引数を指定する事もでき、インスタンス生成時に__construct()が自動的に実行されます。 ---------------------------------- イマイチ判然としません。 「newによってインスタンスを作成される時に自動的に呼び出されるもの」と自分では解釈していました。 例えば以下のような場合 public function __construct($text) { $this->text = $text; } 【$text】の値をnewされることによって自動的に「保持」されるということなのでしょうか? 実際に表示させるときは【$posts[0]->show();】(show()メソッド)で表示させるわけですよね? その上には【private $text;】でプロパティがあります。 ごく基本的な質問かと思いますが、【public function __construct($text)】 コンストラクタ―を作成する理由がよくわかりません。 初学者でも分かりやすいように解説していただけないでしょうか? 宜しくお願い致します。 <記述サンプル> ------------------------------- <?php class Post { private $text; public function __construct($text) { $this->text = $text; } public function show() { printf('%s' . PHP_EOL, $this->text); } } class SponsoredPost extends Post { private $sponsor; public function __construct($text, $sponsor) { parent::__construct($text); $this->sponsor = $sponsor; } public function showSponsor() { printf('%s', $this->sponsor); } } $posts = []; $posts[0] = new Post('hello'); $posts[1] = new Post('hello again'); $posts[2] = new SponsoredPost('hello hello', 'Yahoo'); $posts[0]->show(); $posts[1]->show(); $posts[2]->show(); $posts[2]->showSponsor();
- ベストアンサー
- PHP
- 継承元クラスのプロパティを参照する手段
お世話になります。 ActionScrip3に関する質問です。 現在、カスタムクラスを勉強しております。 外部クラスでClassA、ClassBを作成し、 ClassAにある処理の途中でClassBを実行し、ClassBの中からClassAのプロパティを参照しにいく 処理を行いたいと思い、ClassBのコンストラクタからClassAのプロパティをtraceしました。 プロパティppt2は「かきくけこ」が出力されましたが、ppt1は「null」になってしまいました。 恐らく、タイムラインからClassAに対して設定したプロパティの値は見にいけていないようですが、 タイムラインから設定したプロパティの値を継承したClassBから参照しにいく方法はありますでしょうか? 下記ソースと同じ方法でなくても結構ですので、タイムラインから設定した スーパークラスのプロパティ値をサブクラスから参照・変更できる方法を ご教授いただければと存じます。 お手数ではありますが、宜しくご教授ください。 宜しくお願いいたします。 /* タイムライン側の処理 -----------------------*/ var test:ClassA = new ClassA(); test.ppt1 = "あいうえお"; test.goNext(); /* ClassAの処理 -----------------------*/ package { // インポート記述は省略 public class ClassA { var ppt1:String; var ppt2:String = "かきくけこ"; // コンストラクタ public function ClassA() { } public function goNext():void { var classb:ClassB = new classB(); } } } /* ClassBの処理 -----------------------*/ package { // インポート記述は省略 public class ClassB extends ClassA { // コンストラクタ private function ClassB() { trace(ppt1); trace(ppt2); } } }
- ベストアンサー
- Flash
- Rails AR 深い階層のテーブル参照
Rails ActiveRecord において、 深い階層のテーブルを参照するのに有効な方法はないでしょうか? 例:下記の構造で classD から classAのnameを取得する。 classA 1→n classB 1→n classC 1→n classD □classA id name □classB id name class_a_id □classC id name class_b_id □classD id name class_c_id #前提条件 classC, classB, classAが必ずしも存在するとは限らない。 classDからclassAを参照する際に、#前提条件にあるように、 classB or classCが存在しない(nil)場合、 > class_d.class_c.class_b.class_a.name とするとエクセプションが発生しますが、 これを回避するために、 if class_d.class_c and class_d.class_c.class_b and class_d.class_c.class_b.class_a class_d.class_c.class_b.class_a.name end のようにしていますが、煩わしくてしかたがありません。 実際はエラーログ出力等行っているため、さらに複雑な処理になっています。 もっとスマートなコーディング方法やアドバイスがありましたら宜しくお願いします。 #補足 (1) has_many :through を使ってショートカットが作れることを知りましたが、 今回の例のように、複数階層となる場合の記述方法がわかりません。 ご存知の方回答お願いいたします。 (2) そもそも前提条件に問題があるのではないかとも思っています。 前提条件にあるような状態にならない様な仕組みにする、 もしくは、そのような状態にならないよう管理する、等すべきでしょうか? 以上宜しくお願いいたします。
- ベストアンサー
- Ruby
- クラスについて
クラスについてご教示下さい。 ------------------------------ 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を呼び出すにはどうすればよいのでしょうか? そもそも呼び出せるのでしょうか? お忙しいところ申し訳ありませんが、ご教示お願いいたします。
- ベストアンサー
- PHP
- include先でのinclude元の変数について
度々お世話になっています。 include先でのinclude元の変数の扱いについて疑問に思ったので質問させて下さい。 include元ファイルtest.php include先ファイルinclude.phpとしてtest.php内の変数をinclude.phpに渡したいと考え以下のコードを書きました。 test.php <?php $test = "いけるかな?"; include "include.php"; ?> include.php <?php echo $test; ?> 結果、$testの値を表示する事が出来なかったのですが、$testの値を表示するためにはどのような記述方法があるのでしょうか? また、このような動作を期待している理由としてはPHP部分とHTMLを分離させたいと考えており、ユーザ定義関数に変数を引数として渡して、出力処理をユーザ定義関数内で行うという事も考えたのですが、include先に値を渡す事が出来れば、非常にわかりやすく分離出来ると考えたからです。 他に、PHP部分とHTML部分をファイル分けするやり方などありましたら教えて頂けますとうれしいです。
- ベストアンサー
- PHP
- includeすると?が入る
win2000、PHP5.3.0にて、includeをすると?が入ってしまいます。 具体的には -- a.php -- <?PHP print "A"; include 'b.php'; print "B"; ?> -- b.php -- C <?PHP print "D"; ?> E -- 結果 -- A?C DE B ブラウザ上ではこの?が見えないのですが、ソース上ではあります。 この?を何とかしたいのですが、これは何かの設定ですか?仕様ですか?不具合ですか?
- ベストアンサー
- PHP
お礼
ご返答ありがとうございます。 なるほど、たしかにこのやり方で取得することができました。