与PHP中的构造函数混淆

时间:2017-02-04 09:45:04

标签: php oop

为什么我能在构造函数中使用属性而不在类中定义,请阅读下面的代码。

<?php
class TV
{
 public function __construct($m, $v)
 {
  $this->model = $m;
  $this->volume = $v;
 }
}

$tv_one = new TV("Samsung", 6);
echo $tv_one->model."<br><br>";
echo $tv_one->volume;
?>

也看看这段代码。我可以在课外分享私人财产。请转到此代码 -

<?php
class TV
{
 private $model = "Samsung";
 private $volume = 2;

 public function volumeUp()
 {
  return $this->volume++;
 }

 public function volumeDown()
 {
  return $this->volume--;
 }
 public function __construct($m, $v)
 {
  $this->model = $m;
  $this->volume = $v;
 }
}
class PlasmaTv extends TV 
{
 public $plasma = true;
 public function hello()
 {
  return "I am new " . $this->model . " and my default volume is " . $this->volume . ".";
 }
 public function __construct($m, $v, $p)
 {
  $this->model = $m;
  $this->volume = $v;
  $this->plasma = $p;
 }
}
$plasma = new PlasmaTv("Soni", 6, true);
echo $plasma->model."<br><br>";
echo $plasma->volume."<br><br>";
echo $plasma->plasma;
echo $plasma->hello();
?>

1 个答案:

答案 0 :(得分:1)

PHP并不要求您声明属性。只需分配给一个属性就可以将其创建为公共属性。所以当第一个构造函数执行时:

$this->model = $m;

在对象中创建model属性。

PlasmaTv课程中,modelvolume属性与父类TV中的属性不同,因为父级中的属性是私有的并且无法在孩子中访问。如果你这样做:

$plasma->volumeUp();
echo $plasma->volume;

它将打印6,而不是7,因为volumeUp()增加了与PlasmaTv中的公共属性不同的属性。

如果要共享子项和父项之间的属性,请声明它们protected。但是,您无法在课程外使用$plasma->volume