免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 9275 | 回复: 37
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-23 09:39 |只看该作者 |倒序浏览
50可用积分
如下有一个 function :
function a()
{
 new myClass(...);
}


在这个函数内部有一句实例化类的语句,我想实现的是,如果我这样 a( $a, $b ),那么里面的语句就相当于 new myClass( $a, $b ),如果我 a( $a, $b, $c )那么里面就是 new myClass( $a, $b, $c ),如果 a() 那么里面也 new myClass()。以此类推。

要一个比较好的解决办法,把参数做成一个数组这样感觉不舒服,代码会变得不易阅读。


结贴记:

无论是 eval 还是 create_function,执行上来讲,都不理想,完全面向对象的一个系统,实例化的类是很多的,每一个实例化都伴随着这么一个过程,似乎有点恐怖。

除了给每一个类增加一个创建单例用的static方法外,还没有找到很好的替代办法。

积分给写出 create_function 的那位同志,他的代码执行效率略高。

dz902在30楼提出的方式,实际上就是通过一个参数是否为一个特定值来判断是否有具体的参数被传入,虽然可以把值设定的很复杂,但是你仍然不能保证,传入的不会出现巧合。还是不太喜欢在基础框架上写上这样的代码。

谢谢大家参与讨论,结贴。

[ 本帖最后由 a_coder 于 2007-10-23 18:01 编辑 ]

最佳答案

查看完整内容

大汗,选为最佳后29楼的跳到2楼了,编辑一下,省得将来引起误会。[ 本帖最后由 sunnyfun 于 2007-10-23 20:56 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-10-23 09:39 |只看该作者
大汗,选为最佳后29楼的跳到2楼了,编辑一下,省得将来引起误会。
<?php

&nbsp;&nbsp;&nbsp;&nbsp;class Object {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $property;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function __construct( ) {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$numargs = func_num_args();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "In class: Number of arguments: $numargs<br />\n";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$arg_list = func_get_args();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for ($i = 0; $i < $numargs; $i++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($numargs>0){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->property = $arg_list[0];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->property = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}


function a()
{
&nbsp;&nbsp;&nbsp;&nbsp;$numargs = func_num_args();
&nbsp;&nbsp;&nbsp;&nbsp;echo "Number of arguments: $numargs<br />\n";

&nbsp;&nbsp;&nbsp;&nbsp;$arg_list = func_get_args();
&nbsp;&nbsp;&nbsp;&nbsp;for ($i = 0; $i < $numargs; $i++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;$arg =implode(",", $arg_list);
&nbsp;&nbsp;&nbsp;&nbsp;$myfunc ="return new Object($arg);";
&nbsp;&nbsp;&nbsp;&nbsp;$mynewfunc= create_function('', $myfunc);
&nbsp;&nbsp;&nbsp;&nbsp;$obj = $mynewfunc('');
&nbsp;&nbsp;&nbsp;&nbsp;echo $obj->property;
&nbsp;&nbsp;&nbsp;&nbsp;echo "<br /><br />\n";
}

a();
a(1, 2, 3);
a(1, 2, 3, 4);
?>


[ 本帖最后由 sunnyfun 于 2007-10-23 20:56 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-10-23 10:14 |只看该作者

  1. <?php
  2. function foo()
  3. {
  4.     $numargs = func_num_args();
  5.     echo "Number of arguments: $numargs<br />\n";
  6.     if ($numargs >= 2) {
  7.         echo "Second argument is: " . func_get_arg(1) . "<br />\n";
  8.     }
  9.     $arg_list = func_get_args();
  10.     for ($i = 0; $i < $numargs; $i++) {
  11.         echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
  12.     }
  13. }

  14. foo(1, 2, 3);
  15. ?>
复制代码


引用自手册

论坛徽章:
0
4 [报告]
发表于 2007-10-23 10:14 |只看该作者
两个方法:
1、数组。
2、做羊肉窜。

论坛徽章:
0
5 [报告]
发表于 2007-10-23 10:20 |只看该作者
2楼的等于没说,那些东西无法解决这个问题,请看清楚问题再说,手册我读的比你多。
3楼的说数组,这个办法是没有办法的笨办法,代码会变得很不易阅读。至于你说的羊肉串我不明白什么意思,是不是就是根据参数个数来判断?那可累死了。代码的自适应能力也非常的弱了。


另外加一句,使用eval来解决这个问题也不太好的。

[ 本帖最后由 a_coder 于 2007-10-23 10:22 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-10-23 10:41 |只看该作者
原帖由 a_coder 于 2007-10-23 10:20 发表
2楼的等于没说,那些东西无法解决这个问题,请看清楚问题再说,手册我读的比你多。

这么说话,谁敢给你出主意了啊

论坛徽章:
0
7 [报告]
发表于 2007-10-23 10:42 |只看该作者
原帖由 a_coder 于 2007-10-23 10:20 发表
2楼的等于没说,那些东西无法解决这个问题,请看清楚问题再说,手册我读的比你多。
3楼的说数组,这个办法是没有办法的笨办法,代码会变得很不易阅读。至于你说的羊肉串我不明白什么意思,是不是就是根据参数个 ...


搞毛,自己需求没写清楚还怪别人,这叫重载。

论坛徽章:
0
8 [报告]
发表于 2007-10-23 11:11 |只看该作者
重载?这叫重载?麻烦您解释一下重载吧。看来我以前的理解全部错误的

不看问题自以为是,那手册上的东西往这里砸,你不是浪费我的帖子么?你要回的前提是看清楚问题,对发贴人有一个最起码的尊重。否则请闭尊口。

[ 本帖最后由 a_coder 于 2007-10-23 11:13 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2007-10-23 11:22 |只看该作者
<?
$data = array('foo'=>'bar',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'baz'=>'boom',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'cow'=>'milk',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'php'=>'hypertext processor');
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
$me=http_build_query($data); // foo=bar&baz=boom&cow=milk&php=hypertext+processor

//这样,你得到了一个羊肉窜,就是$me。把它传到你想要传到的地方。





class h
{
var $t;
function __construct($me)
{
$this->h($me);
}
function h($me)
{
//要使用的时候,还原成数组或其它的。老兄好像不喜数组,那就转成独立变量吧。

$a=explode('&',$me);
foreach($a as $b)
{
$c=explode('=',$b);
$k=$c[0];
$$k=$c[1];
}
$this->t=$foo;//拿一个出来测试

}
}

function hello($me)
{
$m=new h($me);
echo $m->t;
}

hello($me);
?>

论坛徽章:
0
10 [报告]
发表于 2007-10-23 11:37 |只看该作者
我指的你那问题中
new myClass( $a, $b ), new myClass( $a, $b, $c ), new myClass()。以此类推。


想实现的是重载。

可是你的问题会让人产生“想让function a()支持多个参数”的歧义,楼主说话老是唧唧歪歪的干嘛。

[ 本帖最后由 sunnyfun 于 2007-10-23 11:40 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP