我正在尝试自动化表单验证和数据库插入过程。在一个特定的部分,我需要能够从子类访问父类。确切地说,我需要访问父类才能访问另一个子类。
我试图复制我在实际代码中使用的相同结构:
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
依赖于第一个创建的对象Dean
。Sam
需要访问父类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);
}