实例和多态这两个词汇是面向对象开发的重点,开发者定义类结构,并从中进行数据抽象,最重要的要点是面向对象中的多态概念。
多态表示在一个对象中,它与另一个对象使用的类型相同,如果B类是A类的后代,A类的一个方法除了可接收自已实例的参数外,还可以接受子类B传递的参数。
1.public
public修饰的属性或方法可以被其他类在外部访问。
2.protected
protected修饰的成员变量或方法表示允许对象内部和子类的对象访问。被限定为protected的成员变量,只能通过父类本身或子类进行访问或修改。上面的代码就是子类通过继承,可以共享和访问父类中的成员变量以及父类的方法。
现在我们创建另一个文件名class.extendedemailer.php,使用如代码清单2-6所示的代码:
代码清单2-6 创建一个emailer的子类extendedEmailer
<?php class extendedEmailer extends emailer{ function __construct(){} public function setSender($sender){ $this->sender = $sender; } }?>
下面我们使用该类,即声明该类的对象应用,如代码清单2-7所示:
代码清单2-7 使用extendedEmailer扩展类
<?php include_once("class.emailer.php"); include_once("class.extendedemailer.php"); $xemailer = new ExtendedEmailer(); var_dump($xemailer); $xemailer->setSender("webmaster@21cto.com"); $xemailer->addRecipients("jiang.du@qq.com"); //访问方法 //给一些方法发送参数 $xemailer->setSubject("我要找工作"); $xemailer->setBody("你好,你好?"); $xemailer->sendEmail(); ?>
你会发现,我们访问了extendsendEmail对象,这实际上继承的是Emailer父类的方法。当声明为protected的方法时,这意味着非继承方式不能调用。如果我们执行下面的代码,它会产生一个PHP致命错误,如代码清单2-8所示:
代码清单2-8 非继承的方法访问protected方法
<?php include_once("class.emailer.php"); include_once("class.extendedemailer.php"); $xemailer = new ExtendedEmailer(); $xemailer->sender = "hasin@21cto.com"; ?>
我们会得到类似如下的错误信息:
<b>Fatal error</b>: Cannot access protected property extendedEmailer::$sender in <b>C:\OOP with PHP5\Codes\ch1\test.php</b> on line <b>5</b><br />
3.private
private表示属性或方法被声明为私有,只能由类本身的方法访问,继承该类的子类也是不能访问的。在旧的PHP版本的面向对象模式里,类的属于都使用var关键字来定义,对于方法,这相当于使用了public关键字。
除了以上3个关键字,对于成员方法,还有以下3个关键字描述,分别为静态(static)、抽象(abstract)和最终(final)方法。
·static静态方法虽然隶属于某个类,但它不受该类的束缚,不需要声明对象实例就可以直接被外部访问和存取。
·abstract抽象方法不能直接使用,必须经过实现(使用implement关键字)才可以使用。
·final方法,表示该方法是最终的版本,不能再重新声明,也不能被重写。
在类中也可以使用常量,常量的值是在运行时不能被改变,与变量的区别是,它们以大写字符表示,并且不能使用$美元符。