2014-03-12 32 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 
)