人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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では、このような二重の拡張は許されていないのでしょうか。
できるだけ元のクラスは変更をしたくありません。こういう場合はどうしたら解決できるのか教えてください。
よろしくお願いします。


●質問者: mouitchou
●カテゴリ:コンピュータ ウェブ制作
✍キーワード: Class aaa Class ON PHP
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● t_shiono
●35ポイント ベストアンサー

作成したいアプリケーションの全体像が分からないので、はずしているかもしれませんが、あるプログラムの動作を定義した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の処理や、親子の関係によっても代わると思いますが、前者の方が何かとよいかと思います。


いかがでしょうか?

◎質問者からの返答

大当たりでした。

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

include_once "class/DBSqlMysql.php";

include("include/dbC.php");

となっていて、この

include("include/dbC.php");

の中で

include "class/DBSqlMysql.php";

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

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

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


2 ● Mook
●35ポイント

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

規定クラスとなる .\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 はどのように定義されているのでしょうか。

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ