正如标题所述,我正在尝试在父类中创建一个方法。虽然,我想它可以是任何一个班级。例如:
class Parent
{
function foo ()
{
// do stuff
}
}
class Child extends Parent
{
function bar ()
{
// do stuff after foo() has ran
}
}
基本上,我希望foo()需要运行或者Child类不运行并返回错误或重定向到其他页面。我可以调用该函数,但我想知道在扩展父类时是否可以使它成为一个要求。
答案 0 :(得分:11)
如果您利用抽象类和方法,则可以强制子类实现缺少的方法。
abstract class ParentClass
{
public function foo ()
{
// do stuff
$this->bar();
}
abstract protected function bar();
}
class Child extends ParentClass
{
protected function bar()
{
// does stuff
}
}
未实现bar()
的子类将产生致命错误。
答案 1 :(得分:1)
您应该做的是覆盖Parent :: foo(),然后在重写方法中调用父方法,如下所示:
class Parent
{
function foo ()
{
// do stuff
}
}
class Child extends Parent
{
function foo ()
{
if(!parent::foo()) {
throw new Exception('Foo failed');
}
// do child class stuff
}
}
答案 2 :(得分:0)
为什么不在函数foo()中设置一个充当标志的布尔值。检查它是否已在子类/函数中设置,并且您已完成设置。
答案 3 :(得分:0)
我认为这可能是实现此类功能的唯一方式,因为我认为没有内置的解决方案。
class Parent
{
public $foo_accessed = FALSE;
function foo ()
{
$this->foo_accessed=TRUE;
// do stuff
}
}
class Child extends Parent
{
function bar ()
{
if($this->foo_accessed==TRUE) {
// do stuff after foo() has ran
} else {
// throw an error
}
}
}
答案 4 :(得分:0)
让孩子从构造中的父级调用函数。
class Child extends Parent
{
function bar ()
{
// do stuff after foo() has ran
}
function __construct(){
parent::foo();
}
}
答案 5 :(得分:0)
不要依赖其他方法。确保他们已经跑了。
class Parent
{
function foo()
{
// do stuff
}
}
class Child extends Parent
{
private function bar()
{
// do child class stuff
}
public function doFooBar()
{
parent::foo();
$this->bar();
}
}
答案 6 :(得分:0)
如前所述,听起来你希望foo()
是抽象的,迫使子类覆盖它。
PHP中包含抽象类的任何类都要求您的父类也是抽象的。这意味着它不能被实例化(构造),只能派生/子类。如果您尝试实例化抽象类,编译器将发出致命错误。
http://php.net/manual/en/language.oop5.abstract.php
请参阅Peter Bailey的答案中的代码。
答案 7 :(得分:0)
如果您实际上没有初始化父类中的任何代码,则应使用对象接口。必须实现接口方法,否则脚本会抛出胎儿错误。
可以找到有关它们的更多信息:http://us3.php.net/interface。
答案 8 :(得分:0)
以下方法只会在完成所有处理后抱怨 - 但是如果这对您来说是公平的,那么肯定会确保在父类中调用foo()
或以其他方式触发您可以采取行动的条件
class DemandingParent {
private $hasFooBeenCalled = false;
public function foo() {
$this->hasFooBeenCalled = true;
/* do Stuff */
}
public function __destruct() {
if (!$this->hasFooBeenCalled) {
throw new Exception("Naughty Child! Call your parent's foo b4 you speak up!");
}
}
}