Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.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类_Php_Class_Join_Merge - Fatal编程技术网

如何用更多类扩展php类

如何用更多类扩展php类,php,class,join,merge,Php,Class,Join,Merge,我想知道这是不是一种让你看到 class main_class extends main_class {...} 但php并不高兴( 所以我对自己说,让我们问问stackoverflow,我相信有人会知道一个解决方案。 尽管调试了几个小时,我还是用一点代码自行解决了问题 问题是class一些类不允许覆盖现有类,所以我需要做的是使用uuu get和uu调用,并在我的u构造函数中添加另外两行 下面是我的代码: class main_class { private $_MODS = arra

我想知道这是不是一种让你看到

class main_class extends main_class {...}
但php并不高兴(

所以我对自己说,让我们问问stackoverflow,我相信有人会知道一个解决方案。 尽管调试了几个小时,我还是用一点代码自行解决了问题

问题是
class一些类
不允许覆盖现有类,所以我需要做的是使用uuu get和uu调用,并在我的u构造函数中添加另外两行

下面是我的代码:

class main_class {
    private $_MODS = array(),...;
    public ...;
    public function __construct(...) {
        ...
        global $MODS_ENABLED;
        $this -> $_MODS = $MODS_ENABLED;
    }
    ...
    public function __get( $var ) {
        foreach ( $this->_MODS as $mod ) 
            if ( property_exists( $mod, $var ) )
                return $mod -> $var;
    }
    public function __call( $method, $args ) {
        foreach ( $this->_MODS as $mod )
            if ( method_exists( $mod, $method ) )
                return call_user_method_array( $method, $mod, $args );
    }
}
然后简单地运行它来扩展我的main_类,而不重写原始函数,这样我就可以运行我的新函数,但如果需要,我可以获得原始函数:

$MODS_ENABLED=array();
class mod_mail {...}
$MODS_ENABLED[]=new mod_mail;
现在让我们加载我们的类并从我们的mod运行一个函数:

$obj = new main_class(...);
$obj -> mail("root@localhost", "me@me.me", "Testing a mod.", "This email was sent via My main_class but this is a mod that extended main_class without renaming it.");
好吧,我的mod不用于发送电子邮件,而是将子域重定向到别名路径名,但是你理解这里显示的概念

编辑:在我解决了这个问题后,我看到一条评论,说可能存在重复的问题,所以我检查了它,发现其他人有一个非常类似的解决方案,但请不要将它标记为重复,因为他问到要添加到已构造的类中,我想在构造时重写函数。我的解决方案ion接收一个构造类数组并将它们“合并”到我的主类中,这个方法保留了原始函数,但我也可以使用另一个函数来调用原始函数,以绕过u调用函数

感谢所有发布答案的人。

在C#中,您可以通过定义
部分类来实现这一点。这基本上就像在不同的文件中编写更多相同的类。我不确定PHP是否支持这一点,但本文可能会有所帮助

自解:) 我自己已经解决了这个问题,我相信其他人会发现它很有用,所以这里是我的php代码

class main_class {
    private $_MODS = array(),...;
    public ...;
    public function __construct(...) {
        ...
        global $MODS_ENABLED;
        $this -> $_MODS = $MODS_ENABLED;
    }
    ...
    public function __get( $var ) {
        foreach ( $this->_MODS as $mod ) 
            if ( property_exists( $mod, $var ) )
                return $mod -> $var;
    }
    public function __call( $method, $args ) {
        foreach ( $this->_MODS as $mod )
            if ( method_exists( $mod, $method ) )
                return call_user_method_array( $method, $mod, $args );
    }
}
然后简单地运行:

$MODS_ENABLED=array();
class mod_mail {...}
$MODS_ENABLED[]=new mod_mail;
现在你所需要做的就是打电话给你的主课

$obj = new main_class(...);
$obj -> mail("root@localhost", "me@me.me", "Testing a mod.", "This email was sent via my main_class but this is a mod that extended main_class without renaming it.");
好吧,这不是我的用法,但我相信你明白了,我的类是CMS后端,我的mod是重定向一些子域到其他位置,比如mail.sitegen.com.au和phpmyadmin.sitegen.com.au,重定向到我的CMS外面的web gui。我也在为我的CMS制作更多的MOD


顺便说一句:我的扩展分为两类,mod和插件,mod在我的CMS(SiteGen)支持的每个站点上运行,插件对每个站点都有自己的设置,它们不是必需的。换句话说,mod由我选择,插件由站点所有者选择

我真正想要的是将两个或多个类合并为一个类,这只适用于一个类(我知道我可以修改它来工作,但让我们看看是否有人知道更好的方法。)提供了一个非常好的链接。谢谢你!我认为没有办法合并类。你应该使用扩展类来代替它。+1作为解决方案,虽然这并不完全是我想要的,但是如果我在回答我的问题之前充分阅读了它,它将节省我几个小时。我想要一个mods目录,它可能启用了mods,也可能没有启用mods。我不能真的扩展一个类,然后再扩展一个,并确保所有的修改都被更改。如果你能运行
class test extends test{…}
你还有其他方法吗?可能重复@Gordon,哼哼,正确但不正确,他们要求在动态类中添加东西,我要求合并,相似但不相同。合并将允许我重写函数,同时保留原始函数,好吧,它们发布的答案恰好与我的解决方案类似,但我的解决方案不需要我将类注册到原始函数中,而是我的解决方案从现有数组中接收所有函数,两者都是好方法,我将在“可能重复”。它们不一样,我将编辑我的问题以回答原因。