我有一个抽象类,其中我想调用的方法,从在孩子(扩展)类中声明一个类。一个例子是这样的:
抽象类:
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发现”。有没有什么办法,使这项工作?
尝试把命名空间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);
}
}
你必须使用接口这一点。你可以做以下
MyClassInterface
interface MyClassInterface {
public function MyMethod();
}
class MyClass1 implements MyClassInterface {
public function MyMethod() {
// implementation
}
}
class MyClass2 implements MyClassInterface {
public function MyMethod() {
// implementation 2
}
}
NumberGenerator
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();
}
}
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]);
}