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

问题描述 投票:1回答:2

我有一个抽象类,其中我想调用的方法,从在孩子(扩展)类中声明一个类。一个例子是这样的:

抽象类:

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();
    }
}

所以,我想打电话给MyClass的::中的MyMethod NumberGenerator。但是它只是进口的TomsNumberGenerator。

我想这样做,喜欢它的原因是因为我有类,如DavesNumberGenerator这就要求不同的MyClass的。

当我尝试,我得到“MyClass的不NumberGenerator发现”。有没有什么办法,使这项工作?

php abstract-class
2个回答
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. 创建MyClassInterface
interface MyClassInterface {
    public function MyMethod();
}
  1. 在实现某些类此接口
class MyClass1 implements MyClassInterface {
    public function MyMethod() {
        // implementation
    }
}

class MyClass2 implements MyClassInterface {
    public function MyMethod() {
        // implementation 2
    }
}
  1. 添加抽象方法NumberGenerator
abstract class NumberGenerator {
    abstract protected function GetMyClass(): MyClassInterface;

    protected function generate($input){
        return $this->GetMyClass()->MyMethod($input);
    }
}
  1. 实现子类中GetMyClass功能
class TomsNumberGenerator extends NumberGenerator
{
    protected function GetMyClass(): MyClassInterface {
        return new MyClass1();
    }
}
class DavesNumberGenerator extends NumberGenerator
{
    protected function GetMyClass(): MyClassInterface {
        return new MyClass2();
    }
}

PS。如果您想使用静态的,你可以NumberGenerator类的内部改变抽象,改变string。在这种情况下,您的generate看起来就像这样:

protected function generate($input){
    return call_user_func($this->GetMyClass() . '::MyMethod', [$input]);
}
© www.soinside.com 2019 - 2024. All rights reserved.