ここから本文です

Warningについて質問です。php.logに以下のワーニングが出力されます。 簡単に回...

sat********さん

2012/4/1219:25:21

Warningについて質問です。php.logに以下のワーニングが出力されます。
簡単に回避できる方法はありますか?

get_class() expects parameter 1 to be object, string given in ...

第1引数としてオブジェクトを前提にしているが文字列が渡された。という注意がでているというのは
分かるのですが、どうやって調査すればいいのか分かりません。。
このfunctionを呼び出し箇所は結構な量がありまして、できればこのfunction内の改修で終わらせたいのですが、
ご教示お願いします。

public final function add($objMsg) {
Log::debug(__METHOD__);

if ($objMsg != null) {

// エラーコードの1文字目で処理分け
$code = '';
if ( get_class($objMsg) == 'Msg' ) {
$code = $objMsg->code[0];
}
// 処理A
}
}

補足すみません。処理Aの内容です。
switch ( $code ) {
// 正常系メッセージ
case 'I':
$this->_arrMsg['info'][] = $objMsg;
break;
default:
$orgMsg = $objMsg;
if ( is_string($objMsg) ) {
$orgMsg = new Msg(null, null, null, $objMsg);
}
$this->_arrMsg['err'][] = $orgMsg;
}

閲覧数:
1,779
回答数:
1
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

IROHACODEさん

編集あり2012/4/1314:37:26

addメソッドを呼ぶ際に、引数にインスタンス以外を与えている。
$hoge->add('Msg');
本来はMsgクラスのインスタンスを渡す。
$hoge->add(new Msg);

しかし、nullや、get_class関数でチェックするよりも、
タイプヒンティングを使用した方が良い。

また、エラーコード をaddするという感覚も、
code[0] と0を指定する意味もよく分からない。
----
<?php
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
class Msg {}
class Hoge
{
final public function add(Msg $objMsg)
{
echo $objMsg->code[0];
}
}
// -----

try {
$msg = new Msg;
$msg->code[0] = 999;

$hg = new Hoge;
$hg->add($msg);
} catch (ErrorException $e) {
die($e->getMessage());
}

------
if ($objMsg != null) で、$objMsgがnullではないので通過する。
しかし、$objMsgがMsgインスタンスであるかはチェックされていない。
なので、
if ( get_class($objMsg) == 'Msg' ) でget_classにMsgインスタンス以外のものが
渡されたので、ワーニングが発生した。

補足をみると、addメソッドには、MsgインスタンスとStringを渡す事が出来る様になっているが、
この様にあいまいな引数を許容している事が、事態を複雑にしている元凶。
タイプヒンティングでadd内に入る前に止めておく。
add()する時、Msgインスタンス以外を与えているなら、それも修正する。

if ( is_string($objMsg) ) {
$orgMsg = new Msg(null, null, null, $objMsg);
なぜ$objMsgがStringだとnew Msgするのか、
$this->_arrMsg['err'][] = $orgMsg;
なぜメッセージを持っていないものを、$_arrMsg['err'] に入れるのか分からない。

この回答は投票によってベストアンサーに選ばれました!

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる