代表“理想世界”的类和对象
如果能通过说 $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 的地方是,“好的”对象会自我约束。我的意思是,现实中也是这样......比如,如果你雇了一名水管工来修理厨房水槽,你不会希望他找出最佳解决方案吗?他不会不喜欢你想要控制整个工作吗?你不会希望他不会给你带来更多问题吗?而且,天哪,要求他离开前打扫一下太过分了吗?
我说,好好设计你的类,这样它们才能不受干扰地完成工作...谁喜欢坏消息?而且,如果你的类和对象定义良好、经过教育并且拥有所有必要的数据来工作(就像上面的例子一样),你就不用从类的外部对整个程序进行微观管理。换句话说...创建一个对象,然后让它大展身手!