4

私は次のコードを持っています、

<?php
class Templater
{
    static $params = array();

    public static function assign($name, $value)
    {
        self::$params[] = array($name => $value);
    }

    public static function draw()
    {
        self::$params;
    }
}


 $test = Templater::assign('key', 'value');
 $test = Templater::draw();
 print_r($test);

これを使用できるように、このスクリプトを変更するにはどうすればよいですか?

$test = Templater::assign('key', 'value')->assign('key2', 'value2')->draw();
print_r($test);
4

6 に答える 6

7

クラスレベルのスコープを返すことができないため、静的メソッドでメソッドチェーンを使用することはできません(return selfしません)。メソッドを通常のメソッドに変更しreturn $this、各メソッドでチェーンを許可します。

T_PAAMAYIM_NEKUDOTAYIM通知が発生するため、インスタンスメソッドへのアクセスには使用しないでE_STRICTください。T_OBJECT_OPERATORインスタンスメソッドの呼び出しに使用します。

以下も参照してください。

于 2010-06-07T15:53:54.040 に答える
6

静的メンバーを使用しないでください。

class Templater
{
    private array $params = [];

    public function assign($name, $value) : self
    {
        $this->params[$name] = $value;

        return $this;
    }

    public function draw()
    {
        // do something with $this->params
    }
}

$test = (new Templater())->assign('key', 'value')->assign('key2', 'value2')->draw();
于 2010-06-07T15:51:08.910 に答える
3

静的なものの代わりに、インスタンス変数とインスタンス関数を使用するだけです。

<?php
class Templater
{
    $params = array();

    public function assign($name, $value)
    {
        $this->params[] = array($name => $value); 
        return $this;
    }

    public function draw()
    {
        echo $this->params;
        return $this;
    }
}

$test = new Templater();
$test->assign('key', 'value')->assign('key2', 'value2')->draw();
print_r($test);
于 2010-06-07T15:49:58.957 に答える
1

////////

class Templater {static $ params = array();

public static function assign($name, $value)
{
    self::$params[] = array($name => $value);
    return new Templater;
}

public static function draw()
{
    return self::$params;
}

}

$ test = Templater ::assign('key'、'value')-> assign('key2'、'value2')-> draw(); print_r($ test);

于 2014-09-25T03:32:20.050 に答える
0

静的呼び出しとそのようなインスタンス呼び出しを混在させることは、一般に貧弱な形式であり、それを省略します(静的である必要がある理由を示さない限り)。使用しているもう1つの概念は、コールチェーンです。これは、リターンを使用して実装されます。

class Templater
{
    protected $params = array();

    public function assign($name, $value) {
        $this->params[] = array($name => $value);
        return $this;
    }

    public function draw() {
        // do drawing w/ $this->params;
        return $this;
    }
}
于 2010-06-07T15:58:36.870 に答える
0
class Templater
{   
    public static $params;

    private static $_instance = null;

    public static function init()
    {
        if (self::$_instance === null)
        {
            self::$_instance = new self;
        }

        return self::$_instance;
    }

    public function assign($name, $value)
    {
        self::$params[$name] = $value;
        return $this;
    }

    public function draw()
    {
        return self::$params;
    }
}

$test = Templater::init()->assign('key', 'value')->assign('key2', 'value2')->draw();
于 2010-06-07T16:09:30.340 に答える