我一直在努力编写一个类,让我的同学更容易将项目插入数据库。为此,我想在该类中创建一个函数,将所有列和值作为键和值数组。显然我可以做到以下几点:
class aClass {
public function aFunction( $args ) {
}
}
(new aClass)->aFunction( Array( 'column1' => 'value1', 'column2' => 'value2' ) );
这会创建一个带有$ args [column] = value的数组$ args。而且我知道我不是第一个问这个问题的人,但是我想让它更棒的发作。 我正在寻找一个至少比上面的例子更有趣的替代方案。我没多久意识到' =>'是除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'"只会回归"'价值'"关于成功,这使得它只是一种愚蠢的长期和资源效率低下的方式来写作"''"。
任何sugestions?我知道它有点愚蠢而且之前可能已经提出过这个问题,但只有Array类才具有该结构似乎是不公平的。我现在实际上已经谷歌搜索了几个小时,亲爱的上帝,请帮助我的ocd。
编辑: 即使它只是让php解析器解释=>作为一个逗号所以我可以使用模数运算符,任何事情都会更好。
答案 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
)