代码之家  ›  专栏  ›  技术社区  ›  tazphoenix

函数中的类成员函数?

  •  2
  • tazphoenix  · 技术社区  · 16 年前

    所以我有一个类,它包含一些名为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
    }
    

    但是,当我运行reuires config.php的页面时,会出现如下错误:

    Fatal error: Call to a member function mysql_query() on a non-object in ../somedir/functions.php on line 3
    
    2 回复  |  直到 13 年前
        1
  •  2
  •   Theodore R. Smith    16 年前

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

    实际上,每一个类都应该是自我一致的,这意味着无论你用多少次新的方法将它证实为一个对象都不重要。唯一的例外是单例模式,但是现实中需要单例模式的实例是 如此稀有 几乎每一次使用这些代码都是一个不必要的设计缺陷,它将代码紧密地耦合在一起,这也是一个 very bad thing .


    php缓存db连接,所以在同一个程序中可以有一个不受限制的mysql_connect()s,并且每个页面加载时它只连接一次(除非手动关闭它)。因此,立即从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
  •  2
  •   Jim    16 年前

    您需要参考 Variables scope . 因为在没有全局或定义/声明$engine的情况下无法访问它( singleton design pattern 记住)在函数内部。

    编辑

    您也可以将它作为参数传递给函数(以前忘记提到过这个)。

    推荐文章