PHP OOP: цепочка методов

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

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

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

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

Также см:

  • Цепочка статических методов в PHP?

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

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

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

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

////////

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 ($ тест);

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

 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; } } 
 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();