我还在尝试OOP,我对它很陌生,所以,我已经为joomla2.5.x创建了一个模块,在它的主php文件I 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_once
更改为require
,则会得到错误Cannot redeclare class experiment
。奇怪的
我也试过if (!class_exists(..
或if(!isset($my)) { .. }
,但我知道它不会起作用。
我将感谢任何帮助,干杯。
当您包含一个文件时,该文件中定义的任何类都是全局可用的,但任何变量都与include在同一范围内——在这种情况下,只是在您最初包含文件的函数内。
因此,当您使用require_once()
时,您会看到第二次尝试包含它时,什么都没有发生——这是正常的,因为文件已经包含在内,但$my
变量也没有定义——因为当函数第一次结束时,它超出了范围。
当您切换到require()
时,会得到不同的错误,因为您正在重新定义类。
这里的解决方案是在定义类时而不是设置全局变量。定义类,然后在需要使用它时,创建该类的实例。不要依赖全局变量。
如果您试图只创建类的一个实例(您真的需要这样做吗?),请考虑使用singleton模式。