【问题标题】:Accessing class function during instantiation在实例化期间访问类函数
【发布时间】:2014-02-23 14:43:15
【问题描述】:

我做了一些研究,发现了这个SO-Post 和这个Php Docs...

现在我的问题是,它不起作用!

我当前的php版本是5.4.12,我追求的这个功能与5.4兼容。我想知道为什么它不起作用?

这就是我所追求的,也是我迄今为止尝试过的东西......

例如,我们有一个类:

class MyClass
{
    private $var = "";

    public function __construct()
    {
        // either with or without
        // return $this;
    }

    public static function newObj()
    {
        return new self;
    }

    public function setVar($var)
    {
        $this->var = $var;
    }
}

我已经尝试过这些:

$obj = (new MyClass)->setVar("foo");

// or

$obj = MyClass::newObj()->setVar("foo");

但是没有任何工作,当我使用var_dump 获得$obj 值时,它只是null

编辑

我还尝试在__construct 中放置一个echo,以查看该类是否正在初始化,并且确实如此。

【问题讨论】:

  • 你没有从setVar() 返回任何东西 - 你期望 $obj 有什么价值?
  • 啊,所以我需要return $this;。当我把它放在那里时它会起作用,但为什么呢?我希望在类的实例化过程中,创建/返回对象,我只需使用setName 访问它,并将更改后的名称的类存储在我的本地$obj 变量中。所以,这不是它真正发生的事情。谢谢。
  • 实例化期间,该对象被返回,但您随后获取并立即使用它调用setVar()。对$obj 的赋值只有在= 的右侧被完全评估后才会发生,在这种情况下,评估的结果是setVar() 的结果。
  • 在 setter 方法中返回 $this 并在连接语句中将其分配给保存整个实例的变量是晦涩的代码。很可能会在下一个维护版本中中断...

标签: php class oop


【解决方案1】:

由于setVar 没有返回任何内容,因此左侧站点必须为空。

$obj = new MyClass();
$obj->setVar("foo");

会起作用的。

其他方式,但很不寻常,因为 setter 通常不返回任何内容:

...
public function setVar($var)
{
    $this->var = $var;
    return $this;
}
...

// now this will work:
$obj = (new MyClass)->setVar("foo");

但对我来说这是晦涩难懂的代码。

【讨论】:

  • 猜猜他可能想拥有连锁功能。
  • 链函数:没有速度增益,但很可能得到不可读的代码。
  • 返回$this 的方法允许方法链接:$some_rows = (new DatabaseQuery)->setFrom(...)->setWhere(...)->setLimit()->execute() 是可读的,尤其是换行符。但 IMO 仅适用于您不需要捕获新构造的对象以供将来使用的情况。
  • @DCoder:同意!但我不希望 setter 方法返回对象以便在构造函数的链中使用它。你上面的例子很有意义,你从最后一个方法得到一个结果集。
猜你喜欢
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多