分类:
2008-04-15 16:28:47
PHP5的访问方式允许限制对类成员的访问。这是在PHP5中新增的功能,但在许多语言中都早已存在。有了访问方式,才能开发一个可靠的面向对象应用程序,并且构建可重用的面向对象类库。
像C++和一样,有三种访问方式: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); $ = 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"); } ?> |
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 public function equals($widget) { return(($this->name == $widget->name)AND($this->price == $widget->price)); } protected function getName() { return($this->name); } } class Thing extends Widget { private $color; public function setColor($color) { $this->color = $color; } public function getColor() { return($this->color); } public function getName() { return(parent::getName()); } } $w1 = new Widget('Cog', 5.00); $w2 = new Thing('Cog', 5.00); $w2->setColor('Yellow'); //TRUE (!) 结果仍然为真 if($w1->equals($w2)) { print("w1 and w2 are the same n"); } //print Cog 输出 Cog print($w2->getName()); ?> |