快速业务通道

PHP 5.0对象模型深度探索之访问方式

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-25

  PHP5的访问方式允许限制对类成员的访问。这是在PHP5中新增的功能,但在许多面向对象语言中都早已存在。有了访问方式,才能开发一个可靠的面向对象应用程序,并且构建可重用的面向对象类库。

  像C++和Java一样,PHP有三种访问方式:public,private和protected. 对于一个类成员的访问方式,可以是其中之一. 如果你没有指明访问方式,默认地访问方式为public. 你也可以为静态成员指明一种访问方式,将访问方式放在static关键字之前(如public static).

  Public成员可以被毫无限制地访问.类外部的任何代码都可以读写public属性. 你可以从脚本的任何地方调用一个public方法。在PHP的前几个版本中,所有方法和属性都是public, 这让人觉得对象就像是结构精巧的数组。

  Private(私有)成员只在类的内部可见,你不能在一个private属性所在的类方法之外改变或读取它的值。同样地,只有在同一个类中的方法可以调用一个private方法,继承的子类也不能访问父类中的private 成员。

  要注意,类中的任何成员和类的实例都可以访问private成员。看例子6.8,equals方法将两个widget进行比较.==运算符比较同一个类的两个对象,但这个例子中每个对象实例都有唯一的ID.equals方法只比较name和price。注意equals方法如何访问另一个Widget实例的private属性,Java和C都允许这样的操作。

  Listing 6.8 Private members

class Widget
{
 private $name;
 private $price;
 private $id;

 public function __construct($name, $price)
 {
  $this->name = $name;
  $this->price = floatval($price);
  $this->id = uniqid();
 }
 //checks if two widgets are the same 检查两个widget是否相同
 public function equals($widget)
 {
  return(($this->name == $widget->name)AND ($this->price == $widget->price));
 }
}
$w1 = new Widget(''Cog'', 5.00);
$w2 = new Widget(''Cog'', 5.00);
$w3 = new Widget(''Gear'', 7.00);

//TRUE
if($w1->equals($w2))
{
 print("w1 and w2 are the same n");
}

//FALSE
if($w1->equals($w3))
{
print("w1 and w3 are the same n");
}

//FALSE, == includes id in comparison
if($w1 == $w2) //不等,因为ID不同
{
print("w1 and w2 are the same n");
}
?>

  如果你对面向对象编程不熟悉,你可能想知道用private成员的目的是什么. 你可以回忆一下封装和耦合的想法,这在本章开头我们有讨论过。Private成员有助于封装数据,他们可以隐藏在一个类内部而不被类外部的代码接触到,同时他们还有助于实现松散的耦合. 如果数据结构外的代码不能直接访问内部属性,那么就不会产生一个隐性的关联性。

  当然,大部分private属性仍然可以被外部代码共享. 解决方法是用一对public方法,一个是get(获取属性的值),另一个是set(设置属性的值)。构造函数也接受属性的初始值. 这使得成员间的交流通过一个狭窄的,经过良好限定的接口来进行. 这也提供改变传递给方法的值的机会,注意在例子6.8中,构造函数如何强制使price成为一个float数(floadval())。

  Protected(受保护的) 成员能被同个类中的所有方法和继承出的类的中所有方法访问到。Public属性有违封装的精神,因为它们允许子类依赖于一个特定的属性来书写,protected方法则不会带来这方面的担忧,一个使用protected方法的子类需要很清楚它的父类的结构才行。

  例子6.9由例子6.8改进而得到,包含了一个Widget的子类Thing。注意Widget现在有一个叫作getName的protected方法. 如果Widget的实例试图调用protected方法将会出错: $w1->getName()产生了一个错误, 但子类Thing中的getName方法可以调用这个

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号