自分で定義したクラスの継承関係やらを出力するサンプルスクリプトがあったので、それをまる写しして動かしたところ、エラーがおこりました。以下のスクリプトがそれです。
<?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(' -> ',$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です。よろしくお願いします。
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するようにしてやればいいんじゃないでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP ランキングを表示する際の画像の大きさを固定することは可能でしょうか? <?php if ( has_ 1 2022/07/21 14:55
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- Ruby No route matches [GET] "/posts/5/destroy" 1 2022/03/24 13:00
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
classの再定義エラーについて
-
可変変数にアロー演算子を使いたい
-
PHPの変数値をリンクさせたい
-
関数の動きと記述方法の意味を...
-
PHPで、相対的な変数名の場合の...
-
サブネットマスクを用いたIP制...
-
Fatal error: Cannot use []
-
VB.NETからVBAマクロ(引数)を呼...
-
デフォルトの定義済みクラスに...
-
共用体のサイズをsizeofで
-
【Objective-c】rubyの__send__...
-
既存関数の上書き
-
VB6のコンボボックスのテキスト...
-
PHPプログラム上で「URLを直接...
-
PHP Catchable fatal error の...
-
PHP、ヒアドキュメント内でのIF...
-
メール本文の構成 行頭空白
-
Dosブロンプトでtabを出力したい
-
wordの差し込み印刷で文字...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA コレクションに2次元配列...
-
エラーの理由が分りません。Pri...
-
可変変数にアロー演算子を使いたい
-
VB.NETからVBAマクロ(引数)を呼...
-
PHP、ヒアドキュメント内でのIF...
-
VB.NETSystem.Xml 要素数を得る...
-
どういうプログラムを関数化を...
-
vb作成したらでbeep音が鳴りま...
-
次のhtml・cssでspan内の文字を...
-
classの再定義エラーについて
-
既存関数の上書き
-
protectedなのにアクセスできな...
-
配列の操作時にLNK2001外部シン...
-
UNIX CP "で上書きしません"
-
PHPでの画像の形式の変換
-
PHPプログラム上で「URLを直接...
-
Let's Encryptで自動更新がされ...
-
ExcelVBAで部分一致(*)をしたい
-
VB6のコンボボックスのテキスト...
-
ASPのResponse.WriteをPHPでは...
おすすめ情報