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

////////

类模板{静态$参数=数组();

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

像这样混合静态调用和实例调用通常是一种糟糕的形式,忽略那个(除非你给出它需要是静态的理由)。您正在使用的另一个概念是调用链,它是使用返回实现的。

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 回答