扩展其他类的类是否继承了相同的构造函数?

时间:2011-03-13 17:44:16

标签: php oop

例如......

如果我有Module类:

class Module{

  var $page;

  function Module($page){
    $this->page = $page;
  }
}

然后是特定的新闻模块类:

class News extends Module {
  function aFunction(){
    return $this->page->id;
  }
}

我可以像这样实例化新闻:

$page = new Page();
$news = new News($page);

或者我必须这样做:

$page = new Page();
$news = new News();
$news->page = $page;

谢谢。

PS:我对OOP php很新,所以请耐心等我。我已经从程序php转到objective-c,现在又回到了客观的php。 :p很难将每个人进行比较。

4 个答案:

答案 0 :(得分:4)

是的,他们继承了构造函数。这是你可以轻松测试自己的东西。例如:

class Foo {
  function __construct() {
    echo "foo\n";
  }
}

class Bar extends Foo {
}

当你跑步时:

$bar = new Bar();  // echoes foo

但是,如果为类定义自定义构造函数,则不会调用Foo的构造函数。在这种情况下,请务必致电parent::__construct()

class Baz extends Foo {
  function __construct() {
    echo "baz ";
    parent::__construct();
  }
}

$baz = new Baz();  // echoes baz foo

所有这些对于旧式构造函数也是如此(类名__construct)。

答案 1 :(得分:1)

一种解决方案是为Newsfunction News($page) {...}指定一个构造函数,它将调用父构造函数,如下所示:parent::Module($page)。您正在尝试封装$page,并直接访问它会失败。

答案 2 :(得分:0)

我不熟悉PHP,但最后一段代码在我所知道的任何OOP语言中看起来都很奇怪。在OOP语言中,News的构造函数将隐式或显式地调用Module的构造函数。

答案 3 :(得分:0)

首先,您应该使用__construct()而不是类的名称作为构造函数,因为它更加模块化。

与任何其他OOP语言一样,子类的构造函数由其父类继承,因此您的第一个示例确实可以正常工作。

但要记住的一件事是,父级构造函数不会被父级隐式调用。因此,如果您在News中定义构造函数,则第一个示例将不再起作用,除非您自己拥有新闻构造函数句柄$page,或者调用parent::__construct($page);

另一个问题是,$page公开,违反了类提供的封装。 var关键字是PHP 4的残余,您应该将$page声明为私有。它应该只对Module类可见并由其处理。例如,为什么新闻需要aFunction