PHP要求:无法在函数中访问变量

时间:2018-01-19 06:46:47

标签: php

好的,PHP不在我的主要堆栈中,而且还没有深入了解它,我只是想完成任务,所以我会直接进入代码:

<?php require_once('server_helper.php');  ?>
<?php

echo $table_balance; // "balance"

function get_balance($user_id) {
    try {
        $conn = establish_connection();
        echo $table_balance; // ""
        // some more code...
    } catch (Exception $e) {
        print_r($e);
    }
}

说明:server_helper.php是一个级别,其中包含$table_balance = 'balance';。 函数外部的第一个echo $table_balance; - 按预期工作并打印"balance",而第二个函数 - 在函数内打印""

establish_connection()功能也来自server_helper.php,而且工作正常......

我将包含上述代码的文件包含在另一个文件中,该文件处理路径命中,获取ID并调用get_balance($some_id); get_balance()中的代码曾经在另一个文件中,我曾经常常包括server_helper.php,它就像一个魅力。移动代码的原因是我想在单独的层中抽象出数据库通信。

我已尝试使用includeinclude_oncerequirerequire_once但未成功。

P.S:我知道下划线是不鼓励的,但我不喜欢在不区分大小写的语言中使用camelCase。

3 个答案:

答案 0 :(得分:2)

因为它不是php中变量的工作方式。这是功能的背景。查看variable scope in php

有两种方法可以完成这项工作。

将其作为参数传递

让你的函数接受它作为参数

function get_balance($user_id, $table_balance) {
    try {
        $conn = establish_connection();
        echo $table_balance; // ""
        // some more code...
    } catch (Exception $e) {
        print_r($e);
    }
}

当您调用function时,将此变量作为第二个参数传递 例如

get_balance($some_id, $table_balance);

注意:$table_balance可以在您呼叫get_balance的地方访问。否则采取第二种方法。

OR

让它全球化。

正如Ed Heal在this answer中所说的

答案 1 :(得分:1)

请阅读global

你需要这样做:

function get_balance($user_id) {
    global $table_balance;
    try {
        $conn = establish_connection();
        echo $table_balance; // ""
        // some more code...
    } catch (Exception $e) {
        print_r($e);
    }
}

答案 2 :(得分:1)

虽然Ed Heal已经解决了快速解决问题的方法,但使用全局来处理可变范围问题就像使用胶带来修复问题一样。这很丑陋,最终会变得非常难以管理,因为你会突然处理全球范围内的所有事情。

如果可以的话,开始转向面向对象的编程,在这种编程中,您可以将变量组织成类,并让所有类方法都可以访问这些变量/属性:

class MyLedger
{
  private $conn;
  private $table_balance;

  public function __construct()
  {
    $this->conn = $this->EstablishConnection();
    $this->table_balance = "\$123.45";
  }

  private function EstablishConnection()
  {
    // Code to establish and return a connection here...
  }

  public function GetBalance($user_id)
  {
    return $this->table_balance;
  }
}

然后你会这样使用它:

$Ledger = new MyLedger();
echo $Ledger->GetBalance();

显然会有不同之处使它实际适用于您的情况,但这可以让您了解语法。这是一种更清晰的方式来组织代码,而不是加载大量的函数,并对名称和范围以及所有这些问题感到困惑。