2017-10-16 110 views
-2

我不会像OOPs /基于类的'PHP'差不多,我对他们非常可怕。有人可以解释为什么这个代码打破了吗?什么是适当的解决方法。谢谢。PHP共享实例成员变量

<?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. 
    } 
} 
+0

你不知道它是如何破坏的,所以我们不能告诉你它为什么破裂或如何修复它。 – Gordon

+0

手册:属性声明可能包括一个初始化,但是这个初始化必须是一个常量值 - 也就是说,它必须能够在编译时进行评估,并且不能依赖运行时信息进行评估。 – Progrock

回答

3

PHP documentation on class properties

此[属性]声明可以包括初始化,但此初始化必须是一个恒定值 - 即,它必须能够在编译时被评估并且不能依赖运行时信息来进行评估。在方法调用

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. 
} 
+0

非常感谢你,你真棒!还有一些不错的人愿意教他们的'掌握语言'的新手。希望看到更多像你这样的人正确运用他们选择的语言能力。再次感谢!一帆风顺! –

+0

@AidenHyde没问题:)请考虑标记答案为已接受。 – Finwe