スレッド表示 | フラット表示〕 全トピック 920 件中 202 番目 次≫ ≪前

クラス内でのコールバック関数

created: 2006-08-15 12:15 | modified: 2006-08-16 10:37 | reply: 4

[3227] クラス内でのコールバック関数

user: volks | created: 2006-08-15 12:15
こんにちは、クラス内でのarray_map について質問させてください。

関数をクラス化する作業をしている時にarray_map の所だけどうしてもエラーがでてしまいます。

---------------------------------------------------
以下、クラス化する前の状態です

function test($data=array()){
$data_esc = array_map('Convert', $data);
return $data_esc;
}

function Convert($str){
$str_esc = str_replace('"', '""', "$str");
return $str;
}
---------------------------------------------------
ここで Convert関数の呼び出しを

$this->Convert にすれば良いのかと思っていたのですが、
そうしたときは

$data_esc = array_map($this->Convert, $data);

これでエラーは出ないのですが、実際にConvert関数の処理はされていませんでした。
($this->Convert はプロパティとして認識されたので、エラーではなかったのか。。。不明です。)

クラス内から同じのクラス内の関数をコールバックするというのは可能でしょうか?
それともarray_map を使わずforeach などの別の方法で対処すべき所なのでしょうか?

是非アドバイスお願い致します。
reply: 3228 返信 編集 削除

[3228] クラスメソッドをコールバック関数に指定する

user: ゆうじ | created: 2006-08-15 14:54
こんにちは。

コールバック関数は普通文字列で指定しますが、
クラスメソッドの場合はちょっと違った書き方が必要です。

$this->convert() をコールバック関数にするには、
このように書きます。

$data_esc = array_map(array(&$this, 'convert'), $data);
Parent: 3227  reply: 3229 返信 編集 削除

[3229] 成功しました。ところで。。。

user: volks | created: 2006-08-15 15:20
動きました!! 有難うございます。


ところでですが、、あつかましかったらすいません

$data_esc = array_map(array(&$this, 'convert'), $data);

の &$this ですが、 $this でもちゃんと動作してくれたのですが、ここでの&にはどういう意図が入っているのでしょうか?

変数の参照渡しは理解できるのですが、$this の参照渡しと考えると、どういったケースで違いが出てくるのかイメージが湧きません。

少しアドバイスお願い致します。
Parent: 3228  reply: 3230 返信 編集 削除

[3230] $this のコピー渡しとリファレンス渡し

user: ゆうじ | created: 2006-08-15 23:23
変数でもオブジェクトでも、
コピー渡しとリファレンス渡しの差異は同じです。
$this も、自分自身を指し示しているオブジェクトと
考えるといいのではないでしょうか。


かなり省いてますが、以下のコードは、
MVCのフロントコントローラのつもりです。

controller::getAction() の中で生成した、
action->controller の初期化に、
$this をリファレンス渡ししています。

controllerオブジェクトのプロパティやメソッドを
actionオブジェクトの中で参照できるよう、
controllerオブジェクト側で初期化してるわけですが、
ここを、コピー渡し(=)にすると、
コピーで初期化されるので、actionオブジェクトごとに、
違ったcontrollerオブジェクトを参照することになります。

より現実的なものをと考えてみましたが、
適切な例題が思い浮かばびませんでした。
参考になりますでしょうか。

class controller
{
var $config;
var $user;
var $request;

function controller ()
{
$this->config = array(
'home_url' => 'http://localhost/php/'
);
$this->request = new request();
$this->user = new user();
}

//
// 省略
//

function execute ()
{
$actionName = $this->request->get('action');
$action =& $this->getAction($actionName. '_action');
$action->execute();
}

function & getAction ( $className )
{
require_once $className. '.class.php';
$action = new $className;
// $action->controller = $this; // copy
$action->controller =& $this; // ref
return $action;
}

//
// 省略
//

}
Parent: 3229  reply: 3232 返信 編集 削除

[3232] 有難うございます

user: volks | created: 2006-08-16 10:37
丁寧な説明有難うございます。

まずこういったクラスの使い方ができるという事に感動です。
本当に奥が深いです!!
そしてこういう時には「リファレンス渡し」が必要になるという事がよく分かりました。

例まで書いて頂いて本当に有難うございます!!

これからクラスの使い方を勉強していきたいと思っています。
今後ともよろしくお願いいたします。
ありがとうございました。
Parent: 3230  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 202 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑