2013-11-09 183 views
0

我正在显示一个相对“重”的PHP页面。我有几个函数每个都使用连接到数据库来获取一些行。我注意到在每个函数中创建一个新的$ con可以减慢很多事情,所以很自然地我想为页面上的每个函数使用相同的$ con。我尝试这样做:

$con = mysqli_connect("localhost","root","root", "mydb"); 

function fA($a, $b, &$con = $con) 
{} 

function fB($a, &$con = $con) 
{} 

你可以看到我想要一个指针传递给$ CON为每个功能,但我得到一个syntax error, unexpected $con的每一个。 (我能通过$ CON每当我打电话给他们,但做这种方式,我没有回去,并改变每个函数调用的函数,它看起来整洁)

+2

PHP不能像那样工作。 '$ con'在您定义函数时没有定义。只需定义为'函数fA($ a,$ b,$ con)'和对象'$ con'将始终通过引用传递。 –

+0

换句话说,通过在函数原型中“预定义”一个变量,你无法避免在运行时传递一个参数。您可以使用常量值定义默认值,但不能使用动态(变量)值。 –

+0

好吧,如果我打电话给fA(10,12)他会自动获得$ con? – Juicy

回答

1

您可以使用:

global $con; 

在每个功能的身体开始像这样:

function fA($a, $b) { 
    global $con 
    // ...etc... 
} 

但是,这通常被视为一种不好的做法。

更好的方法是使用依赖注入,以便您的逻辑不会依赖于赋予它的存储设备的种类。沿着这些路线的东西:

class LogicExecutor { 
    private $con; 

    public __construct($con) { 
     $this->con = $con; 
    } 

    public function doTaskOne($a, $b) { 
     // you can use $this->con in this scope 
    } 
} 

$con = mysqli_connect('localhost', 'root', 'root', 'mydb'); 
$le = new LogicExecutor($con); 

$le->doTaskOne('a','b'); 

但即使这样,也对夫妇代码以mysqli非常紧密。你有没有考虑过ORM

0

使用全局$ con是好的,最好的解决方案是把东西放到一个类中。

如果你坚持你的原始概念,你应该在每个函数调用中传递$ con。

$con = mysqli_connect("localhost","root","root","mydb"); 
fA("abraca","dabra",$con); 
fB("hocus-pocus",$con); 

function fA($a, $b, &$con) 
{} 

function fB($a, &$con) 
{} 

也许最好使用$ con作为第一个参数。