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