class parents{
public $a;
function __construct(){
echo $this->a;
}
}
class child extends parents{
function __construct(){
$this->a = 1;
parent::__construct();
}
}
$new = new child();//print 1
以上代码打印1,这意味着每当我们创建子类的实例,并为从其父类继承的属性赋值时,其父类中的属性也已被赋值。但下面的代码显示不同: / p>
class parents{
public $a;
function test(){
$child = new child();
echo $this->a;
}
}
class child extends parents{
function __construct(){
$this->a = 1;
}
}
$new = new parents();
$new->test();//print nothing
在哪里我为其子类赋值,而父级显然没有为子类赋值,为什么?
谢谢!
答案 0 :(得分:0)
这是因为在第一个例子中你实例化了孩子
$new = new child();//print 1
并在第二个实例化父母
$new = new parents();
第二个使用$ new = new child();
与第一个相同如果你想通过实例化child()来访问$ a,你需要这样做:
class parents{
public $a;
function test(){
$child = new child(); //CHANGE HERE
echo $child->a;
}
}
class child extends parents{
function __construct(){
$this->a = 1;
}
}
$new = new parents();
$new->test();
答案 1 :(得分:0)
当您实例化parent
时,创建的child
实例会将parent
类扩展为test()
函数。但是,这不会改变$a
的价值。
答案 2 :(得分:0)
这种情况发生了,因为你有两个不同的实例,它们没有任何共同之处(除了继承......) 您可以使用内部类生成您的行为 - php不支持。
如果你想在每个实例上共享一个var accros,你必须使它成为静态
class parents{
public static $a;
function test(){
$child = new child();
echo self::$a;
}
}
class child extends parents{
function __construct(){
self::$a = 1;
}
}
$new = new parents();
$new->test();
这可能不是你想要的。或者你准确地说,你想要改变你的var
class parents{
public $a;
function test(){
$child = new child();
echo $child->a;
}
}
class child extends parents{
function __construct(){
$this->a = 1;
}
}
$new = new parents();
$new->test();
答案 3 :(得分:0)
在上面的示例中,由于构造函数是从子类调用的,因此它将正在使用的对象视为只是在父类中使用函数的子对象,就好像它是它自己的一样。
在底部示例中,您有两个独立的对象。父对象有$ a,孩子也是如此,但它们不是相同的$ a,因为它们包含在单独的对象中。因此,当您在父类中打印$ this-> a时,它指的是父类的$ a实例,而如果您在子类中设置$ this-> a = 1后回显$ a,它将显示该子类的$ a的实例。
希望这能为你清除一些东西。
答案 4 :(得分:0)
您正在混合对象组合和类继承。
继承(通过extends关键字实现)定义了is a
关系。
组合定义has a
关系。
为了说明这个概念,我们将从继承开始。
class Person {
public $name;
public function talk(){};
public function poop(){};
}
class Parent extends Person {
public function __construct($name) {
$this->name = $name;
}
}
class Child extends Person {
public function __construct($name){
$this->name = $name;
}
}
在这个例子中,我们定义了一个名为People的class
个东西。根据该定义,我们得出了人,父和子两种不同的子类型。当我们对一个类进行子类型化时,子类型获得它自己的所有属性的副本,并且可以访问基类型中定义的所有方法,因此在没有定义它的情况下,Child和Parent有一个名称,并且可以通过美德进行交谈和大便也是一个人。
例如:
$parent = new Parent("Homer");
$child = new Child("Bart");
$parent->talk();
$child->poop();
当您想要实现具有关系的船时,使用组合。让我们修改Parent的类型定义。
class Parent extends Person {
public $children = array();
public function __construct($name) {
$this->name = $name;
}
public function addChild(Child $child){
$this->children[] = $child;
}
}
我们现在允许父母为have a
孩子。
$parent = new Parent("Homer");
$child = new Child("Bart");
$parent->addChild($child);
// now I can access homers first child
echo $parent->children[0]->name;