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.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。