代表「理想世界」的類別和物件
如果能透過說 $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]
我最喜歡物件導向程式設計的一點是「好的」物件會自我約束。我的意思是,這與現實生活中完全一樣……例如,如果您聘請水電工修理廚房水槽,您難道不期望他能找出最佳的解決方案嗎?他難道不討厭您想要掌控整個工作嗎?您難道不期望他不會給您帶來額外的問題嗎?看在老天的份上,要求他在離開前清理乾淨會太過分嗎?
我認為,好好設計您的類別,讓它們可以不受干擾地完成工作……誰喜歡壞消息?而且,如果您的類別和物件定義良好、具備相關知識,並且擁有所有必要的數據可供使用(就像上面的例子一樣),您就不必從類別外部對整個程式進行微觀管理。換句話說……建立一個物件,然後讓它盡情發揮!