Подтвердить что ты не робот

Что такое перегрузка PHP-функций?

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

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

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

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

4b9b3361

Ответ 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');