Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 访问兄弟方法_Php_Oop - Fatal编程技术网

Php 访问兄弟方法

Php 访问兄弟方法,php,oop,Php,Oop,我整天都在寻找答案,但似乎找不到答案。对不起,如果我没什么道理的话,我会失去理智的 以下是我想做的: abstract class Parent { abstract public function Test(); } class Child1 extends Parent { abstract public function Test() { echo "Test!"; } } class Child2 extends Parent { publ

我整天都在寻找答案,但似乎找不到答案。对不起,如果我没什么道理的话,我会失去理智的

以下是我想做的:

abstract class Parent {
    abstract public function Test();
}
class Child1 extends Parent {
    abstract public function Test() {
        echo "Test!";
    }
}
class Child2 extends Parent {
    public function Test2() {
        echo "Test2!";
        $this->Test(); // Child1::Test();
    }
}

再说一次,如果我说的不太有道理,我很抱歉。如果你需要我解释的话,我会尽量多解释。

你不能。你想做的事在OOP中毫无意义。如果要从第一个子级执行
Test()
,则需要在父级中移动函数

编辑:好吧,我将更加全面:


您正在尝试调用另一个子类的函数,该子类只有父类共同点
Child1
Child2
String
Integer
在Java(或任何其他OOP语言)中最接近。假设您在int上调用了
.upper()
函数:这没有意义

它不是OOP模式,在我所知的任何OOP语言中都不可用(内省魔法除外): Child2对Child1课程一无所知(也不必知道)。它们可以独立定义


我认为在这一点上,你应该解释你的需求是什么。我想我们可以帮你设计一些图案

Child1中的
Test
重写函数不应是抽象的(正如您所定义的那样)。要从
Child2
Test2
函数调用
Child1
Test
函数,请使用:

Child1 foo = new Child1();
echo foo->Test();

您可以做的事情只是因为它被定义为公共的,而不是因为
Child1
Child2
有任何关系。

您缺少抽象类和方法的概念

抽象类 抽象类是定义一些基本行为的类,不能实例化。它们被设计成子类

抽象方法 这些是需要由扩展类实现的方法。与接口类似,抽象方法定义行为时没有实现

你的代码 在代码中,您使用抽象方法声明了一个抽象类

abstract class Parent {
    public abstract function Test();
}
当另一个类子类
Parent
时,它必须实现抽象方法使其具体化

class Child extends Parent {
    public function Test() {
        echo "Test!";
    }
}
访问兄弟方法
类或实例没有同级的概念。类无法知道谁是其父类的子类并以静态方式访问它。

这里有几个错误:

  • Parent
    是保留字
  • Child1
    包含抽象方法,因此不能包含正文
  • Child2
    扩展了
    Parent
    ,但没有实现
    Test()
    方法
因此,所有这些都不会实例化。Child2()可能应该扩展Child1(),(或者实现
Test()
方法本身)。纠正这些问题,修复PHP可能告诉您的任何其他错误,然后执行以下操作:

$p = new Child2();

$p->Test2();
我应该给你这个:

Test2!Test!

这个答案毫无意义;)嗯,除非你做出一些奇怪的假设,否则在我看来没有更好的答案了。他试图调用另一个类的函数,这是不可能的…你实际上还没有说你想做什么。但是,您的两个子类都不起作用,因为对于
Child1
,您将
Test
方法保留为抽象,而在
Child2
中,您没有覆盖它,因此它仍然是抽象的。因此,两者都不能实例化。如果希望
Child1
可创建,请删除该类中的
abstract
关键字,该关键字将起作用。我们可能需要第二个子项的更多详细信息。运行它并读取错误。.第一个错误是
不能使用'Parent'作为类名,因为它在
Test2()中是保留的
您必须创建另一个子项,假设您使
Test()
不是抽象的。