IT戦記 このページをアンテナに追加 RSSフィード Twitter

2009-08-03

PHP で引数をそのまま返す関数を作っておくと便利

PHP では以下のように new してすぐメソッドを呼べない

<?php
    new DateTime()->getOffset();

なので、引数をそのまま返す関数を作ってやると

<?php
    function expr($a) { return $a; }

    expr(new DateTime())->getOffset(); // OK!

便利だなー

おまけ

配列アクセス用のも作っておくと便利

<?php
    function expr($a) { return $a; }
    function idx($array, $i) { return $array[$i]; }

    echo idx(idx(expr(new DateTimeZone('Asia/Tokyo'))->getTransitions(), 0), 'abbr') . "\n";

おまけ2

無名関数をそのまま呼ぶときにも使える。

<?php
    function expr($a) { return $a; }
    expr(function() { echo "hello\n"; })->__invoke();

おまけ3

配列は、以下のようにして繋ぐことも

<?php
    class Ref { var $val; function __construct($a) { $this->val = $a; } } 
    function ref($a) { return new Ref($a); }

    ref(array(1, 2, 3))->val[0];

apple4uapple4u 2009/08/04 12:46 インスタンス捨てちゃうなら
クラス名::メソッド名()
とかじゃダメなんかな?

amachangamachang 2009/08/04 12:48 そうですね!
それでもいいんじゃないでしょうか!

anpontan-pokananpontan-pokan 2009/08/05 14:32 コンストラクタとかでいろいろあったらインスタンス生成したいときもある気がする

class A {
function __construct() {
//なんらか処理
}
function test() {
//なんらかの処理
}
}

(new A())->func();

みたいな感じで

anpontan-pokananpontan-pokan 2009/08/05 14:34 expr(new A())->test();

だった

nic9nic9 2009/08/09 10:07 僕は

class a{
function i(){
return new self;
}
function &s(){
static $i;
if( empty( $i ) ) $i = self::i();
return $i;
}
}

という風に書いたりしてるよ!
a::i()->method(); とか a::s()->method(); みたいな。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。