构造函数中的PHP访问属性

构造函数中的PHP访问属性,php,oop,constructor,Php,Oop,Constructor,我在访问构造函数中的属性时遇到问题: Class MyClass{ public $stuff = false; public function __construct(){ if($this->stuff){ echo('It works!'); } } } 致电: $myclass = new MyClass; $myclass->stuff = true; 它仍然返回false(因此没有“It Works!”) 我知道构造函

我在访问构造函数中的属性时遇到问题:

Class MyClass{

    public $stuff   = false;

    public function __construct(){
        if($this->stuff){ echo('It works!'); }
    }

}
致电:

$myclass = new MyClass;
$myclass->stuff = true;
它仍然返回false(因此没有“It Works!”)


我知道构造函数不会看到变量,但有没有一个好方法可以实现这一点?

在设置属性之前调用构造函数。
if
将始终计算为false

如果要设置
MyClass::stuff
,请通过构造函数参数进行设置,例如:

public function __construct($stuff = false){
    if($this->stuff = $stuff){
        echo('It works!');
    }
}

我看不出美元有什么意义

public $stuff   = false;
一个实例变量,设置为false并在构造函数中立即检查。除非实例化此变量,否则它不会更改。我认为你可能一直在寻找的是一个静态变量

Class MyClass{

    public static $stuff = false;

    function __construct(){ // you don't have to specify the constructor as public
        if (self::$stuff){ 
           echo 'You got some stuff!'; 
        } else { 
           echo 'You ain\'t got stuff!'; 
        }
    }

}


$myclass = new MyClass(); // You ain't got stuff!


MyClass::$stuff = true;
$myclass = new MyClass(); // You got some stuff!
如果它是一个实例变量,那么您只需要在子类化时使用它

Class MyClass{

    public $stuff = false;

    function __construct(){ 
        if ($this->stuff){ 
           echo 'You got some stuff!'; 
        } else { 
           echo 'You ain\'t got stuff!'; 
        }
    }

}


class MySubClass extends MyClass {    
    public $stuff = true;    
}


$mysub = new MySubClass() // You got some stuff! 
如果你只是想把东西传递给构造函数,为什么还要定义一个实例变量呢? 下面的内容难道还不够吗?除非你以后必须参考它,在这种情况下,蒂姆·库珀的答案

Class MyClass {

   function __construct($stuff = false){
      if ($stuff){ 
         echo 'You got some stuff!'; 
      } else { 
         echo 'You ain\'t got stuff!'; 
      }
   }
}
Class MyClass {

   function __construct($stuff = false){
      if ($stuff){ 
         echo 'You got some stuff!'; 
      } else { 
         echo 'You ain\'t got stuff!'; 
      }
   }
}