tip*_*ipu 8 php inheritance abstract
如果我上课,
abstract class Parent {
abstract function foo();
}
class Child extends Parent {
function foo($param) {
//stuff
}
}
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,因为抽象声明没有任何参数,但孩子的实现确实如此.我正在使用抽象函数创建一个适配器父类,这些抽象函数在实现时可能具有可变数量的参数,具体取决于子类的上下文.有没有任何结构化的方法可以解决这个问题,还是我必须使用func_get_args?
idm*_*adj 12
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
}
}
Run Code Online (Sandbox Code Playgroud)
......以及以下代码:
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
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想在函数中使用可变参数,则必须使用 func_get_args。请注意,func_get_args 获取传递给 PHP 函数的所有参数。
但是,您可以通过包含相应的参数来强制传递给函数的参数数量最少。
例如:假设您有一个函数,希望使用至少 1 个参数来调用。然后只需编写以下内容:
function foo($param) {
//stuff
$arg_list = func_get_args();
}
Run Code Online (Sandbox Code Playgroud)
现在您已经有了 foo() 的定义,您必须至少使用一个参数来调用它。您还可以选择传递可变数量的参数 n(其中 n > 1),并通过 func_get_args() 接收这些参数。请记住,上面的 $arg_list 还将包含 $param 的副本作为其第一个元素。
| 归档时间: |
|
| 查看次数: |
4910 次 |
| 最近记录: |