【问题标题】:Create objects on the fly without variable assignment with PHP动态创建对象,无需使用 PHP 进行变量赋值
【发布时间】:2011-07-04 05:06:25
【问题描述】:

我只是好奇是否可以在 PHP 中动态创建对象。我以为我以前见过它。当然,我可以将它分配给一个变量,但只是想知道这是否可能。

new className()->someMethod();

当然这会引发语法错误,所以显然不是那样做的(如果可能的话)。 我是否应该将它分配给一个变量,因为我只是好奇地这样做真的没有问题吗?


只是一些进一步的细节。静态方法并不是一个真正的选择,因为我试图为之做的类是 PHP 的 ReflectionMethod 类。

【问题讨论】:

  • 你试过(new className())->someMethod();吗?
  • 是的,jerluc 也不是那样工作的。
  • 是的,谢谢 Gordon,我找的时候找不到任何东西,我的标题好多了。 ;)

标签: php class object


【解决方案1】:

这种用法在 Java 中很典型,但在 PHP 5.3 之前不可用。现在它是 PHP 5.4 中的一个新特性。请检查PHP 5.4 new features。并且用法应该是:

(new Foo)->bar()

【讨论】:

  • 太棒了!无需为每一堂课都写create()!
  • 链接已损坏。
【解决方案2】:

这仅在您使用单例模式来实例化对象时才有效。如果您不知道如何实现单例模式,则必须在网上搜索。但这样就可以了:

className::getInstance()->someMethod();

编辑

正如 zerkms 所说,工厂方法也是可能的:

class ReflectionFactory
{
    public static function factory($arguments)
    {
        return new ReflectionClass($arguments);
    }
}

// Then in your code for example
ReflectionFactory::factory()->getConstants();

【讨论】:

  • +1 这将是首选方法。但这仅在单例适合 OP 的情况下才成立。
  • 这个方法很棒,但不可能,因为我正在尝试为 PHP 的 ReflectionMethod 类做这个。
  • @jerluc: 如果不合适 - 那么工厂可以更换它;-)
  • -1 因为 Singleton 几乎从来都不是一个好的解决方案,而且这里肯定不是正确的解决方案,因为 OP 不希望在每个请求上都获得相同的实例,也不希望全局访问说实例。
  • 我将继续选择这个作为唯一合适的方式。工厂方式很方便。然而,这不是我问题的答案,主要是因为我认为我的问题还不能正确回答。哦,好的,谢谢你们的帮助。
【解决方案3】:

目前在 php 中,无法在一个表达式中实例化新对象并调用其方法。

所以显然你需要先将它分配给某个变量。

【讨论】:

  • 哦,值得一试。 :)
【解决方案4】:

您可以在类上使用静态方法,而无需将该类的实例保存到变量中。

class testClass{
    public static function staticMethod(){
        echo "Static method";
    }
}

testClass::staticMethod();

【讨论】:

    【解决方案5】:

    我不知道为什么 PHP 不允许构造函数的链接。如果您真的需要这样做,请尝试以下类似的操作并进行必要的调整。

    <?php
    class A {
      public function b()
      {
        echo "a->B is called";
      }
      public static function factory()
      {
        return new self;
      }
    
    }
    $a  = A::factory()->b();
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-15
      • 2023-03-21
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      相关资源
      最近更新 更多