2010-06-07 2 views
4

Я следующий код,PHP ООП: Метод Chaining

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

Вы также можете изменить метод assign(), чтобы он мог принимать массив ключей => значений. – allnightgrocery

+0

Вы должны быть более точным в том, что вы действительно хотите сделать. Является ли простой ассоциативный массив вашей целью? – mathk

ответ

7

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

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

Также смотрите:

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); 
+0

Вам нужно добавить «return $ this;» в конце метода assign() иначе цепочка не будет работать. –

+0

Право, PHP не владеет по умолчанию – vartec

6

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

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

вы не можете связать такой конструктор! – Galen

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

////////

класс Templater { статические $ PARAMS = массив();

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

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

}

$ тест = Templater :: назначить ('ключ', 'значение') -> Assign ('key2', 'value2') -> Draw(); print_r ($ test);

Смежные вопросы