みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

PHP5 toStringについて

現在PHPの勉強をしております。
XAMPPを利用しローカルで書いたコードをレンタルサーバにアップロードしたところ

Object of class hoge could not be converted to string in~

というエラーが発生してしまいます。

PHPのバージョンは
XAMPP:PHP5.2.5
レンタルサーバ(xrea):PHP5.2.5

以下エラー部分のコードです。
function MenuSet(){
include_once './class/dataval.class.php';
//DataValは上でincludeしている。ここで上記エラーが発生。
$this->load = new DataVal();
if($_SESSION['account']=='1'){
$other = "<li><a href=\"test.php?$this->load->Count()\">リンク2</a></li>";
}
$menu = <<<EOF
<ol>
<li><a href=\"#\">リンク1</a></li>
$other
</ol>
EOF;
echo $menu;
}

//dataval.class.phpのメソッド
function Count(){
$this->filearray = file($_SESSION['userfile']);
$this->count = count($this->filearray);
return $this->count;
}

自分なりに調べた限りでは、オブジェクトを文字列で返す場合は
__toStringメソッドを定義しておく、という認識なんですが
そもそもどこに定義すれば良いのでしょうか?
同一バージョンでローカルとレンタルサーバで動作が違うところも理解しがたいです…
自分で解決できず悔しいのですが、どなたかヒントをいただけないでしょうか?

投稿日時 - 2008-05-31 00:39:56

QNo.4063419

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

__toString
はマジックメソッドと呼ばれるもののうちのひとつです
他にもマジックメソッドは存在します

マジックメソッドは何かしら特殊な場合に自動的に動作するようなものです意識的にマジックメソッドをコールするなんてことは無いです。
__toStringであれば、オブジェクトを文字列として扱おうとしたときに自動的にコールされます

$hoge = new DataVal();
echo $hoge;
この状態で、自動的に__toString()が叩かれますので、人間の視覚的に見た場合は
echo $hoge->__toString();
という感覚です。

この事を踏まえると
public function __toString(){
return $this->Count();
}
こんな感じが適切かと思われます。

ただし、DataVal クラスって結局何の役目をさせているクラスなんでしょう?
DataVal を文字列として扱った場合に単にデータカウント数を返すって事でいいのかな?
と考えると
カウント数を画面に表示させたいだけのために __toString()を使うのはなんか違うな気もします
まぁ、ここらへんは哲学というかポリシーの問題なのでプログラム的には正解不正解は無いんですけどね。



ローカルと実際のサーバーで動きが違うのであれば、それは単にローカルとサーバーの環境の差異かと思います
XAMPP入れてるレンタルサーバーなんてありえませんからね。
何かしらの環境設定の違いからくるものかと思われます。

投稿日時 - 2008-06-01 08:35:00

ANo.1

突っ込みどころ満載ですが
メソッド内にHTMLタグを書くって事自体あまりよいことではないですが・・・


とりあえず

$other = '<li><a href="test.php?'.$this->load->Count().'">リンク2</a></li>';

こう書いたら動くんじゃないかな



ちなみに __toString() は他のメソッドと同じように書けばいい

例えば
class DataVal {

function Count(){
$this->filearray = file($_SESSION['userfile']);
$this->count = count($this->filearray);
return $this->count;
}

public function __toString(){
~ここに処理書く~
}

}
//endo of class

こんな感じ


あと、もうひとつ
function Count(){
$this->filearray = file($_SESSION['userfile']);
$this->count = count($this->filearray);
return $this->count;
}
結局これって何が返ってきます??
コイツの返り値次第では対処方法は違いますよ

投稿日時 - 2008-05-31 02:10:51

補足

ご回答ありがとうございます。
PHPというかプログラムを勉強しだして1ヶ月ぐらいなので
突っ込みどころ満載は申し訳ありません。(アクセス権云々とかですかね?)
独学で聞ける人間も周りにいないのでつっこみはとても有難いです。

回答で頂いた
$other = '<li><a href="test.php?'.$this->load->Count().'">リンク2</a></li>';
で、エラーはでなくなりました。
ただ、ローカルと同じ動作にならなかったので余計わからなくなりましたが…

toStringの定義方法の回答もありがとうございます。
こんな感じでしょうか?
class DataVal {

function Count(){
$this->filearray = file($_SESSION['userfile']);
$this->count = count($this->filearray);
return $this->count;
}

public function __toString(){
$this->mycount = $this->Count();
//以下他の文字列で返したいメソッドがあれば記入
}
}

呼び出す際は
$hoge = new DataVal();
echo $hoge->__toString->mycount;
になるのでしょうか?

Count()に関しては
とあるログファイルみたいなもののファイル名をセッションに入れておいて
それをcountし何行あるか数字(int?)で返しているつもりです。
型のキャストはする必要がないと認識しているのですが…

投稿日時 - 2008-05-31 09:44:47

あなたにオススメの質問