Для чего нужна перегрузка функций PHP? - PullRequest
19 голосов
/ 03 октября 2009

В таких языках, как Java, перегрузка может использоваться следующим образом:

void test($foo, $bar){}
int test($foo){}

Тогда, если вы вызвали test() с двумя аргументами, например, test($x, $y);, будет вызвана первая функция. Если вы передали только 1 аргумент, например, test($x);, будет вызвана 2-я функция.

Из руководства кажется, что у php 5 есть перегрузка, но для чего она? Я не могу понять руководство по этой теме ..

Ответы [ 3 ]

26 голосов
/ 03 октября 2009

Значение перегрузки в 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().

15 голосов
/ 03 октября 2009

Если вы хотите перегрузить функцию, как в 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;
    }
}
0 голосов
/ 12 июня 2013

Чтобы перегрузить функцию, просто передайте параметр как ноль по умолчанию,

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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...