PHP致命错误:无法重新声明功能

时间:2015-07-16 06:29:25

标签: php

我正在尝试编写日志记录功能,到目前为止它的工作原理。我现在面临的唯一问题是我只能成功执行一次该功能。当我再次称它为PHP PHP Fatal error: Cannot redeclare function时。

现在我想问:

  1. 为什么PHP会抱怨我的工作流程?据我所知,我编写了函数占位符3,我可以使用不同的参数一次又一次地使用这个函数。 E. g。第一:

    $addNewCar->log(array('makeModelDescription','firstRegistration','mileage','logMessage', 'createTime'),
    array($carDetails[0]['FK_makeModelDescription'],
          $carDetails[0]['FK_firstRegistration'],
          $carDetails[0]['FK_mileage'],
          'deleteCarbyID: ' . $addNewCar->affected_rows,
          time()
    )
    

    ); 然后e。 G。

    $addNewCar->log(array('makeModelDescription','firstRegistration','mileage','logMessage', 'createTime'),
    array($carDetails[0]['FK_makeModelDescription'],
          $carDetails[0]['FK_firstRegistration'],
          $carDetails[0]['FK_mileage'],
          'insertCarById: ' . $addNewCar->affected_rows,
          time()
    ));
    
  2. 功能记录:

        public function log($key, $values) {
        try {
    
            /** @var $tableColumns Column names in MySQL table */
            $tableColumns = $key;
    
            /** @var $tableRows Use 2-dimensional numeric or associative arrays
             * for multiple records. Single records can be added with a
             * vector */
            $tableRows[] = $values;
    
            $DBH = $this->DBH;
    
            /**
             * @param        $text       Unnamed placeholder
             * @param int    $count      Number of unnamed placeholders (size of one array)
             * @param string $separator  Separator
             *
             * @return string            Concatenated unnamed placeholders, e. g. ?, ?, ?
             */
            function placeholders3($text, $count=0, $separator=","){
                $result = array();
                if($count > 0){
                    for($x=0; $x<$count; $x++){
                        $result[] = $text;
                    }
                }
                return implode($separator, $result);
            }
    
            /**
             * Generate unnamed placeholders for SQL statement,
             * e. g. (?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?).
             *
             * Pitfalls:
             *
             * - Nested array:  Take care that you iterate over the items
             *                  of the nested array. E. g. $tableRows[0]
             *                  instead of $tableRows;
             *
             * - sizeof($d):    Number of elements per single array
             *                  (for a single db insert).
             */
            $insert_values = array();
            foreach($tableRows as $d){
                $question_marks[] = '('  . placeholders3('?', sizeof($d)) . ')';
                $insert_values = array_merge($insert_values, array_values($d));
            }
    
            $sql = "INSERT INTO logging (" . implode(",", $tableColumns ) . ") VALUES " . implode(',', $question_marks);
    
            $STH = $DBH->prepare($sql);
            $STH->execute($insert_values);
            $this->affected_rows = $STH->rowCount();
        }
        catch(PDOException $e) {
            error_log("PDO error: " . $e->getMessage());
        }
    }
    
    1. 我应该如何更改设计以使其正常工作?
    2. 非常感谢提前!

2 个答案:

答案 0 :(得分:3)

在全局范围内声明函数。每次调用log()方法时,都会在全局范围内重新声明该函数。有一个简单的解决方案:

if (!function_exists('placeholders3')) {
    function placeholders3($text, $count=0, $separator=","){
    // ...
    }
}

但是你仍然在宣布一个全局功能,你可能不想做。由于您无论如何都在使用对象,因此正确的方法是:

class myclass {

       protected function placeholders3($text, $count=0, $separator=","){
           //...
       }

       public function log($key, $values) {
          // ...
          $question_marks[] = '('  . $this->placeholders3('?', sizeof($d)) . ')';
          // ...
       }
}

如果由于某种原因你不想创建类方法而你使用的是相对较新版本的PHP,你也可以使用lambda函数:

public function log($key, $values) {
    $placeholders3 = function($text, $count=0, $separator=","){
        // ...
    };
    // ...
    $question_marks[] = '('  . $placeholders3('?', sizeof($d)) . ')';
    // ...
}

答案 1 :(得分:0)

还有伙计们,请检查您的函数名称是否是PHP中的关键字,例如&#39; reset&#39; - 在这种情况下,它还会显示&#34;无法重新声明功能 &#34;错误