【问题标题】:Call abstract class method from class name从类名调用抽象类方法
【发布时间】:2013-09-17 21:50:02
【问题描述】:

我有一个包含类名的字符串。这个类是抽象的,但有一个公共静态方法返回一个子类的实例。

abstract class MyClass {

   public static function instance() {
      return self::$inst;
   }

}

现在我需要以某种方式调用此方法,而我得到的只是类的名称作为字符串。我不能说$class = new $className(),因为 MyClass 是抽象的。有什么想法吗?

【问题讨论】:

  • 不能为抽象类创建对象
  • 我意识到这一点。我不需要对象,因为正如我所说,我想调用静态方法。我想调用 MyClass::instance(),但我只有一个包含“MyClass”的字符串
  • 抽象类可以通过继承类来访问。不能直接调用抽象类方法php.net/manual/en/language.oop5.abstract.php

标签: php abstract-class


【解决方案1】:

如果你有一个字符串中的类名并想调用该类的抽象方法,你可以执行以下操作:

$className = 'MyClass';
$instance = $className::instance();

【讨论】:

  • 这可能是因为您的“MyClass”是抽象的。您不能实例化抽象类。如果您想从字符串中的名称创建一个类,我建议您使用$instance = new $className(); 或$instance = ClassFactory($className); 之类的工厂。
  • ClassFactory 没有在 PHP 中定义。
【解决方案2】:

我终于找到了解决方案——反射。

$refClass  = new ReflectionClass('MyClass');
if ($refClass->hasMethod('instance') {
   $refMethod = new ReflectionMethod('MyClass', 'instance');
   $refMethod->invoke(null);
}

【讨论】:

    【解决方案3】:

    我知道我迟到了,但如果有人还在找,请执行以下操作:

    $method = "myFunction";
    $class =  "myClass";
    $result = $class::$method();
    

    所以在提到的情况下使用

    $method = "instance";
    $class = "myClass"
    $instance = $class::$method();
    

    但在您的情况下,问题似乎出在您的实例函数中。我猜你试图返回你的抽象类的一个实例,这是不可能的!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      相关资源
      最近更新 更多