例如......
如果我有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很难将每个人进行比较。答案 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)
一种解决方案是为News
,function 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
?