2014-03-12 30 views
1

我一直在試圖編寫一個類,以便爲我的同學輕鬆插入項目到數據庫中。爲此,我想在該類中創建一個函數,將所有列和值作爲鍵和值的數組。很明顯,我可以做到以下幾點:PHP:將參數解釋爲數組?

class aClass { 
    public function aFunction($args) { 
    } 
} 

(new aClass)->aFunction(Array('column1' => 'value1', 'column2' => 'value2')); 

這將創建一個數組$ args的$ args [column] = value。而且我知道我不是第一個問這個問題的人,但我希望它更有魅力。 我在尋找一個至少比上面的例子更有趣的替代方案。對於除了Array之外的每個類,'=>'是一個直接的語法錯誤,我沒有多久就意識到這一點。那麼,我已經嘗試了兩件事,其中一件事情更糟,其中一件事因爲我的推理失敗而失效。

class aClass { 
    public function aFunction() { 
     $args = func_get_args(); 
    } 
} 

(new aClass)->aFunction('value1', 'value2'); 

上面是相當整潔,但我知道沒有辦法傳遞列名沒有比第一個例子更長和更笨的列。

class aClass { 
    public function aFunction() { 
     $args = get_defined_vars(); 
    } 
} 

(new aClass)->aFunction($column1 = 'value1', $column2 = 'value2'); 

除了不起作用的事實之外,上述方法將會正常。我認爲它不起作用,因爲「$ column1 ='value1'」只會在成功時返回「'value'」,這使得它成爲一個愚蠢而且資源效率低下的方式,只寫「'value'」。

任何消耗?我知道這有點愚蠢,這個問題以前可能已經問過了,但只有Array類才具有這種語法,看起來不公平。我現在實際上一直在Google上搜索幾個小時,親愛的上帝請幫助我的ocd。

編輯: 即使它只是使php解析器interpret =>作爲逗號的東西,所以我可以使用模運算符,任何事情都會更好。

+1

你可以使用新的短數組符號(PHP> = 5.4)。例如:'$ a = [1,2,3,4];'或'$ a = ['one'=> 1,'two'=> 2,'three'=> 3,'four'=> 4 ];' – Linblow

+0

哦,這其實並不算太糟:我 –

回答

1

你可以使用這樣的東西作爲模板,它仍然需要一些工作。

<?php 

class DB{ 
     private $cols; 
     private $values; 


     public function __call($method,$arguments){ 
       $this->cols[] = "`".$method."`=?"; 
       $this->values[] = $arguments[0]; 
       return $this; 
     } 

     public function exec(){ 
       $sql = "INSERT INTO `test` SET "; 
       $sql .= implode(",",$this->cols); 
       echo "SQL for prepared statement: ".$sql."\n"; 
       echo "Values:\n"; 
       print_r($this->values); 
     } 


     public static function insert(){ 
       return new self(); 
     } 

} 

//Usage  
DB::insert()->column1('value1')->column2('value2')->exec(); 

輸出:

SQL for prepared statement: INSERT INTO `test` SET `column1`=?,`column2`=? 
Values: 
Array 
(
    [0] => value1 
    [1] => value2 
)