2010-06-07 50 views
4

我有下面的代碼,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); 
+1

您可能還需要修改assign()方法,以便它可以接受key =>值的數組。 – allnightgrocery 2010-06-07 15:52:38

+0

你應該更確切地知道你真正想做什麼。一個簡單的關聯數組是否符合你的目的? – mathk 2010-06-07 15:55:31

回答

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()方法的結尾,否則鏈接將不起作用。 – 2010-06-07 15:56:43

+0

沒錯,PHP默認是不流利的 – vartec 2010-06-07 16:04:31

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 2013-03-15 04:21:42

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 ::分配( '鍵', '值') - >分配( 'KEY2', '值2') - >拉伸(); print_r($ test);