Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php抽象方法中的动态参数_Php_Inheritance_Abstract - Fatal编程技术网

php抽象方法中的动态参数

php抽象方法中的动态参数,php,inheritance,abstract,Php,Inheritance,Abstract,如果我有课 abstract class Parent { abstract function foo(); } class Child extends Parent { function foo($param) { //stuff } } 我得到一个错误,因为抽象声明没有任何参数,但它的子实现有。我正在创建一个带有抽象函数的适配器父类,在实现时,该类可以根据子类的上下文具有可变数量的参数。有没有什么结构化的方法可以克服这个问题,或者我必须使用func

如果我有课

abstract class Parent {
    abstract function foo();
}

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

我得到一个错误,因为抽象声明没有任何参数,但它的子实现有。我正在创建一个带有抽象函数的适配器父类,在实现时,该类可以根据子类的上下文具有可变数量的参数。有没有什么结构化的方法可以克服这个问题,或者我必须使用func_get_args吗?

如果你想在函数中使用变量参数,你必须使用func_get_args。请注意,func_get_args获取传递给PHP函数的所有参数

但是,您可以通过包含相应的参数来强制将最少数量的参数传递给函数

例如: 假设您有一个函数,您希望用至少一个参数调用该函数。然后写下以下内容:

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

现在您已经有了foo()的这个定义,您必须至少用一个参数调用它。您还可以选择传递数量可变的参数n,其中n>1,并通过func_get_args()接收这些参数。请记住,上面的$arg_列表还将包含$param的副本作为其第一个元素。

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
应该能够在
Animal
继承类的任何实例上执行
run
,但是由于
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
    }
}

如果你有不同于抽象类定义的协议的类,那么抽象类有什么意义呢?虽然你的答案在一方面有帮助,但在另一方面却令人困惑:你不能实例化一个抽象类(比如“动物”),因此你会在“$someAnimal=new Animal();”处得到一个致命错误。当然,你可以创建类和方法”“非抽象”但它不适合这里。@Zaphoid让我们看看鸡是怎么跑的:)