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 取代。
- 查看编码约定。方法名称应以小写字母开头,这样可以使习惯这些标准的每个人都更容易阅读代码。
我开始使用 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 取代。 - 查看编码约定。方法名称应以小写字母开头,这样可以使习惯这些标准的每个人都更容易阅读代码。