表示“理想世界”的类和对象
如果可以通过说 $son->mowLawn()
来修剪草坪,那不是很棒吗?假设函数 mowLawn()
已定义,并且你有一个不会抛出错误的儿子,那么草坪就会被修剪。
在以下示例中,让 Line3D
类型的对象在三维空间中测量自己的长度。当类本身包含所有必要数据并具备进行计算的能力时,为什么我或 PHP 必须从类外部提供另一种方法来计算长度呢?
<?php
class Point3D
{
public $x;
public $y;
public $z; public function __construct($xCoord=0, $yCoord=0, $zCoord=0)
{
$this->x = $xCoord;
$this->y = $yCoord;
$this->z = $zCoord;
}
public function __toString()
{
return 'Point3D(x=' . $this->x . ', y=' . $this->y . ', z=' . $this->z . ')';
}
}
class Line3D
{
$start;
$end;
public function __construct($xCoord1=0, $yCoord1=0, $zCoord1=0, $xCoord2=1, $yCoord2=1, $zCoord2=1)
{
$this->start = new Point3D($xCoord1, $yCoord1, $zCoord1);
$this->end = new Point3D($xCoord2, $yCoord2, $zCoord2);
}
public function getLength()
{
return sqrt(
pow($this->start->x - $this->end->x, 2) +
pow($this->start->y - $this->end->y, 2) +
pow($this->start->z - $this->end->z, 2)
);
}
public function __toString()
{
return 'Line3D[start=' . $this->start .
', end=' . $this->end .
', length=' . $this->getLength() . ']';
}
}
echo '<p>' . (new Line3D()) . "</p>\n";
echo '<p>' . (new Line3D(0, 0, 0, 100, 100, 0)) . "</p>\n";
echo '<p>' . (new Line3D(0, 0, 0, 100, 100, 100)) . "</p>\n";
?>
<-- 结果如下 -->
Line3D[start=Point3D(x=0, y=0, z=0), end=Point3D(x=1, y=1, z=1), length=1.73205080757]
Line3D[start=Point3D(x=0, y=0, z=0), end=Point3D(x=100, y=100, z=0), length=141.421356237]
Line3D[start=Point3D(x=0, y=0, z=0), end=Point3D(x=100, y=100, z=100), length=173.205080757]
我对 OOP 最喜欢的一点是,“好的”对象会自行约束。我的意思是,现实中也是完全一样的……比如,如果你雇了一个水管工来修理厨房的水槽,你难道不希望他找出最佳的解决方法吗?他难道不会讨厌你想要控制整个工作过程吗?你难道不希望他不会给你带来额外的麻烦吗?而且,天哪,要求他在离开之前打扫干净是不是太过分了?
我说,好好设计你的类,以便它们能够不受干扰地完成自己的工作……谁喜欢坏消息?而且,如果你的类和对象定义良好、经过深思熟虑,并且拥有所有必要的数据来处理(就像上面的例子一样),你就不需要从类的外部微观管理整个程序。换句话说……创建一个对象,然后放手让它运行!