PHP函数重载 来自C++背景;br> 如何重载PHP函数
一个函数定义(如果有参数),另一个函数定义(如果没有参数)?PHP函数重载 来自C++背景;br> 如何重载PHP函数,php,arguments,overloading,Php,Arguments,Overloading,一个函数定义(如果有参数),另一个函数定义(如果没有参数)? 在PHP中可能吗?或者我应该使用if-else检查是否有从$\u GET和POST传递的任何参数??并将它们关联起来?您不能重载PHP函数。函数签名仅基于它们的名称,不包括参数列表,因此不能有两个同名函数。类在PHP中与许多其他语言中不同。PHP使用相同的词,但它描述了不同的模式 但是,您可以声明一个接受可变数量参数的。您将使用和来传递参数,并正常使用它们 例如: function myFunc() { for ($i = 0
在PHP中可能吗?或者我应该使用if-else检查是否有从$\u GET和POST传递的任何参数??并将它们关联起来?您不能重载PHP函数。函数签名仅基于它们的名称,不包括参数列表,因此不能有两个同名函数。类在PHP中与许多其他语言中不同。PHP使用相同的词,但它描述了不同的模式 但是,您可以声明一个接受可变数量参数的。您将使用和来传递参数,并正常使用它们 例如:
function myFunc() {
for ($i = 0; $i < func_num_args(); $i++) {
printf("Argument %d: %s\n", $i, func_get_arg($i));
}
}
/*
Argument 0: a
Argument 1: 2
Argument 2: 3.5
*/
myFunc('a', 2, 3.5);
函数myFunc(){
对于($i=0;$i
PHP不支持传统的方法重载,但是您可以通过使用\u调用
魔术方法来实现所需的功能:
class MyClass {
public function __call($name, $args) {
switch ($name) {
case 'funcOne':
switch (count($args)) {
case 1:
return call_user_func_array(array($this, 'funcOneWithOneArg'), $args);
case 3:
return call_user_func_array(array($this, 'funcOneWithThreeArgs'), $args);
}
case 'anotherFunc':
switch (count($args)) {
case 0:
return $this->anotherFuncWithNoArgs();
case 5:
return call_user_func_array(array($this, 'anotherFuncWithMoreArgs'), $args);
}
}
}
protected function funcOneWithOneArg($a) {
}
protected function funcOneWithThreeArgs($a, $b, $c) {
}
protected function anotherFuncWithNoArgs() {
}
protected function anotherFuncWithMoreArgs($a, $b, $c, $d, $e) {
}
}
对某些人来说,这可能有点骇人听闻,但我是从Cakephp如何执行某些函数中了解到这一点的,并对其进行了调整,因为我喜欢它所带来的灵活性 想法是你有不同类型的参数,数组,对象等等,然后你检测你被传递了什么,然后从那里开始
function($arg1, $lastname) {
if(is_array($arg1)){
$lastname = $arg1['lastname'];
$firstname = $arg1['firstname'];
} else {
$firstname = $arg1;
}
...
}
那么这个呢:
function($arg = NULL) {
if ($arg != NULL) {
etc.
etc.
}
}
要重载函数,只需在默认情况下将参数传递为null
<?php
class abs
{
public function volume($arg1=null, $arg2=null, $arg3=null)
{
if($arg1 == null && $arg2 == null && $arg3 == null)
{
echo "function has no arguments. <br>";
}
else if($arg1 != null && $arg2 != null && $arg3 != null)
{
$volume=$arg1*$arg2*$arg3;
echo "volume of a cuboid ".$volume ."<br>";
}
else if($arg1 != null && $arg2 != null)
{
$area=$arg1*$arg2;
echo "area of square = " .$area ."<br>";
}
else if($arg1 != null)
{
$volume=$arg1*$arg1*$arg1;
echo "volume of a cube = ".$volume ."<br>";
}
}
}
$obj=new abs();
echo "For no arguments. <br>";
$obj->volume();
echo "For one arguments. <br>";
$obj->volume(3);
echo "For two arguments. <br>";
$obj->volume(3,4);
echo "For three arguments. <br>";
$obj->volume(3,4,5);
?>
class父类
{
函数mymethod($arg1=null,$arg2=null,$arg3=null)
{
如果($arg1==null&&$arg2==null&&$arg3==null){
return“函数有零个参数
”;
}
其他的
{
$str='';
如果($arg1!=null)
$str.=“arg1=”.$arg1.“
”;
如果($arg2!=null)
$str.=“arg2=”.$arg2.“
”;
如果($arg3!=null)
$str.=“arg3=”.$arg3.“
”;
返回$str;
}
}
}
//并按下面给出的顺序调用它。。。
$obj=新父类;
echo“
$obj->mymethod()
”;
echo$obj->mymethod();
echo'
$obj->mymethod(null,“test”)
;
echo$obj->mymethod(null,'test');
echo'
$obj->mymethod(“测试”、“测试”、“测试”)
;
echo$obj->mymethod('test','test','test');
PHP目前不支持重载。希望它能像其他编程语言一样在其他版本中实现
签出这个库,这将允许您在闭包方面使用PHP重载。
遗憾的是,PHP中没有像C#中那样的重载。但我有一个小把戏。我用默认的空值声明参数,并在函数中检查它们。这样,我的函数可以根据参数做不同的事情。下面是一个简单的例子:
function example(...$args)
{
count($args); // Equivalent to func_num_args()
}
example(1, 2);
example(1, 2, 3, 4, 5, 6, 7);
在PHP5.6中,您可以使用…
作为最后一个参数,并删除func\u get\u args()
和func\u num\u args()
:
您也可以使用它来解压缩参数:
example(1, 2, 3);
相当于:
我以前从未见过\u call()
的这种用法。非常有创意(如果有点冗长)+1真正令人钦佩的_call()用法事实上,我不同意这一点,必须对这一建议进行重新训练。首先,使用_call()是一种反模式。其次,可以在PHP中为具有正确可见性的类方法执行重载。但是,您不能重载普通的jane函数。您能解释一下为什么您认为使用_call()是一种反模式吗?PHP方法重载不是OP想要的-他们希望能够有多个具有相同名称但不同输入/输出的方法签名:不需要使用uu call()。相反,声明一个具有所需名称的方法,不列出任何参数,并在该方法中使用func_get_args()将其分派到相应的私有实现。不,我不认为这有什么不妥,PHP对其许多内置函数都是这样做的。因为PHP是松散类型的,这正是必须处理这种情况的方式。这在php中是“必要的黑客行为”。您只能重载类方法,而不能重载函数。请参见,您可以创建一个函数,显式检查参数的数量,并根据预定义的参数集执行另一个函数。不管你最好重新设计你的解决方案,或者使用实现你的接口的类,PHP对重载的定义不同于典型的OOP语言。它们只是指允许基于X的属性和函数的动态路由的神奇方法。对于未来的读者:@Spechal所指的是一个与问题中所问的不同的单词重载的含义。(有关更多详细信息,请参阅已接受的答案。)自PHP 7以来有任何更改吗你能解释一下如何使用这个类吗?1-创建新类2-扩展重载。3-创建函数,如funcname_uu()=>no args或funcname_us($s)=>string arg这是一个非常酷的解决方案。为什么要执行$o=new$obj()?我还没有试过,不过我觉得应该是\$o=\$this?谢谢你的重要通知,我将使用反斜杠,但它可以使用反斜杠,也可以不使用我使用phpAZZY作为本地服务器。如果超级负载将有不同的名称和含义,则不太可读。也许我已经做了太多的C++开发,但是我建议在函数参数(如代码> MyFunc(/*.*/))<代码>中做提示。@ DUG65636,PHP 5.6 +将支持这一点,让我们松了一口气或者看看,在像php这样的松散类型语言中,它更接近C++的重载——尽可能接近。在PHP7中更合适,因为如果参数是相同类型的,您可以为参数提供类型提示
public function query($queryString, $class = null) //second arg. is optional
{
$query = $this->dbLink->prepare($queryString);
$query->execute();
//if there is second argument method does different thing
if (!is_null($class)) {
$query->setFetchMode(PDO::FETCH_CLASS, $class);
}
return $query->fetchAll();
}
//This loads rows in to array of class
$Result = $this->query($queryString, "SomeClass");
//This loads rows as standard arrays
$Result = $this->query($queryString);
function example(...$args)
{
count($args); // Equivalent to func_num_args()
}
example(1, 2);
example(1, 2, 3, 4, 5, 6, 7);
$args[] = 1;
$args[] = 2;
$args[] = 3;
example(...$args);
example(1, 2, 3);