Что такое перегрузка PHP-функций?
В таких языках, как Java, перегрузка может быть использована следующим образом:
void test($foo, $bar){}
int test($foo){}
Затем, если вы вызвали test()
с двумя аргументами, например test($x, $y);
, вызывается первая функция. Если вы передали только один аргумент, например, test($x);
, вызывается вторая функция.
Из руководства кажется, что php 5 имеет перегрузку, но для чего это нужно? Кажется, я не понимаю руководства по этой теме.
Ответы
Ответ 1
Значение перегрузки в PHP отличается от Java. В PHP перегрузка означает, что вы можете добавлять члены объекта во время выполнения, реализуя некоторые из методов __magic
, например __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()
.
Ответ 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');