電子書籍の厳選無料作品が豊富!

お世話になります

ダブルクォーテーションで囲っても
「PHP コード」を「文字列」として出力する方法
つまり、evalの逆の関数のようなものはありますでしょうか

$a['huga'] = 2;
$b['hoge'] = 3;

//式
$c = $a['huga'] * $b['hoge'] ;

abc($c = $a['huga'] * $b['hoge'] );

function abc($str){

//ここでなんちゃらほんちゃら
//もしくはfunctionの外側でなんちゃらもでも可

echo $str;

}

期待する出力結果
$c = $a['huga'] * $b['hoge'] ;

実際の結果
6

$の前に¥を入れてダブルクォーテーションで囲めば、
または、シングルクォーテーションの前に¥を入れてシングルクォーテーションで囲めば
文字列になるのはわかりますが
式の文字列には直接、手を加えず関数等で実現するやり方が知りたいです

※連想配列のキーの囲み文字はシングルクォーテーションです、ダブルに出来ない条件でお願いします。


お忙しい中恐縮ですが熟練者の方でわかる方がいましたら
お教え下さいませ

A 回答 (3件)

かなり無理矢理ですが、


自分自身のファイルを読むという方法はいかがでしょう。


<?php
$a['huga'] = 2;
$b['hoge'] = 3;

$c = $a['huga'] * $b['hoge'];

$str = abc(__LINE__);
echo $str . "\n";

function abc($ln){
 $file = fopen(__FILE__, 'r');
 $str = '';
 for($n=1; !feof($file) && $n<$ln; $n++){
  $line = trim(fgets($file));
  if( 0 < strlen($line) ){ $str = $line; }
 }
 fclose($file);
 return $str;
}
?>


abc() は自分自身のファイルを読み、
引数で指定した行番号の直前の行を表示します。
呼び出す際、現在の行番号 __LINE__ を使って
目的の行を指示します。

対象のコードが複数行になる場合には、
もう少し複雑な処理が必要になります。
    • good
    • 0
この回答へのお礼

ky072様

ご回答ありがとうございます!

この、自分自身にアクセスするというのが
僕、個人的に目からウロコです
こんなこと出来るんですね!!

お礼日時:2012/05/20 15:29

無理だと思います。


 abc($c = $a['huga'] * $b['hoge'] );
の実行順序としては括弧の中の処理が優先されて行われますので、
 $c = $a['huga'] * $b['hoge'];
 abc($c);
と等しいことになります。
括弧の中を処理させないためには、括弧の中身を予め文字列にしておく必要がありますが、そうすると質問者さんの希望する式自体には手を入れないという条件を満たさなくなってしまいます。
    • good
    • 0
この回答へのお礼

t_ohta様

ご回答ありがとうございます!
やはり無理ですか、便利なPHPなので
もしかしたらと思いましたが

お礼日時:2012/05/20 15:24

ご提示のfunction abc($str){・・・的な処理は無理がありますね



たんにエスケープしたくないというだけならこんな感じ
<?PHP
$a['huga'] = 2;
$b['hoge'] = 3;

$str=<<<'eof'
$c = $a['huga'] * $b["hoge"] ;
eof;
print $str;
eval($str);
print $c;
?>
    • good
    • 0
この回答へのお礼

yambejp様

ご回答ありがとうございます!
やはり無理なんですね

サンプルソースありがとうございます!

お礼日時:2012/05/20 15:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!