【问题标题】:PHP Shared instance member variablePHP 共享实例成员变量
【发布时间】:2017-10-16 07:53:22
【问题描述】:

我几乎不做像“PHP”这样的基于类的 OOPs,而且我对它们非常糟糕。有人可以解释为什么这段代码会被破坏吗?什么是正确的解决方法。谢谢。

<?php
namespace app\samples;

use models\Person;
use helpers\OtherClass;
use helpers\SomeClass;

class Sample
{
    private $num = 2; # Working
    private $str = 'My string'; # Working
    private $bool = true; # Working

    private $person = new Person(); # Breaks ??
    private $mValues = OtherClass::getValues(); # Breaks ??

    public function mFunction1()
    {
        SomeClass::doSomething($person, $mValues); // Use $person & $mValues here.
    }

    public function mFunction2()
    {
        SomeClass::doSomething($person, $mValues); // Use $person & $mValues here.
    }
}

【问题讨论】:

  • 你没有告诉它是如何坏掉的,所以我们不能告诉你它为什么坏掉或如何修复它。
  • 手册:属性声明可以包含一个初始化,但是这个初始化必须是一个常量值——也就是说,它必须能够在编译时被评估,并且不能依赖于运行时信息被评估的顺序。

标签: php variables object instance


【解决方案1】:

来自PHP documentation on class properties

这个 [property] 声明可以包含一个初始化,但这个初始化必须是一个常量值——也就是说,它必须能够在编译时被评估,并且不能依赖运行时信息才能被评估.

因此,为了将新类或静态方法的结果分配给属性,您必须在类的构造函数中执行此操作:

public function __construct()
{
    $this->person = new Person();
    $this->mValues = OtherClass::getValues();
}

此外,在您的方法调用中,您必须使用 $this 的属性 - 在您的代码中您使用的是(未定义,因此为“NULL”)局部变量。

public function mFunction1()
{
    SomeClass::doSomething($this->person, $this->mValues); // Use $person & $mValues here.
}

【讨论】:

  • 非常感谢你,你太棒了!仍然有一些好人愿意教新手他们的“掌握的语言”。希望看到更多像你这样正确利用他们选择的语言能力的人。再次感谢!神速!
猜你喜欢
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 2019-02-21
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
相关资源
最近更新 更多