PHP-使用子类中声明的类的受保护/抽象方法

时间:2019-02-06 19:22:30

标签: php abstract-class

我有一个抽象类,我想从子类(扩展类)中声明的类中调用方法。一个示例如下所示:

抽象类:

abstract class NumberGenerator
{
    protected function generate($input){
        return MyClass::MyMethod($input);
    }
}

我的孩子/补习班:

use TomsFolder\MyClass;
use MyFolder\NumberGenerator;

class TomsNumberGenerator extends NumberGenerator
{
    public function generate(string $applicantId): string
    {   
        return $this->generate();
    }
}

另一个孩子/延伸班:

use DavesFolder\MyClass;
use MyFolder\NumberGenerator;

class DavesNumberGenerator extends NumberGenerator
{
    public function generate(string $applicantId): string
    {   
        return $this->generate();
    }
}

所以我想在NumberGenerator中调用MyClass :: MyMethod。但是,它仅在TomsNumberGenerator中导入。

我想这样做的原因是因为,我有像DavesNumberGenerator这样的类,它调用了另一个MyClass。

尝试此操作时,出现“在NumberGenerator中找不到MyClass”的信息。有什么办法可以使这项工作成功?

2 个答案:

答案 0 :(得分:1)

尝试将名称空间use语句放在实际的类之前:

NumberGenerator.php

use MyFolder\MyClass;

abstract class NumberGenerator
{
    protected function generate($input){
        return MyClass::MyMethod($input);
    }
}

编辑

尝试一下:

NumberGenerator.php

abstract class NumberGenerator
{
    protected function generate($class_name, $input){
        return call_user_func($class_name . '::MyMethod', $input);
    }
}

TomsNumberGenerator.php

use TomsFolder\MyClass;
use MyFolder\NumberGenerator;

class TomsNumberGenerator extends NumberGenerator
{
    public function generate(string $applicantId): string
    {   
        return $this->generate(get_class(new MyClass()), $applicantId);
    }
}

答案 1 :(得分:1)

您必须为此使用界面。 您可以执行以下操作

  1. 创建data
MyClassInterface
  1. 在某些类中实现此接口
interface MyClassInterface {
    public function MyMethod();
}
  1. class MyClass1 implements MyClassInterface { public function MyMethod() { // implementation } } class MyClass2 implements MyClassInterface { public function MyMethod() { // implementation 2 } } 添加抽象方法
NumberGenerator
  1. 子类内的实现abstract class NumberGenerator { abstract protected function GetMyClass(): MyClassInterface; protected function generate($input){ return $this->GetMyClass()->MyMethod($input); } } 函数
GetMyClass
class TomsNumberGenerator extends NumberGenerator
{
    protected function GetMyClass(): MyClassInterface {
        return new MyClass1();
    }
}

PS 如果要使用静态,则可以在class DavesNumberGenerator extends NumberGenerator { protected function GetMyClass(): MyClassInterface { return new MyClass2(); } } 类内更改摘要,以更改NumberGenerator。在这种情况下,您的string将如下所示:

generate