Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php无法重新声明类/未定义变量Joomla模块_Php_Class_Oop_Joomla_Joomla Module - Fatal编程技术网

php无法重新声明类/未定义变量Joomla模块

php无法重新声明类/未定义变量Joomla模块,php,class,oop,joomla,joomla-module,Php,Class,Oop,Joomla,Joomla Module,我正在尝试OOP,我对它很陌生,所以, 我已经为joomla 2.5.x创建了一个模块,在它的主php文件中,我require\u once一个类如下的文件: require_once(JPATH_SITE.'/modules/'.$module_dir.'/libs/classes.php'); classes.php包含以下内容: class experiment { function clean($input) { return filter_var($i

我正在尝试OOP,我对它很陌生,所以, 我已经为joomla 2.5.x创建了一个模块,在它的主php文件中,我
require\u 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'));
在这一点之前,一切都是正常的。但是,只有当模块在同一页面上只出现一次时,才会出现这种情况。如果复制模块并在同一页面上使用两次,则会得到错误
未定义变量my
。如果我将
require\u更改一次
require
,我会得到错误
无法重新声明课堂实验
。奇怪

我也尝试过
如果(!class_存在(..
如果(!isset($my)){..}
,但我知道这是行不通的


谢谢您的帮助,干杯。

当您包含一个文件时,该文件中定义的任何类都可以全局使用,但任何变量都与包含在同一范围内-在本例中,仅在您最初包含该文件的函数中

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

当您切换到
require()
时,会出现另一个错误,因为您正在重新定义类


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


如果您试图只创建类的一个实例(您真的需要这样做吗?),改为使用。

包含文件时,该文件中定义的任何类都可以全局使用,但任何变量都与包含在同一范围内-在本例中,仅在最初包含文件的函数中

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

当您切换到
require()
时,会出现另一个错误,因为您正在重新定义类


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


如果您试图只创建类的一个实例(您真的需要这样做吗?),改用a。

哇!哈哈,我没有想到从classes.php内部获取
$my=new experiment;
并将其放入模块文件中。多亏了你的帮助,我才完成了这项工作,它的工作非常出色,这让我发笑!谢谢你,我真的很感激:)就这么简单。好吧,我用它做实验有两个原因。1,这样我就更确信函数名不会在所有的Joomla中再次找到,2,当然要慢慢地学习OOP…谢谢你,伙计,我也会尝试学习单例模式!@Duduvakis只是不要对单例走得太远。它倾向于被过度使用——通常没有真正的理由将一个类限制为一个实例。我希望OOP能让我大开眼界的那一天很快到来,因为我仍然处在一个大多数时候我都不明白我看到了什么并且让我想起了我第一次看到php代码的时刻:)哇!哈哈,我没想到要做
$my=新实验并将其放入模块文件中。多亏了你的帮助,我才做到了这一点,这让我笑了,因为它工作得非常出色!谢天谢地,我真的很感激:)就是这么简单。嗯,我用这个做实验有两个原因。1,这样我就更确信函数名不会在所有Joomla中再次找到,2,当然要慢慢地学习OOP…谢谢你,伙计,我也会尝试学习singleton模式@杜杜瓦基斯只是对辛格尔顿不太过分。它往往被过度使用——而且通常没有真正的理由将一个类限制为一个实例。我希望我的眼睛将随着OOP睁得大大的那一天很快到来,因为我仍然处在一个我大多数时候都不明白我看到了什么,并且让我想起了我第一次看到php代码的时候:)