PHPを勉強しながら実戦に使用しつつあります。


t.phpの中でfunctionを宣言しています。現在はただのfunctionなのですが、これを拡張クラスに変更して使いたいと思います。

元のクラスは
include_once "class/DBSqlMysql.php";
にあります。

まず、t.phpでクラス宣言なしだと、エラーは出ません。

拡張クラス宣言だけを行うと、元のクラスを呼んでいないので、次のエラーになります。
Fatal error: Class mydbsqlmysqlmultidiv: Cannot inherit from undefined class dbsqlmysql in t.php on line 7


ところが、
include_once "class/DBSqlMysql.php";

//クラステスト
class myDBSqlMysqlMultidiv extends DBSqlMysql {

function AAA(){
}
}

とすると次のエラーになります。
Fatal error: Cannot redeclare class dbsqlmysql in class/DBSqlMysql.php on line 30

このline 30には
class DBSqlMysql extends DBSql {
という宣言文があります。

呼び出さないと呼び出せと叱られ、呼び出すと二重宣言だと言われるので、どうしたらいいのかわかりません。
PHPでは、このような二重の拡張は許されていないのでしょうか。
できるだけ元のクラスは変更をしたくありません。こういう場合はどうしたら解決できるのか教えてください。
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2007/06/29 11:17:31
  • 終了:2007/06/29 23:20:45

ベストアンサー

id:t_shiono No.1

t_shiono回答回数256ベストアンサー獲得回数222007/06/29 15:04:00

ポイント35pt

作成したいアプリケーションの全体像が分からないので、はずしているかもしれませんが、あるプログラムの動作を定義したPHPファイルがあり(ここではmain.php)があり、この中でt.phpをincludeしてたりしませんか?

この際に、main.phpで次のようになってませんか?

include('t.php');
include('class/DBSqlMysql.php');

何かの処理

手元の環境では、この状況で同様の症状が発生しました。

スクリプト順に評価していくと、

ファイルの先頭の方が先に評価されるので、後ろに書いてあるincludeが処理されずにt.phpが評価されるので、t.phpにincludeがないとエラーとなります。

t.phpにincludeを書くと、main.php内のincludeによって、親クラスが再定義されるため、エラーとなります。


この状況は、初めは親クラスを使ってmain.phpを作成していたが、同様の記述が増えたので、それを拡張したクラスを作ろうとするとこのような状態になりやすいかと思います。


この状況であれば、

main.phpのincludeをinclude_onceにする

もしくは、

main.phpの親クラスのincludeをやめる

ことでエラーはなくなると思います。どちらがいいかは、main.phpの処理や、親子の関係によっても代わると思いますが、前者の方が何かとよいかと思います。


いかがでしょうか?

id:mouitchou

大当たりでした。

t.phpの中で、詳しく見ていくと

include_once "class/DBSqlMysql.php";

include("include/dbC.php");

となっていて、この

include("include/dbC.php");

の中で

include "class/DBSqlMysql.php";

が書き込まれていました。

呼び出しの順番を逆にしたところ、エラーが出なくなりました。

やっと次のステップに進むことができます。どうもありがとうございました。

2007/06/29 23:17:33

その他の回答(1件)

id:t_shiono No.1

t_shiono回答回数256ベストアンサー獲得回数222007/06/29 15:04:00ここでベストアンサー

ポイント35pt

作成したいアプリケーションの全体像が分からないので、はずしているかもしれませんが、あるプログラムの動作を定義したPHPファイルがあり(ここではmain.php)があり、この中でt.phpをincludeしてたりしませんか?

この際に、main.phpで次のようになってませんか?

include('t.php');
include('class/DBSqlMysql.php');

何かの処理

手元の環境では、この状況で同様の症状が発生しました。

スクリプト順に評価していくと、

ファイルの先頭の方が先に評価されるので、後ろに書いてあるincludeが処理されずにt.phpが評価されるので、t.phpにincludeがないとエラーとなります。

t.phpにincludeを書くと、main.php内のincludeによって、親クラスが再定義されるため、エラーとなります。


この状況は、初めは親クラスを使ってmain.phpを作成していたが、同様の記述が増えたので、それを拡張したクラスを作ろうとするとこのような状態になりやすいかと思います。


この状況であれば、

main.phpのincludeをinclude_onceにする

もしくは、

main.phpの親クラスのincludeをやめる

ことでエラーはなくなると思います。どちらがいいかは、main.phpの処理や、親子の関係によっても代わると思いますが、前者の方が何かとよいかと思います。


いかがでしょうか?

id:mouitchou

大当たりでした。

t.phpの中で、詳しく見ていくと

include_once "class/DBSqlMysql.php";

include("include/dbC.php");

となっていて、この

include("include/dbC.php");

の中で

include "class/DBSqlMysql.php";

が書き込まれていました。

呼び出しの順番を逆にしたところ、エラーが出なくなりました。

やっと次のステップに進むことができます。どうもありがとうございました。

2007/06/29 23:17:33
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912007/06/29 15:06:40

ポイント35pt

こちらの環境で試験してみましたが、

規定クラスとなる .\class\DBSqlMysql.php を

<?
//基底クラス
class DBSql {
    function AAA(){
        print "This is DBSql Function<br>\n";
    }
}
?>

派生クラスを記述する t.php を

<?
include_once( 'class\DBSqlMysql.php' );

//派生クラステスト
class DBSqlMysql extends DBSql {
    function BBB(){
        print "This is DBSqlMysql Function<br>\n";
    }
}

//派生クラスを基底クラスに指定
class myDBSqlMysqlMultidiv extends DBSqlMysql {
    function CCC(){
        print "This is myDBSqlMysqlMultidiv Function<br>\n";
    }
}

//クラステスト
$myClass = New myDBSqlMysqlMultidiv();

$myClass->AAA();
$myClass->BBB();
$myClass->CCC();
?>

として、t.php を実行すると

This is DBSql Function

This is DBSqlMysql Function

This is myDBSqlMysqlMultidiv Function

が表示されました。

DBSqlMysql.php の中身がわからないのでなんともいえませんが、 DBSql はどのように定義されているのでしょうか。

同じクラスが複数定義されたりしていませんか?

id:mouitchou

おっしゃるとおり、呼び出しの順番が悪く、呼び出したファイルの中で重複が起こっていました。順番を書き換えることで解決しました。かなり長い間困っていましたが、やっと解決してほっとしています。本当にありがとうございました。

2007/06/29 23:18:11

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません