php: class 内的变量作用域

php: variable scope within a class

我开始使用 classes 并且有一个可变范围的问题。我在一个函数中定义了一个变量 $query 并且需要在第二个函数中使用它。但是,第二个函数没有看到它。

我想我可以将 $query 传递到 class 之外,然后再传递它($instance->QueryExecute($query);)。但这看起来很乱,没有必要在 class.

之外存在 $query

解决这个问题的正确方法是什么?

谢谢, 路易斯.

<?php
class MyProduct {
    public function QueryBuild() {
        $query = "SELECT * FROM my_product";
    }
    public function QueryExecute() {
        $result = mysql_query($query);
        while ($record = mysql_fetch_assoc($result)) {
            foreach ($record AS $key => $value) {
                $this->product[$record["pro_id"]][$key] = $value;
            }
        }
    }
}
?>

您在 class 中定义了一个 属性,这表示我想补充一点 mysql_* 函数已被弃用。

<?php
class MyProduct {
    private $query;
    public function QueryBuild() {
        $this->query= "SELECT * FROM my_product";
    }
    public function QueryExecute() {
        $result = mysql_query($this->query);
        while ($record = mysql_fetch_assoc($result)) {
            foreach ($record AS $key => $value) {
                $this->product[$record["pro_id"]][$key] = $value;
            }
        }
    }
}
?>

有两个选项可以解决您的问题,第一个(在我看来)比另一个更好:

选项 1:Return 值

只需告诉您的构建方法 return 该值,然后在您的其他方法上使用它:

<?php
class MyProduct {
    public function QueryBuild() {
        $query = "SELECT * FROM my_product";
        return $query;
    }
    public function QueryExecute() {
        $result = mysql_query($this->QueryBuild());
        while ($record = mysql_fetch_assoc($result)) {
            foreach ($record AS $key => $value) {
                $this->product[$record["pro_id"]][$key] = $value;
            }
        }
    }
 }

选项 2:对象字段

您在 class 中定义了一个字段来保存查询。然而,这意味着必须先调用方法QueryBuild(),然后才能调用QueryExecute(),这不是特别合理。

<?php
class MyProduct {
    private $query;
    public function QueryBuild() {
        $this->query = "SELECT * FROM my_product";
    }
    public function QueryExecute() {
        $result = mysql_query($this->query);
        while ($record = mysql_fetch_assoc($result)) {
            foreach ($record AS $key => $value) {
                $this->product[$record["pro_id"]][$key] = $value;
            }
        }
    }
}

一些注意事项:

  • 不要使用 mysql_* 函数。它们已被弃用并已被 MySQLi 和 PDO 取代。
  • 查看编码约定。方法名称应以小写字母开头,这样可以使习惯这些标准的每个人都更容易阅读代码。