我有一个抽象类,我想从子类(扩展类)中声明的类中调用方法。一个示例如下所示:
抽象类:
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”的信息。有什么办法可以使这项工作成功?
答案 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)
您必须为此使用界面。 您可以执行以下操作
data
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();
}
}
PS 如果要使用静态,则可以在class DavesNumberGenerator extends NumberGenerator
{
protected function GetMyClass(): MyClassInterface {
return new MyClass2();
}
}
类内更改摘要,以更改NumberGenerator
。在这种情况下,您的string
将如下所示:
generate