【2019年11月15日】

PHPでは、関数の呼び出しに変数が使える。
どういうことか?

たとえば、

<?php

function test()
{
    print 'test関数が呼び出されました';
}

// 直接関数を呼び出す
test();

// 変数を利用して関数を呼び出す
$funcName = 'test';
$funcName();

?>
test関数が呼び出されました
test関数が呼び出されました

こんな感じ。

クラスのメソッドやフィールドの参照にも使える。

<?php

class TestClass
{
    private $value = 'あいうえお';

    public function test()
    {
        $var = 'value';
        print $this->$var;
    }
}

$cls = new TestClass();
$method = 'test';
$cls->$method();

?>
あいうえお

更に、クラス名にも使える。

<?php

class TestClass
{
    private $value = 'あいうえお';

    public function test()
    {
        $var = 'value';
        print $this->$var;
    }
}

$class = 'TestClass';
$method = 'test';
$cls = new $class();
$cls->$method();

?>

で、どう役に立つの?っていうところだが、

例えば掲示板スクリプトなどで、パラメータによって処理内容を切り分けるような場合があると思う。
例えば、

http://www.aaa.com/bbs.php?mode=list
だったら記事の一覧表示モード

http://www.aaa.com/bbs.php?mode=write
だったら記事の登録処理

http://www.aaa.com/bbs.php?mode=delete
だったら記事の削除処理

みたいな感じ。
普通だと、switchやifなどで切り分けることになるだろう。

<?php

// 登録処理関数
function write()
{

}

// 削除処理関数
function delete()
{

}

// 記事表示関数
function viewList()
{

}

// パラメータが'write'ならwrite関数呼び出し
if ('write' == $_GET['mode']) {
    write();
    header('Location: ' . $_SERVER['SCRIPT_NAME']);
}

// パラメータが'delete'ならdelete関数呼び出し
if ('delete' == $_GET['mode']) {
    delete();
    header('Location: ' . $_SERVER['SCRIPT_NAME']);
}

// 記事表示処理
viewList();



?>

超簡略化しているが、掲示板のスクリプトってだいたいこんな流れになると思う。

これを、こうすることができる。

<?php

// 登録処理関数
function write()
{

}

// 削除処理関数
function delete()
{

}

// 記事表示関数
function viewList()
{

}

$funcName = $_GET['mode'];
if (true == function_exists($funcName)) {
    // パラメータと名前が一致する関数を実行
    $funcName();
} else {
    viewList();
}

?>

また、オブジェクト指向的にやるとこんな感じ。

<?php

class Bbs
{
    // 登録処理メソッド
    public function write()
    {

    }

    // 削除処理メソッド
    public function delete()
    {

    }

    // 記事表示メソッド
    public function viewList()
    {

    }
}

$bbs = new Bbs();
$methodName = $_GET['mode'];
if (true == method_exists($bbs, $methodName)) {
    $bbs->$methodName();
} else {
    $bbs->viewList();
}

?>