我正在尝试使用OOP,我对此非常陌生,所以,
我为joomla 2.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)) { .. }
,但我知道它不起作用。
我会感激任何帮助,欢呼。
答案 0 :(得分:1)
当您包含文件时,该文件中定义的任何类都可以全局使用,但是任何变量都与include包含在同一范围内 - 在这种情况下,就在您最初包含该文件的函数中。
因此,当您使用require_once()
时,您会看到第二次尝试包含它时,没有任何反应 - 这是正常的,因为文件已经包含在内,但是{{ 1}}变量也没有定义 - 因为它在第一次结束时超出了范围。
当您切换到$my
时,会出现其他错误,因为您正在重新定义该类。
这里的解决方案是在您定义类时不设置全局变量。定义类 - 然后在需要使用它时,创建该类的实例。不要依赖全局变量。
如果您只想创建一个类的实例(您真的需要这样做吗?),请考虑使用singleton pattern代替。