SlideShare a Scribd company logo
1 of 27
Download to read offline
eval() と create_function() の
         ミニレシピ



           坂本昌彦
msakamoto-sf@users.sourceforge.net
自己紹介
●   PHP, Java プログラマー
●   404 Blog Not Found の影響で Perl に浮気中。
●   はてなダイアリ:
●   http://d.hatena.ne.jp/msakamoto-sf/
●
    PukiWiki :
●
    http://www.glamenv-septzen.net/pukiwiki/inde
    x.php
eval() って?
●   文字列を PHP コードとして評価する
●   http://jp.php.net/manual/ja/function.eval.php
●   サンプルは後で。
●   フレームワークなどで、動的な処理を行わせた
    い場合に使われているらしい。
●

●   但し、著者は現場では一度も使ったことがな
    い。・・・ ( ; ´Д ` ) ウウッ…
create_function() って?
●   匿名関数 ( ラムダ形式 ) を作成する
●   http://jp.php.net/manual/ja/function.create-fun
    ction.php
●   array_map などで callback に使う関数を、一々定
    義するのが面倒なときに使ったりするらしい。
●

●   但し、これも著者は現場での使用経験は無
    し。・・・ ( ; ´Д ` ) ウウッ…
eval() の例
eval01.php:
<?php
$a = “xyz”;
eval('$b = “abc”; $c = '123'; $result = $a . $b . $c;');
echo $result;
?>




> php eval01.php
xyzabc123

>
create_function() の例
create_function01.php:
<?php
$lambda = create_function('$a, $b', 'static $c; $c++; return $a + $b + $c;');
echo $lambda(1, 2) . PHP_EOL;
echo $lambda(3, 4) . PHP_EOL;
?>




> php create_function01.php
4 // 1 + 2 + 1 ($c)
9 // 3 + 4 + 2 ($c)

>
イケテナイ。
エスケープが
面倒くさい。
Perl なら・・・ !! (eval の場合 )
#!/usr/bin/perl
use strict;
use warnings;

my $a = “xyz”;
my $result;
eval {
    my $b = “abc”;
    my $c = '123';
    $result = $a . $b . $c;
};
print $result;
Perl なら・・・ !! ( 匿名関数の場合 )
#!/usr/bin/perl
use strict;
use warnings;

my $c = 0;
my $lambda = sub() {
    my ($a, $b) = @_;
    $c++;
    return $a + $b + $c;
};
print $lambda->(1, 2), “n”;
print $lambda->(3, 4), “n”;
PHP でこうできれば・・・!!
<?php
...
eval {
    $a = ...
}

$lambda = function($a, $b) {
    ...
    return ...;
}

$result = $lambda(1, 2);
...
?>
匿名関数については、挑戦者がいた。
    パッチも作成され、 ML でも議論された。

[PHP-DEV] PATCH: anonymous functions in PHP

http://marc.info/?l=php-internals&m=1174261219
                    11550&w=2
が・・・。

            忘れ去られたっぽい。

                 Σ (゚ д ゚ lll )

                        ↓
    ML のスレッドも 2007 年 3 月一杯で終了。
                        ↓
   PHP 5.3 Suggested Feature List にも無し。
(http://d.hatena.ne.jp/shimooka/20070910/11893
                       59199)
駄目元で PHP のソースを見る。

             訳わかんねぇ

             。゚ ( ゚ ´Д `゚ ) ゚。

      yacc? lex? ZTS ってなーに?

 “ 小泉守義の PHP ソースコードウォッチ”
https://www.codeblog.org/blog/moriyoshi/
             “ZeroMemory”
          http://ido.nu/kuma/
 でも読んで勉強してみようか知らん・・・。
以上が前置き。



手っ取り早く PHP の現状の文法の範囲内で、何と
 か抜け道を見つけ、エスケープメントの縛りから
     逃れる方法は無いのか・・・。

   (ヒアドキュメントも目的を達し得ない)
とにかく、


    PHP のコードが「そのまま」
    べた書きできればイイ!!

      それが最優先!!

とにかくエスケープメントから逃げたい!!!
あった。



    電波受信成功
     !!!
キタ─wwヘ√レvv~ ( ゚∀゚ )─ wwヘ√レvv~─ !!  
出力バッファリングを使え!!
●   PHP では” <?php” - “?>” の「外」はそのまま出
    力される。 (HTML 埋め込み型言語だから )
●   つまり、「外」では何を書こうがエスケープの心配
    は要らない。
●
    → わざと「外」に PHP のコードを書き、それを ob
    _*() で取得すればどうにかできるのでは?
Proof of Concept
hoge1.php :
<?php
$i = 0;
ob_start();
?>
global $i;                             普通なら HTML が入る箇所に、わざ
$i++;                                  と PHP コードを入れる。
return quot;Hello, World! + [$i]quot;;         → エスケープの必要が無くなる。
<?php
$_code = ob_get_contents();
ob_end_clean();

echo eval($_code).quot;nquot;; // out : Hello, World! + [1]
echo eval($_code).quot;nquot;; // out : Hello, World! + [2]
echo eval($_code).quot;nquot;; // out : Hello, World! + [3]
?>
Pseudo_Block


      「疑似」コードブロックをサポート

http://xhwlay.sourceforge.net/Pseudo_Block/

       ・ Apache Software License 2
                ・ PHP4/5
            ・ PEAR パッケージ
Usage 1 : Pseudo_Eval
<?php
require_once('Pseudo/Eval.php');
$pe =& new Pseudo_Eval();
$pe->start(); // start pseudo block
?>
$a = quot;ABC.quot;;
$b = 'xyz.';                        ここが疑似ブロック
return $a . $b . $c;
<?php
$pe->end(); // end pseudo block
$val = 30;
$pe->bind('c', $val); // eval() された時のコードブロックに、変数をコピーする。

$result = $pe->act();
echo $result . PHP_EOL;
// out : quot;ABC.xyz.30quot;
?>
Usage 2 : Pseudo_Lambda
<?php
require_once('Pseudo/Lambda.php');
$pl =& new Pseudo_Lambda('$a, $b');
$pl->start(); // start pseudo block
?>
static $c = 0; $c++;
return $a + $b + $c + $d;           ここが疑似ブロック
<?php
$pl->end(); // end pseudo block

$val = 30;
$pl->bind('d', $val); // 匿名関数のスコープに外部変数をコピーする。

$func = $pl->create();
echo $func(1, 2) . PHP_EOL; // out : 34 (1 + 2 + 1($c) + 30($d))
echo $func(3, 4) . PHP_EOL; // out : 39 (3 + 4 + 2($c) + 30($d))
?>
Usage 3 : Pseudo_Block
<?php
require_once('Pseudo/Block.php');
$pb =& new Pseudo_Block();
$pb->start(); // start pseudo block
?>
Name|Age|Hobbies
Masahiko|26|Programming             ここが疑似ブロック
Sakamoto|62|Cooking
FengJing|-|Walking
<?php
$pb->end(); // end pseudo block

$text = $pb->getText(); // 疑似ブロック内のテキストを取得

$rows = array_map('trim', explode(quot;nquot;, $text));
foreach($rows as $row) {
    echo strtr($row, quot;|quot;, quot;,quot;) . PHP_EOL;
}
?>
ご意見募集中。
●   http://sourceforge.net/projects/xhwlay/
     – ↑ の Tracker 、あるいは msakamoto-sf のはて
       なダイアリへ。
●   コードブロック中でクラスや関数を定義したり、
    外部と参照をやりとりし始めるとヤバイかも・・・。
     – →tokenizer を通して conflict なコードは除去す
       る?
●   あまりいぢめないで下さい。 (*´д ` *)
     – 泣いちゃいます。
     – PHP の文法としてサポートする議論のとば口
       になれば・・・。
で。

             ・・・使うのか?

                   ↓

「別に、 eval() とか匿名関数とか使わなくても Web
             は作れるよね。」

「何でもかんでも {Perl|Ruby|JavaScript|Python} マ
      ンセーっておかしくね?」

             ・・・ビミョー・・・。
おしまい。




( ゚ Д ゚ )y─┛~~

    ウマー。
おまけ:無責任な Proposal


C のソースを埋め込み、 PHP の Extension として
実行時にコンパイル ,dl() しちゃうとかどうだろう?
    (CPAN の Inline モジュールみたく )

埋め込まれたテキストのハッシュ値を取っておいて
 上手く cache, expire の仕掛けを作れば・・・?

  Pseudo_{C|Java|Ruby|Perl|Python|Lisp|e.t.c}

More Related Content

What's hot

Php & mysql
Php & mysqlPhp & mysql
Php & mysqlola98z
 
20090307cakephphandson 01
20090307cakephphandson 0120090307cakephphandson 01
20090307cakephphandson 01Yusuke Ando
 
Symfony Project Publication
Symfony Project PublicationSymfony Project Publication
Symfony Project PublicationAlex Demchenko
 
Professional Web Development
Professional Web DevelopmentProfessional Web Development
Professional Web DevelopmentJoseph Chiang
 
GiảI Tích 12 Phần II - Cực trị của hàm số
GiảI Tích 12  Phần  II - Cực trị của hàm sốGiảI Tích 12  Phần  II - Cực trị của hàm số
GiảI Tích 12 Phần II - Cực trị của hàm sốvinhbinh2010
 
Иван Калинин - Как правильно выбрать язык программирования
Иван Калинин - Как правильно выбрать язык программированияИван Калинин - Как правильно выбрать язык программирования
Иван Калинин - Как правильно выбрать язык программированияYandex
 
Sains bab 1 cth2 pengukuran panjang
Sains bab 1 cth2 pengukuran panjangSains bab 1 cth2 pengukuran panjang
Sains bab 1 cth2 pengukuran panjangRoslina Abdul Rashid
 
How to add Articles to the joomla 3.4
How to add Articles to the joomla 3.4How to add Articles to the joomla 3.4
How to add Articles to the joomla 3.4Mahesh Kodituwakku
 
11 компьютерийн бүтэц
11 компьютерийн бүтэц11 компьютерийн бүтэц
11 компьютерийн бүтэцSodgerel Luvsan
 
Asp .Net 2.0 安全機制 Ii
Asp .Net 2.0 安全機制 IiAsp .Net 2.0 安全機制 Ii
Asp .Net 2.0 安全機制 IiChui-Wen Chiu
 
Quran in Sinhala (28)- අල්-කුර්ආන් - අර්ථකථනය - 28 ජුස්උව
Quran in Sinhala (28)- අල්-කුර්ආන් - අර්ථකථනය - 28 ජුස්උවQuran in Sinhala (28)- අල්-කුර්ආන් - අර්ථකථනය - 28 ජුස්උව
Quran in Sinhala (28)- අල්-කුර්ආන් - අර්ථකථනය - 28 ජුස්උවwamysl
 
Php.On.Windows.Training.Chs
Php.On.Windows.Training.ChsPhp.On.Windows.Training.Chs
Php.On.Windows.Training.Chscqwang
 

What's hot (19)

Php & mysql
Php & mysqlPhp & mysql
Php & mysql
 
20090307cakephphandson 01
20090307cakephphandson 0120090307cakephphandson 01
20090307cakephphandson 01
 
Test4
Test4Test4
Test4
 
Symfony Project Publication
Symfony Project PublicationSymfony Project Publication
Symfony Project Publication
 
Professional Web Development
Professional Web DevelopmentProfessional Web Development
Professional Web Development
 
GiảI Tích 12 Phần II - Cực trị của hàm số
GiảI Tích 12  Phần  II - Cực trị của hàm sốGiảI Tích 12  Phần  II - Cực trị của hàm số
GiảI Tích 12 Phần II - Cực trị của hàm số
 
Mrr license
Mrr licenseMrr license
Mrr license
 
Иван Калинин - Как правильно выбрать язык программирования
Иван Калинин - Как правильно выбрать язык программированияИван Калинин - Как правильно выбрать язык программирования
Иван Калинин - Как правильно выбрать язык программирования
 
Basic HTML
Basic HTMLBasic HTML
Basic HTML
 
Sains bab 1 cth2 pengukuran panjang
Sains bab 1 cth2 pengukuran panjangSains bab 1 cth2 pengukuran panjang
Sains bab 1 cth2 pengukuran panjang
 
How to add Articles to the joomla 3.4
How to add Articles to the joomla 3.4How to add Articles to the joomla 3.4
How to add Articles to the joomla 3.4
 
Lekts13
Lekts13Lekts13
Lekts13
 
Add templates to the joomla
Add templates to the joomlaAdd templates to the joomla
Add templates to the joomla
 
11 компьютерийн бүтэц
11 компьютерийн бүтэц11 компьютерийн бүтэц
11 компьютерийн бүтэц
 
Asp .Net 2.0 安全機制 Ii
Asp .Net 2.0 安全機制 IiAsp .Net 2.0 安全機制 Ii
Asp .Net 2.0 安全機制 Ii
 
如何撰寫Install
如何撰寫Install如何撰寫Install
如何撰寫Install
 
Quran in Sinhala (28)- අල්-කුර්ආන් - අර්ථකථනය - 28 ජුස්උව
Quran in Sinhala (28)- අල්-කුර්ආන් - අර්ථකථනය - 28 ජුස්උවQuran in Sinhala (28)- අල්-කුර්ආන් - අර්ථකථනය - 28 ජුස්උව
Quran in Sinhala (28)- අල්-කුර්ආන් - අර්ථකථනය - 28 ජුස්උව
 
ECMalana_CV
ECMalana_CVECMalana_CV
ECMalana_CV
 
Php.On.Windows.Training.Chs
Php.On.Windows.Training.ChsPhp.On.Windows.Training.Chs
Php.On.Windows.Training.Chs
 

Viewers also liked

Cost Reduction In Digitisation
Cost Reduction In DigitisationCost Reduction In Digitisation
Cost Reduction In DigitisationSimon Tanner
 
Hôtellerie de Plein Air de l'Aveyron
Hôtellerie de Plein Air de l'AveyronHôtellerie de Plein Air de l'Aveyron
Hôtellerie de Plein Air de l'AveyronLudovic Dublanchet
 
Cromoterapie
CromoterapieCromoterapie
Cromoterapieadanic
 
Społecznośc taneczna - roztańczonyweb.pl
Społecznośc taneczna - roztańczonyweb.plSpołecznośc taneczna - roztańczonyweb.pl
Społecznośc taneczna - roztańczonyweb.plFillNet
 
Gestionar El Cambio
Gestionar El CambioGestionar El Cambio
Gestionar El CambioAlicia_C
 

Viewers also liked (9)

Cost Reduction In Digitisation
Cost Reduction In DigitisationCost Reduction In Digitisation
Cost Reduction In Digitisation
 
Tempo MáGico
Tempo MáGicoTempo MáGico
Tempo MáGico
 
Hôtellerie de Plein Air de l'Aveyron
Hôtellerie de Plein Air de l'AveyronHôtellerie de Plein Air de l'Aveyron
Hôtellerie de Plein Air de l'Aveyron
 
PresentacióN1
PresentacióN1PresentacióN1
PresentacióN1
 
Cromoterapie
CromoterapieCromoterapie
Cromoterapie
 
Społecznośc taneczna - roztańczonyweb.pl
Społecznośc taneczna - roztańczonyweb.plSpołecznośc taneczna - roztańczonyweb.pl
Społecznośc taneczna - roztańczonyweb.pl
 
Gestionar El Cambio
Gestionar El CambioGestionar El Cambio
Gestionar El Cambio
 
Frosinone 2003
Frosinone 2003Frosinone 2003
Frosinone 2003
 
LA CONCIENCIA UNIVERSAL
LA CONCIENCIA UNIVERSALLA CONCIENCIA UNIVERSAL
LA CONCIENCIA UNIVERSAL
 

Pseudo Block

  • 1. eval() と create_function() の ミニレシピ 坂本昌彦 msakamoto-sf@users.sourceforge.net
  • 2. 自己紹介 ● PHP, Java プログラマー ● 404 Blog Not Found の影響で Perl に浮気中。 ● はてなダイアリ: ● http://d.hatena.ne.jp/msakamoto-sf/ ● PukiWiki : ● http://www.glamenv-septzen.net/pukiwiki/inde x.php
  • 3. eval() って? ● 文字列を PHP コードとして評価する ● http://jp.php.net/manual/ja/function.eval.php ● サンプルは後で。 ● フレームワークなどで、動的な処理を行わせた い場合に使われているらしい。 ● ● 但し、著者は現場では一度も使ったことがな い。・・・ ( ; ´Д ` ) ウウッ…
  • 4. create_function() って? ● 匿名関数 ( ラムダ形式 ) を作成する ● http://jp.php.net/manual/ja/function.create-fun ction.php ● array_map などで callback に使う関数を、一々定 義するのが面倒なときに使ったりするらしい。 ● ● 但し、これも著者は現場での使用経験は無 し。・・・ ( ; ´Д ` ) ウウッ…
  • 5. eval() の例 eval01.php: <?php $a = “xyz”; eval('$b = “abc”; $c = '123'; $result = $a . $b . $c;'); echo $result; ?> > php eval01.php xyzabc123 >
  • 6. create_function() の例 create_function01.php: <?php $lambda = create_function('$a, $b', 'static $c; $c++; return $a + $b + $c;'); echo $lambda(1, 2) . PHP_EOL; echo $lambda(3, 4) . PHP_EOL; ?> > php create_function01.php 4 // 1 + 2 + 1 ($c) 9 // 3 + 4 + 2 ($c) >
  • 9. Perl なら・・・ !! (eval の場合 ) #!/usr/bin/perl use strict; use warnings; my $a = “xyz”; my $result; eval { my $b = “abc”; my $c = '123'; $result = $a . $b . $c; }; print $result;
  • 10. Perl なら・・・ !! ( 匿名関数の場合 ) #!/usr/bin/perl use strict; use warnings; my $c = 0; my $lambda = sub() { my ($a, $b) = @_; $c++; return $a + $b + $c; }; print $lambda->(1, 2), “n”; print $lambda->(3, 4), “n”;
  • 11. PHP でこうできれば・・・!! <?php ... eval { $a = ... } $lambda = function($a, $b) { ... return ...; } $result = $lambda(1, 2); ... ?>
  • 12. 匿名関数については、挑戦者がいた。 パッチも作成され、 ML でも議論された。 [PHP-DEV] PATCH: anonymous functions in PHP http://marc.info/?l=php-internals&m=1174261219 11550&w=2
  • 13. が・・・。 忘れ去られたっぽい。 Σ (゚ д ゚ lll ) ↓ ML のスレッドも 2007 年 3 月一杯で終了。 ↓ PHP 5.3 Suggested Feature List にも無し。 (http://d.hatena.ne.jp/shimooka/20070910/11893 59199)
  • 14. 駄目元で PHP のソースを見る。 訳わかんねぇ 。゚ ( ゚ ´Д `゚ ) ゚。 yacc? lex? ZTS ってなーに? “ 小泉守義の PHP ソースコードウォッチ” https://www.codeblog.org/blog/moriyoshi/ “ZeroMemory” http://ido.nu/kuma/ でも読んで勉強してみようか知らん・・・。
  • 15. 以上が前置き。 手っ取り早く PHP の現状の文法の範囲内で、何と か抜け道を見つけ、エスケープメントの縛りから 逃れる方法は無いのか・・・。 (ヒアドキュメントも目的を達し得ない)
  • 16. とにかく、 PHP のコードが「そのまま」 べた書きできればイイ!! それが最優先!! とにかくエスケープメントから逃げたい!!!
  • 17. あった。 電波受信成功 !!! キタ─wwヘ√レvv~ ( ゚∀゚ )─ wwヘ√レvv~─ !!  
  • 18. 出力バッファリングを使え!! ● PHP では” <?php” - “?>” の「外」はそのまま出 力される。 (HTML 埋め込み型言語だから ) ● つまり、「外」では何を書こうがエスケープの心配 は要らない。 ● → わざと「外」に PHP のコードを書き、それを ob _*() で取得すればどうにかできるのでは?
  • 19. Proof of Concept hoge1.php : <?php $i = 0; ob_start(); ?> global $i; 普通なら HTML が入る箇所に、わざ $i++; と PHP コードを入れる。 return quot;Hello, World! + [$i]quot;; → エスケープの必要が無くなる。 <?php $_code = ob_get_contents(); ob_end_clean(); echo eval($_code).quot;nquot;; // out : Hello, World! + [1] echo eval($_code).quot;nquot;; // out : Hello, World! + [2] echo eval($_code).quot;nquot;; // out : Hello, World! + [3] ?>
  • 20. Pseudo_Block 「疑似」コードブロックをサポート http://xhwlay.sourceforge.net/Pseudo_Block/ ・ Apache Software License 2 ・ PHP4/5 ・ PEAR パッケージ
  • 21. Usage 1 : Pseudo_Eval <?php require_once('Pseudo/Eval.php'); $pe =& new Pseudo_Eval(); $pe->start(); // start pseudo block ?> $a = quot;ABC.quot;; $b = 'xyz.'; ここが疑似ブロック return $a . $b . $c; <?php $pe->end(); // end pseudo block $val = 30; $pe->bind('c', $val); // eval() された時のコードブロックに、変数をコピーする。 $result = $pe->act(); echo $result . PHP_EOL; // out : quot;ABC.xyz.30quot; ?>
  • 22. Usage 2 : Pseudo_Lambda <?php require_once('Pseudo/Lambda.php'); $pl =& new Pseudo_Lambda('$a, $b'); $pl->start(); // start pseudo block ?> static $c = 0; $c++; return $a + $b + $c + $d; ここが疑似ブロック <?php $pl->end(); // end pseudo block $val = 30; $pl->bind('d', $val); // 匿名関数のスコープに外部変数をコピーする。 $func = $pl->create(); echo $func(1, 2) . PHP_EOL; // out : 34 (1 + 2 + 1($c) + 30($d)) echo $func(3, 4) . PHP_EOL; // out : 39 (3 + 4 + 2($c) + 30($d)) ?>
  • 23. Usage 3 : Pseudo_Block <?php require_once('Pseudo/Block.php'); $pb =& new Pseudo_Block(); $pb->start(); // start pseudo block ?> Name|Age|Hobbies Masahiko|26|Programming ここが疑似ブロック Sakamoto|62|Cooking FengJing|-|Walking <?php $pb->end(); // end pseudo block $text = $pb->getText(); // 疑似ブロック内のテキストを取得 $rows = array_map('trim', explode(quot;nquot;, $text)); foreach($rows as $row) { echo strtr($row, quot;|quot;, quot;,quot;) . PHP_EOL; } ?>
  • 24. ご意見募集中。 ● http://sourceforge.net/projects/xhwlay/ – ↑ の Tracker 、あるいは msakamoto-sf のはて なダイアリへ。 ● コードブロック中でクラスや関数を定義したり、 外部と参照をやりとりし始めるとヤバイかも・・・。 – →tokenizer を通して conflict なコードは除去す る? ● あまりいぢめないで下さい。 (*´д ` *) – 泣いちゃいます。 – PHP の文法としてサポートする議論のとば口 になれば・・・。
  • 25. で。 ・・・使うのか? ↓ 「別に、 eval() とか匿名関数とか使わなくても Web は作れるよね。」 「何でもかんでも {Perl|Ruby|JavaScript|Python} マ ンセーっておかしくね?」 ・・・ビミョー・・・。
  • 26. おしまい。 ( ゚ Д ゚ )y─┛~~ ウマー。
  • 27. おまけ:無責任な Proposal C のソースを埋め込み、 PHP の Extension として 実行時にコンパイル ,dl() しちゃうとかどうだろう? (CPAN の Inline モジュールみたく ) 埋め込まれたテキストのハッシュ値を取っておいて 上手く cache, expire の仕掛けを作れば・・・? Pseudo_{C|Java|Ruby|Perl|Python|Lisp|e.t.c}