JavaScriptとPHPの違いをメモ : JavaScript, PHP

Pocket

JavaScriptとPHPの共通点・相違点をいくつかメモ。

本記事で取り上げる機能とJavaScript, PHPの対応状況。

機能 JavaScript PHP
無名関数
クロージャー
即時実行 ×
Function.prototype.apply, call ×
可変変数 ×
可変関数 ×
call_user_func, call_user_func_array ×
可変長な引数

無名関数

JavaScript

var foo = function () {};

PHP

$foo = function() {};

クロージャー

JavaScript

function outer(name) { // 引数も自由変数
    var count = 0;     // 自由変数
    return function() {
        console.log(name + ': count is ' + ++count);
    };
}
var counter = outer('foo');
counter();
counter();

jsFiddle

PHP

<?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();
?>

jsFiddle

即時実行

JavaScript

var counter = (function (name) { // 引数も自由変数
    var count = 0;     // 自由変数
    return function() {<br />
        console.log(name + ': count is ' + ++count);
    };
}('foo'));
counter();
counter();

jsFiddle

PHP

即時実行の機能はない。

apply, call

JavaScript

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

PHPはapply, callに対応する関数はない。

可変変数

JavaScript

JavaScriptには可変変数はない。

PHP

<?php
$var = 1;
$var_name = 'var';
echo $$var_name, PHP_EOL;
?>

小川雄太, 柄沢 聡太郎, 橋口 誠『パーフェクト PHP』技術評論社 (p42)の例

可変関数

JavaScript

JavaScriptは可変関数の機能はない。ただしブラケット([])を使うアクセスで同様の処理を行える。

fucntion foo() {
}
window['foo']();

※ コード内でブラケットをエスケープする方法が分からなかったので全角で記載。

PHP

<?php
function foo($str) {
    echo 'Hello : ' . $str . '!';
}
$vfanc = 'foo';
$vfanc('bar');    // 変数vfancに$を付けて可変関数として実行
?>

call_user_func(), call_user_func_array

JavaScript

なし

PHP

可変関数と似た働き。文字列で関数を呼び出すことができる。
小川雄太, 柄沢 聡太郎, 橋口 誠『パーフェクト PHP』技術評論社 (p111)

function add($v1, $v2)
{
    return $v1 + $v2;
}
call_user_func('add', 1, 2); // 3

可変長な引数

JavaScript

JavaScriptは関数の中で実引数をarguments変数で取得できる。

function hoge() {
    var i = 0;
    for (i = 0; i < arguments.length; i++) {
        console.log(arguments[i]);
    }
}
hoge('foo', 'bar');

PHP

function hoge() {
    $args = func_get_args();
    foreach ($args as $value) {
        echo $value, PHP_EOL;
    }
}
hoge('foo', 'bar');

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。