JavaScriptとPHPの共通点・相違点をいくつかメモ。
本記事で取り上げる機能とJavaScript, PHPの対応状況。
機能 | JavaScript | PHP |
---|---|---|
無名関数 | ○ | ○ |
クロージャー | ○ | ○ |
即時実行 | ○ | × |
Function.prototype.apply, call | ○ | × |
可変変数 | × | ○ |
可変関数 | × | ○ |
call_user_func, call_user_func_array | × | ○ |
可変長な引数 | ○ | ○ |
var foo = function () {};
$foo = function() {};
function outer(name) { // 引数も自由変数 var count = 0; // 自由変数 return function() { console.log(name + ': count is ' + ++count); }; } var counter = outer('foo'); counter(); counter();
<?php $outer = function($name) { // 引数も自由変数 $count = 0; // 自由変数 return function () use (&$name, &$count) { $res = $name . ': count is ' . ++$count; return $res; }; }; $counter = $outer('foo'); echo $counter(); echo $counter(); ?>
var counter = (function (name) { // 引数も自由変数 var count = 0; // 自由変数 return function() {<br /> console.log(name + ': count is ' + ++count); }; }('foo')); counter(); counter();
即時実行の機能はない。
JavaScriptはFunction.prototype.applyやcallで委譲を行う。
Function.prototype.apply (thisArg, argArray) Function.prototype.call (thisArg [ , arg1 [ , arg2, … ] ] ) ECMAScript Language Specification p128
var obj = {}; (function() { obj.name = 'foo'; var show = function() { console.log(this.name); }; obj.show = show; }()); obj.show(); // foo var other = { 'name': 'bar' }; obj.show.apply(other); // bar
PHPはapply, callに対応する関数はない。
JavaScriptには可変変数はない。
<?php $var = 1; $var_name = 'var'; echo $$var_name, PHP_EOL; ?>
小川雄太, 柄沢 聡太郎, 橋口 誠『パーフェクト PHP』技術評論社 (p42)の例
JavaScriptは可変関数の機能はない。ただしブラケット([])を使うアクセスで同様の処理を行える。
fucntion foo() { } window['foo']();
※ コード内でブラケットをエスケープする方法が分からなかったので全角で記載。
<?php function foo($str) { echo 'Hello : ' . $str . '!'; } $vfanc = 'foo'; $vfanc('bar'); // 変数vfancに$を付けて可変関数として実行 ?>
なし
可変関数と似た働き。文字列で関数を呼び出すことができる。
小川雄太, 柄沢 聡太郎, 橋口 誠『パーフェクト PHP』技術評論社 (p111)
function add($v1, $v2) { return $v1 + $v2; } call_user_func('add', 1, 2); // 3
JavaScriptは関数の中で実引数をarguments変数で取得できる。
function hoge() { var i = 0; for (i = 0; i < arguments.length; i++) { console.log(arguments[i]); } } hoge('foo', 'bar');
function hoge() { $args = func_get_args(); foreach ($args as $value) { echo $value, PHP_EOL; } } hoge('foo', 'bar');
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。