デフォルトの定義済みクラスについて

このQ&Aのポイント
  • デフォルトの定義済みクラスについての質問です。
  • 自分で定義したクラスの継承関係を調べるためのスクリプトを実行するとエラーが発生します。
  • 本を書いた人がデフォルトの定義済みクラスを除外するために特定の条件を使用した理由について質問しています。
回答を見る
  • ベストアンサー

デフォルトの定義済みクラスについて

自分で定義したクラスの継承関係やらを出力するサンプルスクリプトがあったので、それをまる写しして動かしたところ、エラーがおこりました。以下のスクリプトがそれです。 <?php function get_methods($object){ $methods=get_class_methods(get_class($object)); if(get_parent_class($object)){ $parent_methods=get_class_methods(get_parent_class($object)); $methods=array_diff($methods,$parent_methods); } return $methods; } function get_inherited_methods($object){ $methods=get_class_methods(get_class($object)); if(get_parent_class($object)){ $parent_methods=get_class_methods(get_parent_class($object)); $methods=array_intersect($methods,$parent_methods); } return $methods; function get_lineage($object){ if(get_parent_class($object)){ $parent=get_parent_class($object); $parent_object=new $parent; $lineage=get_lineage($parent_object); $lineage[]=get_class($object); } else{ $lineage=array(get_class($object)); } return $lineage; } function get_child_classes($object){ $classes=get_declared_classes(); $children=array(); foreach($classes as $class){ if(substr($class,0,2)=='__'){ //ここに問題があるようです。 continue; } $child=new $class; //ここで「引数が無効」のエラーになります。 if(get_parent_class($child)==get_class($object)){ $children[]=$class; } } return $children; } function print_object_info($object){ $class=get_class($object); echo '<h2>クラス</h2>'; echo "<p>$class</p>"; echo '<h2>継承関係</h2>'; echo '<h3>親クラス</h3>'; $lineage=get_lineage($object); array_pop($lineage); echo count($lineage)?('<p>'.join(' -&gt; ',$lineage).'</p>'):'<i>None</i>'; echo '<h3>子クラス</h3>'; $children=get_child_classes($object); echo '<p>'.(count($children)?join(',',$children):'<i>None</i>').'</p>'; echo '<h2>メソッド</h2>'; $methods=get_class_methods($class); $object_methods=get_methods($object); if(!count($methods)){ echo "<i>なし</i><br/>"; } else{ echo '<p>継承しているメソッドは、<i>斜体</i>で表示します。</p>'; foreach($methods as $method){ echo in_array($method,$object_methods)?"<b>$method</b>();<br/>":"<i>$method</i>();<br/>"; } } echo '<h2>プロパティ</h2>'; $properties=get_class_vars($class); if(!count($properties)){ echo "<i>なし</i><br/>"; } else{ foreach(array_keys($properties) as $property){ echo "<b>\$$property</b>=".$object->$property.'<br/>'; } } echo '<hr/>'; } //省略しましたがここにクラスA、B、Cを用意しました。 $a=new A; $a->foo='sylvie'; $a->bar=23; $b=new B; $b->foo='bruno'; $b->quux=true; $c=new C; print_object_info($a); print_object_info($b); print_object_info($c); ?> これを実行すると途中からエラーになります。$classがどんな値か出力するために、 foreach($classes as $renban=>$class){ print_r("{$renban}:{$class}\n<br/>"); } にして出力したら、 0:stdClass …… 139:A 140:B 141:C になりました。(get_declared_classes()が返す値は、スクリプト内で自分が定義したクラス以外に、PHPがデフォルトで定義しているクラスもあることに、昨日気づきました。) 本を書いた人は、foreach文の直後の if(substr($class,0,2)=='__'){ continue; } の所でデフォルトの定義済みクラスを除外する目的だったと思います。 ここを、 foreach($classes as $class){ if(substr($class,0,1)!='A||B||C'){ continue; } に変えたらちゃんと画面が表示されました。 本を書いた人はなぜ、if(substr($class,0,2)=='__')にしたのでしょうか?また、if(substr($class,0,1)!='A||B||C')だとあらかじめ自分が定義しているクラスを記述しているのでなにかぱっとしない感じがします。自分が定義したクラス以外を除外という書き方でなく、デフォルトの定義済みクラスをうまく除外する方法などございましたらアドバイスの方よろしくお願いします。 こちらの環境は、windows vistaにxampp1.6.5、php5.2.5です。よろしくお願いします。

  • ossu
  • お礼率75% (36/48)
  • PHP
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

__PHP_Incomplete_Classのことを指してるんじゃないですかね。 書かれたソースだと、どうしてもバグは出ると思います。 my.php ----------------------------------- <?php class A { } class B { } class C { } ----------------------------------- check.php ----------------------------------- <?php $default_classes = get_declared_classes(); require_once("my.php"); $my_classes = array(); foreach (get_declared_classes() as $_class_name) { if (!in_array($_class_name,$default_classes)) { $my_classes[] = $_class_name; } } print_r($my_classes); ?> ----------------------------------- こんな感じで調べたいPHPをrequieするようにしてやればいいんじゃないでしょうか。

ossu
質問者

お礼

ありがとうございます。うまくいきました。やり方としても非常にスマートだとおもいました。

関連するQ&A

  • StringクラスのcompareToメソッド

    ArrayListに登録した文字列を五十音順にソートしようと思いComparator を使用して 以下のようなサンプルプログラムを作ってみました。 ところが想定していたような {赤ちゃん、富士山、山口県}とはならず {富士山、山口県、赤ちゃん} というような結果になりました。 compare() の戻り値の部分を return ((String)arg1).compareTo((String)arg0); に変更しても{赤ちゃん、山口県、富士山} となり辞書の並びとは異なる結果になりました。 辞書順に並べるにはなにかよい方法はありますでしょうか。 public class compareTest { public static void main(String[] args) { ArrayList<String> array = new ArrayList<String>(); String a = "赤ちゃん"; String b = "山口県"; String c = "富士山"; array.add(a); array.add(b); array.add(c); for(int i=0;i<array.size();i++) { System.out.println("ソート前=" + array.get(i)); } Collections.sort(array, new testComp()); for(int i=0;i<array.size();i++) { System.out.println("ソート後=" + array.get(i)); } } } public class testComp implements Comparator { public int compare(Object arg0, Object arg1) { return ((String)arg0).compareTo((String)arg1); } }

    • ベストアンサー
    • Java
  • C#クラスについて教えてください

    下記通りクラスを作成した場合、プロパティaを配列にできますか? class Class1 { public string a { set; get; } public int b { set; get; } public int c { set; get; } } イメージとしては下記通りにしたいのですが、なかなかうまく行きません。 class Class1 { public Class1(int x) { } public string a[x] { set; get; } public int b { set; get; } public int c { set; get; } } private void Form1_Load(object sender, EventArgs e) { Class1 f = new Class1(2); f.a[0] = "asdf"; f.a[1] = "asdfa"; f.a[2] = "asdfasd"; f.b = 1; f.c = 2; } 初心者なんで、やさしく教えてください。お願いします。

  • 別ファイルに配列を渡して、別ファイルのクラスを実行

    index.phpから別ファイルのclass.phpに配列を渡して、 クラスを実行したいと考えています。 //----------------------------------- //-- index.php --- <?php class hiragana { public $a_ka_sa; function init() { $this->a_ka_sa = array(); } } $j_hiragana = new hiragana(); $val[0] = array('a'=>'あ' , 'i'=>'い' , 'u'=>'う' , 'e'=>'え' , 'o'=>'お'); $val[1] = array('ka'=>'か' , 'ki'=>'き' , 'ku'=>'く' , 'ke'=>'け' , 'ko'=>'こ'); $val[2] = array('sa'=>'さ' , 'si'=>'し' , 'su'=>'す' , 'se'=>'せ' , 'so'=>'そ'); $j_hiragana->a_ka_sa[0] = (object) $val[0]; $j_hiragana->a_ka_sa[1] = (object) $val[1]; $j_hiragana->a_ka_sa[2] = (object) $val[2]; var_dump($j_hiragana); //----------------------------------- このようになっているプログラムを //----------------------------------- //-- index.php --- <?php $val[0] = array('a'=>'あ' , 'i'=>'い' , 'u'=>'う' , 'e'=>'え' , 'o'=>'お'); $val[1] = array('ka'=>'か' , 'ki'=>'き' , 'ku'=>'く' , 'ke'=>'け' , 'ko'=>'こ'); $val[2] = array('sa'=>'さ' , 'si'=>'し' , 'su'=>'す' , 'se'=>'せ' , 'so'=>'そ'); //----------------------------------- 配列の部分だけindex.phpに残して //----------------------------------- //-- class.php --- <?php class hiragana { public $a_ka_sa; function init() { $this->a_ka_sa = array(); } } $j_hiragana = new hiragana(); //-------------- // $val[0] = array('a'=>'あ' , 'i'=>'い' , 'u'=>'う' , 'e'=>'え' , 'o'=>'お'); // $val[1] = array('ka'=>'か' , 'ki'=>'き' , 'ku'=>'く' , 'ke'=>'け' , 'ko'=>'こ'); // $val[2] = array('sa'=>'さ' , 'si'=>'し' , 'su'=>'す' , 'se'=>'せ' , 'so'=>'そ'); //-------------- $j_hiragana->a_ka_sa[0] = (object) $val[0]; $j_hiragana->a_ka_sa[1] = (object) $val[1]; $j_hiragana->a_ka_sa[2] = (object) $val[2]; //----------------------------------- class.phpに移して、 index.phpを開くとclass.phpのクラス?に配列を渡しクラス?を実行する プログラムを作りたいと考えていますが、 うまく配列を渡してクラス?を実行できません。 どのようにすればよいのでしょうか?

    • 締切済み
    • PHP
  • CSV...

    <?php $csv = "system.csv"; $array = file($csv); $c = count($array); $item = 5; //1ページの表示件数 $page = $_GET['page']; //ページ番号 $start = $page * $item; //pageが0 $matched = 0; //条件にマッチした数 foreach( $array as $i => $row ) { $row = trim( $row ); list($id[$i],$name[$i],$sex[$i],$age[$i],$stamp[$i]) = split("\,",$array[$i]); if($sex[$i] == 1 ) { if( $matched >= $start ) { echo $name[$i]; } $matched++; if( $matched - $start >= $item ) break; } } echo "登録件数:$i件"; if( $page ) echo '<a href="search_4?page=' . ( $page - 1 ) . '">前へ</a>'; else echo '前へ'; if( $i < $c ) echo '<a href="search_4?page=' . ( $page + 1 ) . '">次へ</a>'; else echo '次へ'; ?> かなりアホな質問かもしれませんが、動くかテストしようと思い 次へのリンクを押すとsearch_4?page=1となりNot Foundと表示されます。 どうしてですか?

    • ベストアンサー
    • PHP
  • get_declared_classes()について

    こんにちは。今、本を見ながらPHPの勉強をしている者です。 オブジェクトの章に入って、サンプルコードをまる写しして動作させたのですが、うまく動作しないので悪い部分だけ探したところ、get_declared_classes()が思惑通りに動いてないことに気付きました。 思惑どおりいかないところを以下にまとめました。 スクリプト名は、kensa.phpです。クラスの宣言なんですが、どこに書けばいいか本にははっきりと書かれてませんでしたが、同じスクリプト内に書けばいいと思い最後に記述しました。 <?php $classes=get_declared_classes(); print_r($classes); class A{ var $foo='foo'; var $bar='bar'; var $baz=17.0; function first_function(){ } function second_function(){ } }; class B extends A{ var $quux=false; function third_function(){ } }; class C extends B{ }; $a=new A; $a->foo='sylvie'; $a->bar=23; $b=new B; $b->foo='bruno'; $b->quux=true; $c=new C; ?> Array ( [0] => A [1] => B [2] => C ) といった結果を出したかったのですが、出力された結果は、 Array ( [0] => stdClass [1] => Exception [2] => ErrorException [3] => COMPersistHelper [4] => com_exception…… こんな感じの配列が沢山でてきました。これはいったい何なのかインターネットで調べたら、「デフォルトの定義済みクラス」とか書いてありました。 <?php $classes=get_declared_classes(); print_r($classes); ?> これだけでも上と同じ出力結果になりました。 PHPマニュアルには、「この関数は、現在のスクリプトで宣言されたクラスの名前の配列を返します。」と書いてありますが、例文も少ないしわかりませんでした。他にも調べましたがわかりませんでした。クラスを宣言した場所が悪いのでしょうか? こちらの環境はwindows vistaにxampp 1.6.5です。 phpは5.2.5です。どなたかアドバイスの方よろしくお願いします。

    • ベストアンサー
    • PHP
  • フィールドを持たないクラスが、値を保持できる理由

    なぜint型フィールドを持たないMyGenericsクラスが変数やリテラルを保持できるのでしょうか? Objectクラスのフィールドを持っていますが、Objectクラスも、 フィールドは持っていませんよね?メソッドも空のObject()しか持っていないですし。 一応、javadocを読んだのですが、読み方間違えていますか? http://dlc-cdn.sun.com/jdk/jdk-api-localizations/jdk-api-ja/builds/latest/html/ja/api/index.html --------------------code-------------------------------- public class MyGenericsTest { public static void main(String[] args) { int x = 234; MyGenerics g = new MyGenerics(x); Integer i = (Integer)g.get(); System.out.println(i); } } class MyGenerics { Object o; public MyGenerics(Object o){ this.o = o; } public Object get(){ return o; } }

    • ベストアンサー
    • Java
  • functionの中にfunction?

    functionの中にfunctionの関数を読み込みたいのですが そのようなことはphpで可能でしょうか? ソースは以下のようになっております。 // 実行 hoge1(); hoge2(); function hoge1() { if (!$_POST["submit"]) { foreach($_POST as $k => $v) { if(get_magic_quotes_gpc()) { $v=stripslashes($v); } $v=htmlspecialchars($v); $array[$k]=$v; } extract($array); } } function hoge2() { echo <<<EOM ~~表示させる文章など~~ EOM; foreach ($array as $key => $val){ echo "<input type=\"hidden\" name=\"$key\" value=\"$val\" />\n"; } } 具体的にはhoge1のextract($array);をhoge2の$arrayに入れて foreachで出力させたいのですがどのようにすればできますでしょうか?

    • 締切済み
    • PHP
  • phpにおいて、クラスのメソッド名を定義する際に、

    phpにおいて、クラスのメソッド名を定義する際に、 メソッド名を変数で与えることはできないのでしょうか? 例えば、下記のようなものを考えています。 class ClassA { foreach( array('AA', 'BB', 'CC') as $val ) { function set{$val}($arg) { $arg = $arg + 1; return $arg; } } しかし、これではうまくいかないようです。 一方、メソッドを用いるときには、 このような変数展開ができるようです。 ですので、定義のときにもやり方があるのでは・・?と思い、 質問させていただきました。 宜しくお願い致しましう。

    • ベストアンサー
    • PHP
  • 大量のcheckboxにcheckedを入れる

    チェックボックスが50個あります。 送信ボタンを押して元のページを再度開きます。 そのときにチェックしたボックスにチェックを入れた状態にしたいです。 inputタグの中に<?php if(isset($checkbox2) && in_array('b2',$checkbox2)){echo ' checked';} ?>を入れていますが単調になってしまいます。 単調にならずにする方法はありますか? <input type="checkbox" name="chk1[]" value="a1" />の場合はインデックスが固定でないのでできませんでした。 その他いけない箇所があれば教えて下さい。 お願いします。 <?php if(isset($_GET["chk1"])){ $checkbox1 = $_GET["chk1"]; for($i=0; $i<sizeof($checkbox1); $i++){ print $checkbox1[$i]."<br />"; } } if(isset($_GET["chk2"])){ $checkbox2 = $_GET["chk2"]; foreach($checkbox2 as $key => $val){ print $val."<br />"; } } ?> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <form method="get" action="checkbox.php"> <input type="checkbox" name="chk1[]" value="a1" /> <input type="checkbox" name="chk1[]" value="a2" /> <input type="checkbox" name="chk1[]" value="a3" /> <input type="checkbox" name="chk1[]" value="a4" /> <input type="checkbox" name="chk1[]" value="a5" /> <input type="checkbox" name="chk1[]" value="a6" /> <input type="checkbox" name="chk1[]" value="a7" /> <input type="checkbox" name="chk1[]" value="a8" /> <input type="checkbox" name="chk1[]" value="a9" /> <input type="checkbox" name="chk1[]" value="a10" /> <br /> <input type="checkbox" name="chk2['b1']" value="b1" <?php if(isset($checkbox2) && in_array('b1',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b2']" value="b2" <?php if(isset($checkbox2) && in_array('b2',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b3']" value="b3" <?php if(isset($checkbox2) && in_array('b3',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b4']" value="b4" <?php if(isset($checkbox2) && in_array('b4',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b5']" value="b5" <?php if(isset($checkbox2) && in_array('b5',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b6']" value="b6" <?php if(isset($checkbox2) && in_array('b6',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b7']" value="b7" <?php if(isset($checkbox2) && in_array('b7',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b8']" value="b8" <?php if(isset($checkbox2) && in_array('b8',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b9']" value="b9" <?php if(isset($checkbox2) && in_array('b9',$checkbox2)){echo ' checked';} ?>/> <input type="checkbox" name="chk2['b10']" value="b10" <?php if(isset($checkbox2) && in_array('b10',$checkbox2)){echo ' checked';} ?>/> <br /> <input type="submit" value="送信" /> </form> </body> </html>

    • 締切済み
    • PHP
  • jarファイル内のJava クラスを列挙する

    こんにちは。早速ですが、 与えられたjarファイルからクラスファイルを見つけ出し、その名前・フィールド・メソッド・パラメータ・タイプを列挙させようと思います。 すべてのクラスの関連や、汎化も考慮します。 出力は以下のようにしたいと思います。 Class Class_Name extends Another_Class_name Attribute: Attribute_name : Attribute_type; Methods: Method_name (Parameter_name : Parameter_type) : Return_type; Association: To_the_other_end_class_name; 今のところ、下記のようにjarファイルを読み込むところまで作ってみたのですが、この後のデータ処理が分かりません。 実は、Java自体初心者に近く、締め切りも近いため焦っています。ご教授いただけるととても嬉しいです。 ちなみに環境は、IBM Rational Software Architectです。Java1.4までのサポートですので、genericタイプなしでお願いします。 public class CReader { public static void main (final String[] args) throws Exception { ClassReader cr = new ClassReader("CReader"); ClassNode cn = new ClassNode(); cr.accept(cn, ClassReader.SKIP_DEBUG); JarFile jar = new JarFile(jarfile); Enumeration files = jar.entries(); while (filest.hasMoreElements()) { ZipEntry entry = (ZipEntry)files.nextElement(); System.out.println(entry.getName()); } byte[] buf = new byte[1024]; int readsize = 0; InputStream is = jar.getInputStream(entry); while ((readsize = is.read(buf, 0, 1024)) != -1) { List methods = cn.methods; for(int i=0; i<methods.size(); i++){ MethodNode method = (MethodNode) methods.get(i); if(method.instructions.size() > 0){ ????? } } } is.close(); } }

    • ベストアンサー
    • Java

専門家に質問してみよう