如何从子类访问父类


How to access parent class from child class?

我正在尝试自动化表单验证和数据库插入过程。在一个特定的部分,我需要能够从子类访问父类。确切地说,我需要访问父类才能访问另一个子类。

我试图复制我在实际代码中使用的相同结构:

class Family {
    public function __construct($members = []) {
        foreach ($members as $member) {
            $this->$member[0] = new Member($member);
        }
    }
}
class Member {
    public $name;
    public $niisan;
    public function __construct($name = []) {
        $this->name = $name[0];
        if (count($name) > 1) {
            $this->get_niisan($name[1]);
        }
    }
    public function get_niisan($member_lookup) {
        $this->niisan = $this->name . " has a niisan named X";
    }
}
$Winchesters = new Family([
    ["Dean"],
    ["Sam", "Dean"],
]);
输出:

object(Family)#1 (2) {
    ["Dean"]    => object(Member)#2 (2) {
        ["name"]    => "Dean"
        ["niisan"]  => NULL
    }
    ["Sam"]     => object(Member)#3 (2) {
        ["name"]    => "Sam"
        ["niisan"]  => "Sam has a niisan named X"
    }
}

我想做的是在主类中创建两个子类。创建子类的顺序很重要。["Sam"]依赖于["Dean"],所以需要先创建["Dean"]["Dean"]的一些性质将在["Sam"]中使用。

在JavaScript中,我会这样写:

function Family(members) {
    var parent = this; // Family object
    for (var i = 0; i < members.length; i++) {
        // passing a reference of Family to the new Member object
        // so that it can access the main object later
        this[members[i][0]] = new Member(parent, members[i]);
    }
}
function Member(parent, name) {
    // saving the reference to the parent object
    this.parent = parent;
    this.name = name[0];
    this.niisan = "";
    this.get_niisan = function (lookup) {
        // accessing the parent object and then getting the name property of "Dean" object
        this.niisan = this.name + " has a niisan named " + this.parent[lookup].name;
    };
    if (name.length > 1) {
        this.get_niisan(name[1]);
    }
}
var Winchesters = new Family([
    ["Dean"],
    ["Sam", "Dean"]
]);

将主对象传递给每个子对象。PHP必须有自己的方法来处理这个问题。我只是不知道。


更新:对于失败/接近的选民:这怎么不清楚?

我有两个类:Family和Member。成员类在Family类内部初始化。代码

$Winchesters = new Family([
    ["Dean"],
    ["Sam", "Dean"],
]);

结果:

object(Family)#1 (2) {
    ["Dean"]    => object(Member)#2 (2) {
        ["name"]    => "Dean"
        ["niisan"]  => NULL
    }
    ["Sam"]     => object(Member)#3 (2) {
        ["name"]    => "Sam"
        ["niisan"]  => "Sam has a niisan named X"
    }
}

在运行时,首先创建一个名为"Dean"的Member,并将其赋值给Family中的变量Dean。其次,创建了Member"Sam",但Sam依赖于第一个创建的对象DeanSam需要访问父类Family,然后访问Dean,获得属性name,并在分配niisan变量时使用它。

请查看JavaScript示例。我想在PHP中模拟完全相同的功能。将主类传递给子类,以便子类可以访问稍后在主类中创建的变量。

在一个特定的部分,我需要能够访问父类从子类。确切地说,我需要访问父类访问另一个子类。

你不能从父类访问另一个子类。只有子节点可以访问父节点。在您的示例中,您没有创建任何类型的继承。这是在PHP中创建继承的方法。

class FooParent {
    public function display($text) {
        echo $text;
    }
}
class Foo extends FooParent {
    public function someMethod() {
        // ask the parent to display the text
        parent::display("Hello World!");
    }
}
$foo = new Foo();
$foo->someMethod();

显示"Hello World!"希望这将帮助您开始学习PHP版本的OOP - http://php.net/manual/en/language.oop5.php

你的术语很混乱。在PHP OOP中,父类子类通常指的是相互继承的类之间的关系,而不是这些类的对象(c++称它们为基类派生类, Javascript使用父类的原型链)。

你需要做的是在Member类中存储对Family的引用。

class Member {
    public $name;
    public $niisan;
    public $family;
    public function __construct($name = [], $family) {
        $this->family = $family;
        $this->name = $name[0];
        if (count($name) > 1) {
            $this->get_niisan($name[1]);
        }
    }
    public function get_niisan($member_lookup) {
        $this->niisan = $this->name . " has a niisan named X";
    }
}
class Family {
    public function __construct($members = []) {
        foreach ($members as $member) {
            $this->$member[0] = new Member($member, $this);
        }
    }
}

然后,如果Member类想要访问兄弟姐妹,它可以使用$this->family来获取包含的家族。

顺便说一句,在Family中使用变量命名属性是糟糕的设计,恕我直言。相反,您应该使用包含关联数组的单个$member属性:

$this->members = array();
foreach ($members as $member) {
    $this->members[$member[0]] = new Member($member, $this);
}