在实例创建时调用对象的方法

时间:2010-03-29 09:29:28

标签: php object

在PHP中为什么我不能这样做:

class C
{
   function foo() {}
}

new C()->foo();

但我必须这样做:

$v = new C();
$v->foo();

在所有语言中我都能做到......

5 个答案:

答案 0 :(得分:15)

从PHP 5.4开始,你可以做到

(new Foo)->bar();

在此之前,这是不可能的。参见

但是你有一些替代方案

令人难以置信的丑陋解决方案我无法解释:

end($_ = array(new C))->foo();

Pointless Serialize / Unserialize只是为了能够链接

unserialize(serialize(new C))->foo();

使用Reflection

同样毫无意义的方法
call_user_func(array(new ReflectionClass('Utils'), 'C'))->foo();

使用函数作为工厂的更合理的方法:

// global function
function Factory($klass) { return new $klass; }
Factory('C')->foo()

// Lambda PHP < 5.3
$Factory = create_function('$klass', 'return new $klass;');
$Factory('C')->foo();

// Lambda PHP > 5.3
$Factory = function($klass) { return new $klass };
$Factory('C')->foo();

使用Factory Method Pattern解决方案的最明智的方法:

class C { public static function create() { return new C; } }
C::create()->foo();

答案 1 :(得分:8)

从PHP 5.4开始,您可以:(new Foo())->someMethod();

答案 2 :(得分:4)

在PHP中,您无法在新创建的对象(如new Foo()->someMethod();

)上调用任意方法

抱歉,但就是这样。

但你可以像这样建立一个工作:

<?php
class CustomConstructor
{
  public static function customConstruct($methodName)
  {
    $obj = new static; //only available in PHP 5.3 or later
    call_user_method($methodName, $obj);
    return $obj;
  }
}

像这样扩展CustomContructor:

class YourClass extends CustomConstructor
{
  public function someCoolMethod()
  {
    //cool stuff
  }
}

并像这样实例化它们:

$foo = YourClass::customConstruct('someCoolMethod');

我还没有测试过,但这个或类似的东西应该有用。

更正:这只适用于PHP 5.3及更高版本,因为需要后期静态绑定。

答案 3 :(得分:1)

您应该无法执行

之类的代码

new C()->foo();

在其他语言中,至少不会只要该语言准确地遵循逻辑。该对象不仅使用C()创建,而且使用完整new C()创建。因此,如果包含另一对括号,则假设您应该能够执行该代码: (new C())->foo();

(请注意:我没有对上述内容进行过测试,我只是说应该假设有效。)

大多数语言(我遇到的)都以同样的方式处理这种情况。 C,C#,Java,Delphi ......

答案 4 :(得分:-1)

我试过这个并且成功了 -

<?php

$obj = new test("testFunc");

class test{
    function __construct($funcName){
        if(method_exists($this, $funcName)){
            self::$funcName();
        }
    }

    function testFunc(){
        echo "blah";
        return $this;
    }
}

?>