好的,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
,它就像一个魅力。移动代码的原因是我想在单独的层中抽象出数据库通信。
我已尝试使用include
,include_once
,require
和require_once
但未成功。
答案 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
的地方访问。否则采取第二种方法。
正如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();
显然会有不同之处使它实际适用于您的情况,但这可以让您了解语法。这是一种更清晰的方式来组织代码,而不是加载大量的函数,并对名称和范围以及所有这些问题感到困惑。