)){ case 'David' : $myPerson->AddFeedback('Great Article!','Some Reader', date('Y-m-d')); break; case 'Charles': $myPerson->feedback[] = array('Some Reader', 'Great Editing!'); break; case 'Alejandro' : $myPerson->Feedback->Append('Awesome javascript!'); break; default : $myPerson->AddFeedback('Yay!'); } ?>
这个示例展示了行为不同的对象,还有一个switch语句用于区分不同的Person类对象,从而执行其各自相应的正确操作。注意,这里针对不同条件的回馈注释是不同的。在实际应用程序开发中可能不会出现这种情形;我仅为了简单地说明类实现中存在的区别。
下面的一个示例使用了多态性。
<?php $name = $_SESSION['name']; $myPerson = Person::GetPerson($name); $myPerson->AddFeedback('Great Article!', 'SomeReader', date('Y-m-d')); ?>
注意,这里没有switch语句,而最重要的是,缺乏有关Person::GetPerson()会返回什么类型的对象。而另一个Person::AddFeedback()是一个多态方法。行为完全是由具体类进行封装的。请记住,在此无论我们使用的是David,Charles还是Alejandro,调用代码从不必了解具体类的功能,而仅知道基类就可以了。
尽管我的示例并不完美,但是,从调用代码的角度,它已经展示了多态性的基本用法。现在我们需要分析这些类的内部实现。从一个基类进行派生的一个最伟大的地方在于,该派生类能够存取父类的行为,这种情况常常是缺省的实现,但是也可能出现在类继承链中用于创建更为复杂的行为。下面是这种情况的一个简单展示。
<?php class Person{ function AddFeedback($comment, $sender, $date){ //把回馈添加到数据库 } } class David extends Person{ function AddFeedback($comment, $sender){ parent::AddFeedback($comment, $sender, date('Y-m-d')); } } ?>
在此,David类中的AddFeedback方法实现中首先调用了Person::AddFeedback方法。你可能注意到,它模仿了C++,Java或C#中的方法重载。请记住,这仅是一个简单化的示例,并且你编写的实际代码完全依赖于你的实际工程。
四、PHP 5中的迟绑定
依我的看法,迟绑定正是使得Java和C#如此引人注目的重要原因。它们允许基类方法用"this"或$this来调用方法(即使它们不存在于基类中或调用一个基类中的方法,它有可能为继承类中的另一个版本所代替)。你可以认为如下的实现在PHP中是允许的:
<?php class Person{ function AddFeedback($messageArray) { $this->ParseFeedback($messageArray); //写向数据库 } } class David extends Person{ functio 上一页 [1] [2] [3] 下一页 |