динамические параметры в абстрактных методах в php - PullRequest
8 голосов
/ 01 ноября 2011

Если у меня есть класс,

abstract class Parent {
    abstract function foo();
}

class Child extends Parent {
    function foo($param) {
        //stuff
    }
}

Я получаю сообщение об ошибке, потому что абстрактное объявление не имеет никаких параметров, но реализация его у дочернего объекта имеет. Я делаю родительский класс адаптера с абстрактными функциями, которые при реализации могут иметь переменное количество параметров в зависимости от контекста дочернего класса. Есть какой-то структурированный способ, которым я могу преодолеть это, или я должен использовать func_get_args?

Ответы [ 2 ]

12 голосов
/ 10 апреля 2014

PHP делает это для защиты полиморфизма.Любой объект унаследованного типа должен использоваться, как если бы он принадлежал родительскому типу.

Рассмотрим следующие классы:

abstract class Animal {
    abstract function run();
}

class Chicken extends Animal {
    function run() {
        // Clever code that makes a chicken run
    }
}

class Horse extends Animal {
    function run($speed) {
        // Clever code that makes a horse run at a specific speed
    }
}

... и следующий код:

function makeAnimalRun($animal) {
    $animal->run();
}

$someChicken = new Chicken();
$someHorse = new Horse();

makeAnimalRun($someChicken);  // Works fine
makeAnimalRun($someHorse);   // Will fail because Horse->run() requires a $speed 

makeAnimalRun должен иметь возможность выполнять run на любом экземпляре унаследованных классов Animal, но поскольку для реализации Horse run требуется параметр $speed, $animal->run() вызов makeAnimalRun не удался.

К счастью, это легко исправить.Вам просто нужно указать значение по умолчанию для параметра в переопределенном методе.

class Horse extends Animal {
    function run($speed = 5) {
        // Clever code that makes that horse run at a specific speed
    }
}
3 голосов
/ 01 ноября 2011

Вы должны использовать func_get_args, если вы хотите иметь переменные аргументы в вашей функции. Обратите внимание, что func_get_args получает все аргументы, переданные в функцию PHP.

Однако вы можете принудительно установить минимальное количество аргументов, передаваемых в функцию, включив в них соответствующие параметры.

Например: Скажем, у вас есть функция, которую вы хотите вызвать как минимум с одним аргументом. Затем просто напишите следующее:

function foo($param) {
    //stuff
    $arg_list = func_get_args();
}

Теперь, когда у вас есть это определение foo (), вы должны по крайней мере вызвать его с одним аргументом. Вы также можете передать переменное число аргументов n, где n> 1, и получать эти аргументы через func_get_args (). Имейте в виду, что вышеприведенный $ arg_list также будет содержать копию $ param в качестве первого элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...