PHP 函数重载有啥用?
Posted
技术标签:
【中文标题】PHP 函数重载有啥用?【英文标题】:What is PHP function overloading for?PHP 函数重载有什么用? 【发布时间】:2010-12-03 11:51:52 【问题描述】:在像 Java 这样的语言中,可以这样使用重载:
void test($foo, $bar)
int test($foo)
然后,如果您使用 2 个参数(例如 test($x, $y);
)调用 test()
,则将调用第一个函数。如果您只传递了 1 个参数,例如 test($x);
,则将调用第二个函数。
从手册看来,php 5 确实有重载,但它是做什么用的?我似乎无法理解有关此主题的手册..
【问题讨论】:
另见Why PHP doesn't support function overloading?。 您可以在此链接中使用可重载类:***.com/questions/4697705/php-function-overloading/… 【参考方案1】:PHP's meaning of overloading 与 Java 不同。在 PHP 中,重载意味着您可以在运行时添加对象成员,方法是实现 some of the __magic
methods,如 __get
、__set
、__call
、__callStatic
。您加载具有新成员的对象。
PHP 中的重载提供了以下方法: 动态“创建”属性和 方法。这些动态实体是 可以通过魔术方法处理 建立一个班级为各种 动作类型。
一个例子:
class Foo
public function __call($method, $args)
echo "Called method $method";
$foo = new Foo;
$foo->bar(); // Called method bar
$foo->baz(); // Called method baz
顺便说一句,PHP 从 PHP 4.3.0 开始就支持这种重载。唯一的区别是,在 PHP 5 之前的版本中,您必须使用 overload()
函数显式激活重载。
【讨论】:
你给出的例子的那种类型的重载有什么可能的优势???__call()
被证明非常有用的一个场景是我构建了一个货币转换器类。而不是调用$converter->convert(2, 'EUR', 'USD');
,您实际上可以调用$converter->convertEurToUsd(2);
,在我看来这更具可读性。你可以看看我的消息来源:github.com/igstan/php-utils/blob/master/tests/…github.com/igstan/php-utils/blob/master/src/…
我将这种方法用于我的数据库的类似 LINQ 的动态接口。所以我可以做类似 $db->Select('table')->col_1[$value]->col_2[$value]->Merge('col_1');所以所有的__calls()。传递给正确的处理类(即 SQL、File、Xml)。
许多 PHP ORM 库使用 __get 和 __set 方法来完成 null 所讨论的事情。
谢谢!非常感谢。我主要使用 PEAR/Zend Framework 编码约定。我保持不超过 79 个字符的行,尽可能短的方法,并在列中排列变量声明。不管怎样,GitHub 的语法高亮也有它的优点:)【参考方案2】:
如果你想像 Java 一样重载一个函数,不要指定任何参数,而是使用 func_num_args
和 func_get_args
函数来获取传递给该函数的参数数量或参数本身:
function test()
$args = func_get_args();
switch (count($args))
case 1:
// one argument passed
break;
case 2:
// two arguments passed
break;
default:
// illegal numer of arguments
break;
【讨论】:
【参考方案3】:要重载函数,只需默认传递参数为 null,
class ParentClass
function mymethod($arg1 = null, $arg2 = null, $arg3 = null)
if( $arg1 == null && $arg2 == null && $arg3 == null )
return 'function has got zero parameters <br />';
else
$str = '';
if( $arg1 != null )
$str .= "arg1 = ".$arg1." <br />";
if( $arg2 != null )
$str .= "arg2 = ".$arg2." <br />";
if( $arg3 != null )
$str .= "arg3 = ".$arg3." <br />";
return $str;
// and call it in order given below ...
$obj = new ParentClass;
echo '<br />$obj->mymethod()<br />';
echo $obj->mymethod();
echo '<br />$obj->mymethod(null,"test") <br />';
echo $obj->mymethod(null,'test');
echo '<br /> $obj->mymethod("test","test","test")<br />';
echo $obj->mymethod('test','test','test');
【讨论】:
以上是关于PHP 函数重载有啥用?的主要内容,如果未能解决你的问题,请参考以下文章