免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: a_coder
打印 上一主题 下一主题

请教一个关于参数传递的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-10-23 11:43 |只看该作者
不知道楼主为什么这么排斥数组,在php5中用__call实现重载难道不方便吗

论坛徽章:
0
12 [报告]
发表于 2007-10-23 11:48 |只看该作者
8楼的办法,有点复杂,一个比较简单的办法是把 myClass 不定义 PHP 默认的构造函数 __construct,定义一个自定义的具有构造函数相同作用的方法 init,然后在func中

$myClass = new myClass;
call_user_func_array( array(&$myClass, 'init'), array( $arg1, $arg2, $arg3, ... ));

这样问题可以解决,但是一个非常要命的地方是,如果在其他地方简单的使用 new 来实例化就不行了,必须紧跟一个init方法,这样用起来不是十分方便。


sunnyfun,你仔细看题目,都能明白我的本意不是 function a(),重点是在里面的 new myClass 上面。支持多个参数很容易,但是如果 myClass 的构造函数定义了具体的参数,比如 public function __construct( $arg1, $arg2 ),这种情况下需要让function a能够自动传递这两个参数给 myClass 的构造函数。

麻烦去看看重载。

论坛徽章:
0
13 [报告]
发表于 2007-10-23 11:49 |只看该作者
希望能找到更好的解决办法。

论坛徽章:
0
14 [报告]
发表于 2007-10-23 12:49 |只看该作者
原帖由 a_coder 于 2007-10-23 13:48 发表
8楼的办法,有点复杂,一个比较简单的办法是把 myClass 不定义 PHP 默认的构造函数 __construct,定义一个自定义的具有构造函数相同作用的方法 init,然后在func中

$myClass = new myClass;
call_user_func ...


constructor 如果有参数,则自己 call init。
如果没有参数,则什么都不做。

论坛徽章:
0
15 [报告]
发表于 2007-10-23 13:28 |只看该作者
楼上说得也对,但是如果即没有参数,但是init确实还需要执行呢。毕竟它起到了构造函数的作用。不能保证没有参数就不执行的。所以,construct里面不能加上参数数量的判断。但如果无论如何都自动执行initialize的话,那么在function a()中的new myClass就会引发一个运行错误。

很矛盾的一个问题。

论坛徽章:
0
16 [报告]
发表于 2007-10-23 13:29 |只看该作者
50分啊,50分啊,看谁能拿走

论坛徽章:
0
17 [报告]
发表于 2007-10-23 13:33 |只看该作者
但是如果即没有参数,但是init确实还需要执行呢。


我不懂你的意思。constructor 可以有默认参数,init 也可以。

constructor = 至少 2 种情况 (有参,无参)
constructor + init = 至少 4 种情况 (con 有参 init 有参,con 有参 init 无参,con 无参 init 有参,con 无参 init 无参)

加上对参数的检查,已经足以满足任何变态要求。

论坛徽章:
0
18 [报告]
发表于 2007-10-23 13:43 |只看该作者
看来有悬赏的帖子回答就是踊跃.我也凑凑热闹

LZ可以看看PHP实现  工厂模式  



这里是我的一段正在运行中的代码



class fu
{
.............



    function build($class_name,$param=null)
    {
        $f_path       =PATH_INCLUDE.$class_name.EXT;
        if($this->_is_exist(PATH_INCLUDE,$class_name.EXT))
        {
            if(!@is_object($this->$class_name))
            {
                require($f_path);
                $str = '$this->$class_name =new $class_name(';
                if (is_array($param)) {
                    foreach ($param as $key)
                    {
                        if (!empty($key)) {
                            $str .= '\''.$key.'\',';
                        }

                    }
                    $str = substr($str, 0, -1);
                }
                $str .= ');';
                eval($str);
                $this->obj[$class_name]  =&$this->$class_name;
                $this->$class_name->fu    = &$this;
                if (method_exists($this->$class_name,'init')) {
                    $this->$class_name->init();
                }
            }
            return $this->$class_name;
        }
        else
        {
            $this->fatal_error('file:'.$f_path.' not found!<BR>');

        }
    }

论坛徽章:
0
19 [报告]
发表于 2007-10-23 13:46 |只看该作者
晕。楼上的,用 eval 来写的?效率如何啊。这个我也曾考虑到,但是没敢用。

论坛徽章:
0
20 [报告]
发表于 2007-10-23 13:49 |只看该作者
我觉得那是重载

楼猪   给个你的定义?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP