【问题标题】:PHP: Interpret arguments as array?PHP:将参数解释为数组?
【发布时间】:2014-03-12 14:42:12
【问题描述】:

我一直在尝试编写一个类,以使我的同学更容易将项目插入数据库。为此,我想在该类中创建一个函数,它将所有列和值作为键和值的数组。显然我可以做到以下几点:

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'" 只会在成功时返回 "'value'",这使得仅编写 "'value'" 成为一种冗长且资源效率低下的愚蠢方式。

有什么建议吗?我知道这有点愚蠢,而且这个问题之前可能已经被问过,但是只有 Array 类才能拥有这种语法似乎是不公平的。我实际上已经在谷歌上搜索了几个小时,亲爱的上帝,请帮助我的强迫症。

编辑: 即使只是让 php 解析器将 => 解释为逗号,这样我就可以使用模数运算符,任何事情都更好。

【问题讨论】:

  • 您可以使用新的短数组表示法 (PHP >=5.4)。示例:$a = [1, 2, 3, 4];$a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];
  • 哦,这实际上还不错:我

标签: php arrays function class arguments


【解决方案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
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 2016-12-05
    • 2013-01-14
    • 2013-07-10
    相关资源
    最近更新 更多