2012-01-23 5 views
0

エラーが発生しました以下のコードを使用している場合、オブジェクトコンテキストにない場合は$ thisを使用してください。これは、関数がスタック上にあり、オブジェクトへのアクセスがないためですか?

array_walk($pins, function (&$array) { 
$array->timestamp = $this->convertTime(strtotime($array->timestamp)); 
}); 

この問題を回避するにはどうすればよいですか?私はforeachを使用することを考えていましたが、目的に合ったPHPの機能をもっと学びたいと思っていました。

foreach($pins as $pin) { 
    $pin->timestamp = $this->convertTime(strtotime($pin->timestamp)); 
} 

でそれを解決しかし、私はまだあるarray_walkで問題を回避する方法を知っていただきたいと思います。

+0

[この内部関数を取得する]の可能な複製(http://stackoverflow.com/questions/7206192/getting-this-inside-function) – hakre

答えて

0

これを回避するにはどうすればよいですか?私はforeachを使用することを考えていましたが、目的に合ったPHPの機能をもっと学びたいと思っていました。

私はそれが何をするかは明らかだからforeachは非常に良い解決策である、あなたのケースのために言うでしょう。あなたはあなたの例でエイリアシングにarray_walk申し出を模倣することがあります:これはarray_walkに、より密接に来るべき

foreach($pins as &$pin) { 
    $pin->timestamp = $this->convertTime(strtotime($pin->timestamp)); 
} 
unset($pin); 

。おそらくあなたは(おそらく)だけでなく、配列自体を参照するようにしたい:

$pinsRef = &$pins; 
foreach($pinsRef as &$pin) { 
    $pin->timestamp = $this->convertTime(strtotime($pin->timestamp)); 
} 
unset($pin); 

あなたはプライベートアクセスと匿名関数の内部でオブジェクト自体($this)をカプセル化したい場合は、これが不可能です。匿名関数のコンテキストには$thisが存在しないため(ただし、それ以降のPHPバージョンではその可能性があります)

しかし、回避策の1つは、use句を使用してオブジェクトインスタンスを匿名関数のローカルスコープに渡すことです。

$_this = $this; 
$callback = function (&$array) use ($_this) { 
    $array->timestamp = $_this->convertTime(strtotime($array->timestamp)); 
}); 
array_walk($pins, $callback); 

$thisのプライベートメンバーはアクセスできないため、この回避策は制限されています。代わりに、あなたのオブジェクトの一部としてコールバック関数を作成し、それを指定することができ、プライベートアクセスがことが可能であり、あなたが他のオブジェクトのコールバックのようにそれを呼び出すことができます。

array_walk($pins, array($this, 'callback')); 

foreachがあると言って先頭に戻って私をもたらしおそらくあなたの場合はarray_walkよりも優れた武器です。

これは、さまざまな選択肢を示すのに役立ちます。

4

これを試してください:あなたは実際には配列を歩いている場合

$that =& $this; 
array_walk($pins, function (&$array) use ($that) { 
    $array->timestamp = $that->convertTime(strtotime($array->timestamp)); 
}); 

また、正しい構文は、おそらく次のようになります。

$that =& $this; 
array_walk($pins, function (&$array) use ($that) { 
    $array['timestamp'] = $that->convertTime(strtotime($array['timestamp'])); 
}); 
0

理由は、あなたがどのプレーン機能を渡しているということですオブジェクトの一部ではありません。オブジェクトが存在しないので、$thisに指摘できるものはありません。 convertTimeがグローバルスコープにある場合は、単に$this->を省略してください。そうでなければ、passing an object as a callbackarray_walkと考えてください。

0

PHP 5.4.0以降、匿名関数の中から$ thisにアクセスできます。

関連する問題