1

我正在尝试 OOP,但我对它很陌生,所以我为 joomla 2.5.x 创建了一个模块,在它的主 php 文件中,我创建了require_once一个具有如下类的文件:

require_once(JPATH_SITE.'/modules/'.$module_dir.'/libs/classes.php');

classes.php 包含以下内容:

class experiment
{
    function clean($input)
    {
        return filter_var($input, FILTER_SANITIZE_STRING);
    }
}

$my = new experiment;

然后在模块 php 文件中我像这样使用它:

$name = $my->clean($params->get('name'));

到此为止,一切正常。但这仅当模块在同一页面上仅出现一次时。如果我复制该模块并在同一页面上使用它两次,我会收到错误消息Undefined variable my。如果我将 更改require_oncerequire,我会收到错误消息Cannot redeclare class experiment。诡异的。

我也尝试过if (!class_exists(..,或者if(!isset($my)) { .. }但我知道它不会起作用。

我将不胜感激任何形式的帮助,干杯。

4

1 回答 1

1

当您包含一个文件时,该文件中定义的任何类都可以全局使用,但任何变量都与包含在同一范围内 - 在这种情况下,只是在您最初包含该文件的函数内。

结果,当您使用 时require_once(),您会看到第二次尝试包含它时,什么都没有发生 - 这是正常的,因为文件已经包含,但$my变量也没有定义 - 因为它出去了函数第一次结束时的作用域。

当你切换到 时require(),你会得到一个不同的错误,因为你正在重新定义类。


这里的解决方案是在定义类时设置全局变量。定义类 - 然后当您需要使用它时,创建该类的实例。不要依赖全局变量。

如果您尝试只创建一个类的实例(您真的需要这样做吗?),请考虑使用单例模式

于 2013-07-14T00:01:16.603 回答