【问题标题】:Accessing another class' method from within a standalone function [closed]从独立函数中访问另一个类的方法[关闭]
【发布时间】:2012-12-05 14:43:02
【问题描述】:

我正在将我的网站转换为 PDO,经过大约 200 个脚本后,我非常接近尾声。每个脚本都访问相同的函数脚本。在函数脚本中,我有一个如下所示的数据库类:

class Database {
    private $db_con = ''; //stores the connection

    public function db_login(){
        //log into the database
    }
    public function db_control($query, $params){
        //run the query
    }
}
//initiate the class and log in
$db = new Database();
$db->db_login();

这两个函数都可以正常工作并且适用于每种类型的查询,因此我几乎完成了。但是,我遇到了一个问题。

我正在处理的脚本上有一个独立函数,该函数在脚本中多次使用。我通常运行 db_control:

$results = $db->db_control($query, $params);

但是从函数中运行它:

function func(){
    $results = $db->db_control($query, $params);
}

返回错误。

致命错误:在非对象上调用成员函数 db_​​control() C:....php 在第 39 行

我做错了什么?删除此功能后,该类肯定会启动,因为脚本上的其他查询可以正常工作。如何从独立函数中访问 db_control()?

谢谢你,

【问题讨论】:

  • 方法一:将$db作为参数传入函数中;方法二:在函数内部使用global $db;。在许多情况下,方法一可能是“推荐”的,但您必须修改调用它的每个地方;方法二不那么“优雅”,但只需要修改一次(只要不重命名$db即可)。
  • 您所做的几乎不是 OOP。请参阅How Not To Kill Your Testability Using Statics 获取一些提示。
  • 是的,我知道。将整个站点转换为 OOP 目前不是首要任务,因为该站点尚未启动,而且我每周只能靠几个鲍勃过活。一旦站点投入运营并获得收入,该站点应完全转换为 OOP。现在,如果我可以通过使某些方面 OOP'ish 来帮助未来的我,那么就可以了!

标签: php class object methods


【解决方案1】:

$db在函数范围内不可用,你可以

$db 作为参数传递

function func($db, $query, $params){
    return $db->db_control($query, $params);
}
$results = func($db, $query, $params);

或者

function func($query, $params){
    global $db;
    return $db->db_control($query, $params);
}
$result = func($query, $params);

使用global 使其在函数中可用,可能还有其他解决方案!

【讨论】:

  • 谢谢!我以为是这样。今天早上我的大脑不能正常工作!啊哈。
【解决方案2】:

$db 在函数内调用时超出范围。您可以将$db 作为参数传递给函数

function func($db){

还有一个非常糟糕的global 方法:

function func(){
    global $db; // $db is now accessible

【讨论】:

    【解决方案3】:

    了解variable scope。变量$db没有在函数内部声明,所以它在函数内部不存在。你需要把它传入。

    【讨论】:

    • 感谢您在评论中留下的链接。非常有趣的阅读。该网站总有一天会像那样运作。
    【解决方案4】:

    哦,您已将 $db 作为全局启动:/

    你不想这样做的原因有很多,我不会在这里讨论这个,主要是因为我的时间有点短,我会等待纯粹主义者在下面发表评论。但快速解决方法是添加。

    global $db
    

    不是最理想的情况,但应该可以解决您的问题。

    【讨论】:

    • 抱歉一句话被截断了,在你的函数中添加全局声明。
    猜你喜欢
    • 1970-01-01
    • 2016-04-11
    • 2013-01-05
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多