我有以下PHP代码来描述颜色。简而言之,我在当天使用PHP 4的方式,现在我试图让我的头围绕5.5,所以这是我第一次在PHP中使用对象。
无论如何,我有一个逻辑错误,我认为与Color类中设置的默认值有关。有人可以解释为什么我的构造函数不起作用,或者发生了什么?
class Color {
private $red = 1;
private $green = 1;
private $blue = 1;
private $alpha = 1;
public function __toString() { return "rgb(" . $this->red . ", "
. $this->green . ", " . $this->blue . ", " . $this->alpha . ")"; }
}
class RGBColor extends Color {
public function __construct($red, $green, $blue) {
$this->red = $red; $this->green = $green;
$this->blue = $blue; $this->alpha = 1;
}
}
class RGBAColor extends Color {
public function __construct($red, $green, $blue, $alpha) {
$this->red = $red; $this->green = $green;
$this->blue = $blue; $this->alpha = $alpha;
}
public function __toString() { return "rgba(" . $this->red
. ", " . $this->green . ", " . $this->blue . ", " . $this->alpha . ")"; }
}
$c = new Color();
echo "Color: " . $c . "<br>";
$c1 = new RGBColor(0.6, 0.4, 1.0);
echo "RGB Color: " . $c1 . "<br>";
$c2 = new RGBAColor(0.6, 0.4, 1.0, 0.5);
echo "RGBA Color: " . $c2 . "<br>";
我得到以下输出......
Color: rgb(1, 1, 1, 1)
RGB Color: rgb(1, 1, 1, 1)
RGBA Color: rgba(0.6, 0.4, 1, 0.5)
什么时候我应该......
Color: rgb(1, 1, 1, 1)
RGB Color: rgb(0.6, 0.4, 1.0)
RGBA Color: rgba(0.6, 0.4, 1, 0.5)
谢谢! -Cody
答案 0 :(得分:2)
这不是初始化顺序而是可见性问题。 private变量只能由同一个类中定义的方法访问。 Color::__toString()
访问Color
上定义的变量,但子类中的构造函数访问子类的不同变量。举个简单的例子:
<?php
class A {
private $p = __CLASS__;
}
class B extends A {
function __construct() {
$this->p = __CLASS__;
}
}
$b = new B;
var_dump($b);
输出:
class B#1 (2) { private $p => string(1) "A" public $p => string(1) "B" }
如果您希望成员变量可以在后代中访问,请将其设为受保护而非私有。
答案 1 :(得分:2)
对于要在子类上使用的变量,使用protected not private。另一种方法是编写setter和getter。
答案 2 :(得分:0)
我猜测可能是int和float问题,似乎PHP将它四舍五入为整数。