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

Php 在实例创建时调用对象的方法,php,object,Php,Object,在PHP中,为什么我不能: class C { function foo() {} } new C()->foo(); 但我必须做到: $v = new C(); $v->foo(); 用所有的语言我都能做到 在PHP中,不能对新创建的对象调用任意方法,如new Foo()->someMethod() 对不起,事情就是这样 但你可以这样做: <?php class CustomConstructor { public static function custom

在PHP中,为什么我不能:

class C
{
   function foo() {}
}

new C()->foo();
但我必须做到:

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

用所有的语言我都能做到

在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;
  }
}
class YourClass extends CustomConstructor
{
  public function someCoolMethod()
  {
    //cool stuff
  }
}
$foo = YourClass::customConstruct('someCoolMethod');
并将其实例化如下:

<?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;
  }
}
class YourClass extends CustomConstructor
{
  public function someCoolMethod()
  {
    //cool stuff
  }
}
$foo = YourClass::customConstruct('someCoolMethod');
我还没有测试过它,但这个或类似的东西应该可以工作


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

我尝试了此方法,并成功-

<?php

$obj = new test("testFunc");

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

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

?>

从PHP5.4开始,您可以

(new Foo)->bar();
在那之前,这是不可能的。看

但是你有一些选择

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

end($_ = array(new C))->foo();
无意义的序列化/取消序列化只是为了能够链接

unserialize(serialize(new C))->foo();
使用反射的同样无意义的方法

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();

您不应该能够像这样执行代码

newc()->foo()

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

(请注意:我还没有测试上面的内容,我只是说它应该假设有效。)


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

从PHP5.4你可以做:
(new Foo())->somethod()

有关此方法的更多信息,请参阅call_user_方法的手册部分。PHP6也不会有此功能?我不知道此问题是否会在PHP6中得到解决。不管怎样,6号出来还有很长一段时间。不幸的是,这不起作用。php不是c、c#、java、delphi等。嗯,奇怪。我真的可以发誓我以前用PHP做过这种事情。哦,好吧!不是真的。根据运算符优先级表,首先执行新的an()。其他语言也以同样的方式工作。因此,在Java、C#等语言中,如果您使用新的C().foo(),一切都会很好!这并没有达到提问者通过提问所期望的连锁能力。您的实现还需要显式地使用构造函数参数来调用链式函数,这不是构造函数应该做的。