PHP ООП: метод цепочки - PullRequest
       24

PHP ООП: метод цепочки

4 голосов
/ 07 июня 2010

У меня есть следующий код,

<?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);

Ответы [ 6 ]

7 голосов
/ 07 июня 2010

Вы не можете использовать Объединение методов со статическими методами, потому что вы не можете возвратить область действия уровня класса (return self не будет) Измените ваши методы на обычные методы и return $this в каждом методе, для которого вы хотите разрешить цепочку.

Обратите внимание, что вы не должны использовать T_PAAMAYIM_NEKUDOTAYIM для доступа к методам экземпляра, так как это вызовет E_STRICT Уведомление. Используйте T_OBJECT_OPERATOR для вызова методов экземпляра.

Также см .:

6 голосов
/ 07 июня 2010

Вы не должны использовать статические элементы:

class Templater
{
    private $params = array();

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

    public function draw()
    {
        //not really sure what you want here
    }
}

$test = new Templater()->assign('key', 'value')->assign('key2', 'value2')->draw();
3 голосов
/ 07 июня 2010

Просто используйте переменные экземпляра и функции экземпляра вместо статических.

<?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);
1 голос
/ 25 сентября 2014

////////

класс Templater { статические $ 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 ($ тест);

0 голосов
/ 07 июня 2010
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();
0 голосов
/ 07 июня 2010

Смешивание статического вызова и вызова экземпляра в целом является плохой формой, пропуская его (если только вы не объясните, почему он должен быть статическим).Другая концепция, с которой вы работаете, это цепочка вызовов, которая реализована с использованием return.

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;
    }
}
...