[PHP-users 1825] new してすぐに class method を呼び出すには

Osamu Shigematsu php-users@php.gr.jp
Wed, 05 Sep 2001 20:04:18 +0900


重松です。

アンケートの件ではないですが、汎用的に、値が正当な範囲であるかを調べたり、入
力用の tag なんかを素早く作るための class を作ってみました。

$tag = new some_clsss($foo);
$tag = $tag->as_select_tag('foo');

と書けばいいところを、array() の中で使いたいために、1 行で書く必要がでてきま
した。

new してすぐに class method を呼び出すにはどうすればよいのでしょうか?

$tag = (new some_clsss($foo))->as_select_tag('foo');
$tag = (some_clsss($foo))->as_select_tag('foo');
$tag = ($tag = new some_clsss($foo), $tag->as_select_tag('foo'));

なんかどうかしらと思ったんですが、どうもうまくいきませんでした。

とりあえず、強引な方法として、class の名前, method の名前などを渡して、実行
した結果を返す関数を用意すればできることはわかるのですが、他にもっと良い方法
があればご教授下さい。

環境:
    PHP 4.0.6
    Apache 1.3.20
    VineLinux 2.1.5 ftp

class __object__{
    var $max = 0;
    var $guide_max = '';
    var $min = 0;
    var $guide_min = '';
    var $choices = array();
    var $guide_choices = '';
    var $val;
    
    function __object__($val){
        $this->val = $val;
    }

    function is_valid(){
        if($guide_choices && !is_set($this->choices[$this->val]))
            return $this->guide_choices;
        return '';
    }
    
    function get(){
        return $this->value;
    }
    
    function set_min($min,$guide){
        $this->min = $min;
        $this->guide_min = $guide_min;
    }
    
    function set_max($max,$guide_max){
        $this->max = $max;
        $this->guide_max = $guide_max;
    }
    
    function as_select_tag($name){
        $tag = "<select name=\"$name\">\n";
        foreach($this->choices as $val => $key){
            $tag .= "<option value=\"$val\"";
            if($this->val==$val)
                $tag .= " selected=\"selected\"";
            $tag .= ">$key</option>\n";
        }
        $tag .= "</select>";
        return $tag;
    }
}

class int_t extends __object__{
    function is_valid(){
        if($this->guide_min && $this->val < $this->min)
            return $this->guide_min;
        if($this->guide_max && $this->val > $this->max)
            return $this->guide_max;
        return __object__::is_valid();
    }
    
    function as_input_tag($name,$size=''){
        if(!$size) $size = '8';
        $tag = "<input type=\"text\" name=\"$name\" value=\"{$this->val}\"
size=\"$size\" />\n";
        return $tag;
    }
}

class contract_class_t extends int_t{
    var $choices        = array(
                            0 => '売り切りタイプ',
                            1 => '簡易見守りタイプ',
                            2 => '常時見守りタイプ 1',
                            3 => '常時見守りタイプ 2',
                            4 => '常時見守りタイプ 3');
                   
    var $guide_choices    = '不明な契約種別です。';
};

-- 
Osamu Shigematsu

http://www.ravi.ne.jp/%7eshige/
mailto:shige@ravi.ne.jp