【问题标题】:class member function in function?函数中的类成员函数?
【发布时间】:2011-04-06 22:18:40
【问题描述】:

所以我有这个类,其中包含一些名为 class.php 的自定义函数 我有另一个名为 config.php 的文件,其中包括

require('engine.class.php');
$engine = new engine;

config.php 还需要 functions.php 像这样运行:

require('functions.php');

我在functions.php中有一个使用$engine的函数,例如:

function login($username, $password){
    return $engine->mysql_query('SELECT `user_id` WH...', 'array);//this is custom function in class.php
}

但是当我运行需要 config.php 的页面时,我收到一些错误,例如:

Fatal error: Call to a member function mysql_query() on a non-object in ../somedir/functions.php on line 3

【问题讨论】:

    标签: php class function object


    【解决方案1】:

    Global variables are indisputably evil。任何告诉您使用它们的人都没有处理使用它们的代码的范围经验。不幸的是,根据我的经验,使用全局变量的 PHP 编码人员比任何其他语言都多,这主要是由于无知。

    实际上每个类都应该是自洽的,这意味着无论您通过 new 将其具体化为对象多少次都无关紧要。唯一的例外是单例模式,但在现实世界中需要单例的实例非常罕见,几乎每次使用这些都是一个未调用的设计缺陷,它只是紧密耦合代码,这也是一个 @ 987654322@.


    PHP 缓存数据库连接,因此您可以在同一个程序中拥有无限的 mysql_connect(),并且每次加载页面时它只会连接一次(除非您手动关闭它)。因此,立即从 config.php 中删除 $engine 并将所有代码重写为:

    function login($username, $password)
    {
        $engine = new Engine;
        //this is custom function in class.php
        return $engine->mysql_query('SELECT `user_id` WH...', 'array);
    }
    

    如果你需要的话,我会很高兴elucidate 更多。

    【讨论】:

    • 谢谢,我想这样更好!
    【解决方案2】:

    您需要参考Variables scope。因为你不能访问 $engine 如果它不是全局的或在函数内部定义/声明它(想到singleton design pattern)。

    编辑

    您也可以将它作为参数传递给函数(之前忘记提及这一点)。

    【讨论】:

    • 或者传递给函数。
    • 在 12 年的 PHP 编程中,我从未遇到过对全局变量的需求,尽管我刚开始时大量使用它们。只是......不要......这样做!
    • 我从不建议使用globals,只是说这是一种可用的方法。用户可以阅读globals,如果他愿意并决定他是否想使用它们,他的选择,即使它们不是最好的方法。我的偏好是单例方法或参数,具体取决于使用/需要。
    猜你喜欢
    • 1970-01-01
    • 2020-12-04
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    相关资源
    最近更新 更多