

PHP での、コロンの意味について教えて下さい。

最近 PHP を学習しだした者です。

書籍にて、 Slim フレームワークのサンプルがあったので、それを意味を理解しながら、写経しています。  
そこで不明な点が有りましたので、質問します。

↓ Slimサンプルアプリケーション [Tinitter
のコード](https://github.com/uzulla/Tinitter/blob/master/lib/Tinitter/Route.php#L14)で、

[code]

    $app->get('/', '\Tinitter\Controller\TimeLine:show');
    
[/code]

とあります。

`TimeLine:show` のコロンはなぜ一つなのでしょうか??

`TimeLine` クラスのクラスメソッドの `show` を呼んでいるのですが、 `TimeLine::show` ではないのでしょうか??

インスタンスメソッドの時は、アロー演算子で呼び出すと思うのですが、クラスメソッドの時は、 `::` ではなくて、 `:`
を間に挟んで呼び出すということなのでしょうか?


CC BY-SA 3.0
2015-01-15T05:12:43.777
4590
2015-01-15T07:44:12.390
2015-01-15T05:33:59.453
4978
5852
question
php slim url-routing
PHP + Slim での、インスタンスメソッド呼び出しの際に使われる 「: (コロン記号)」に関して


これは、 Slim 独自の表現で、 PHP とは関係がありません。

件は、URL による、処理のルーティング（振り分け）の部分です。URLのパターンを決め、パターンにマッチしたものをどうするか指定しています。

[code]

    $app->get('/', '\Tinitter\Controller\TimeLine:show');
    
[/code]

→ 「 `/` に HTTP アクセスがあったならば、 `TimeLine` をインスタンス化して、 `show` メソッドを
HTTPを処理するメソッドとして使用する」という指定だと考えられます。 ~~アクセスごとに丁寧にインスタンス化するあたり、PHP 的ですね。~~

`:` でインスタンスメソッド指定する方法は、 Slim 2.4.0
に追加されたものらしく、[ドキュメント](http://docs.slimframework.com/#Route-
Parameters)に載っていなさそうですので、疑問を持たれたのは当然かと思います。[リリースノートには他に](https://github.com/codeguy/Slim/releases/tag/2.4.0)、
`::` の指定で、スタティックメソッド呼び出しになるらしいことが言及されています。

参考: [Slim Framework Document: Route
Parameters](http://docs.slimframework.com/#Route-Parameters)


CC BY-SA 3.0
2015-01-15T05:57:57.200
4595
2015-01-15T05:57:57.200
4978
4590
answer

[code]

    $app->get('/', '\Tinitter\Controller\TimeLine:show');
    
[/code]

このコードにおける `'\Tinitter\Controller\TimeLine:show'`
の部分は、PHPの言語構造としては単なる「文字列」です。クラスとメソッドに対応するものが書かれているので、PHPの言語構造のように見えてしまって紛らわしいですが、この文字列からPHPが何か解釈をするわけではありません。

Slimフレームワークのコードで上記のように `$app->get()`
を呼び出した時、フレームワーク内の[`Route`クラスの`setCallable()`メソッド](https://github.com/codeguy/Slim/blob/master/Slim/Route.php#L162)が呼ばれます。

[code]

    public function setCallable($callable)
    {
        $matches = array();
        if (is_string($callable) && preg_match('!^([^\:]+)\:([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)$!', $callable, $matches)) {
            $class = $matches[1];
            $method = $matches[2];
            $callable = function() use ($class, $method) {
                static $obj = null;
                if ($obj === null) {
                    $obj = new $class;
                }
                return call_user_func_array(array($obj, $method), func_get_args());
            };
        }
        if (!is_callable($callable)) {
            throw new \InvalidArgumentException('Route callable must be callable');
        }
        $this->callable = $callable;
    }
    
[/code]

このコードを見ると、指定されたものが文字列で、かつコロンがある場合に、それをクラス名とメソッドに分割してから、クラスをインスタンス化していることがわかります。


CC BY-SA 3.0
2015-01-15T07:44:12.390
4600
2015-01-15T07:44:12.390
5444
4590
answer