使用`$ this`的函数在基类PHP中不起作用

时间:2017-03-21 16:05:46

标签: php oop

我最近开始使用OO PHP,但我遇到了错误。

我有一个基类BaseController.php

以及扩展DatabaseController.php

的课程BaseController.php

目前这些类非常基本,但我想在Base中使用一些可重复使用的函数,总体而言这已成功。

但是,我试图在基本控制器中一起使用函数,似乎$this->functionName();的函数不会返回任何内容。

这是我的代码,以进一步解释:

基本控制器

public function connectDB() {
    $conn = mysqli_connect("localhost", "root", "", "db_name");
    return $conn;
}

public function getSource($id) {
    $conn = $this->connectDB();
    $sql = "SELECT * FROM sources WHERE id = '$id'";
    $query = mysqli_query($conn, $sql);
    while($row = mysqli_fetch_assoc($query)) {
        $name = $row['slug'];
    }
    return $name;
}

public function mapColumnsToFunctions($row) {
    foreach($row as $key => $value) {
        if($key == "source") {
            $result = $this->getSource($value);
            $row["source_slug"] = $result;
        }
        return $row;
    }
}

数据库控制器

class DatabaseController extends BaseController {
   public function getDataItem($type, $id) {
        $conn = $this->connectDB();
        $id = $this->checkField($id, "");
        $sql = "SELECT * FROM $type WHERE id = '$id'";
        $query = mysqli_query($conn, $sql);
        $response = array();
        while($row = mysqli_fetch_assoc($query)) {
            $response[$type][] = $this->mapColumnsToFunctions($row);        
        }
        $response = json_encode($response);
        return $response;   
    }
}

我应该看到source_slug作为字段的JSON响应,但这不会传到Feed中。

{
  "id": "213023",
  "name": "Source Name",
  "url": "http://sample.url",
  "source": "1"
  // NO source_slug: "english equiv of 1"
},

1 个答案:

答案 0 :(得分:0)

mapColumnsToFunctionsreturn循环中有一个foreach语句。因此,即使它没有在$row中更新任何内容,它也会在第一次迭代中立即返回。

return语句应该在循环之后。

public function mapColumnsToFunctions($row) {
    foreach($row as $key => $value) {
        if($key == "source") {
            $result = $this->getSource($value);
            $row["source_slug"] = $result;
        }
    }
    return $row;
}

循环似乎是不必要的(除非它是你正在做的事情的缩写)。它可以改写为:

public function mapColumnsToFunctions($row) {
    if (isset($row["source"])) {
        $row["slug_source"] = $this->getSource($row["source"]);
    }
    return $row;
}