|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
可以说你的马步已经扎的差不多了,接下来就要开始练把势的时候了,如果有条件的话,用笔或者打印一个简易的PHP手册在身上,时不时的摸出来看看,记得,去WC也不能放过(^2^)。object|php5|会见 /*
+-------------------------------------------------------------------------------+
| = 本文为Haohappy读<<Core PHP Programming>>
| = 中Classes and Objects一章的笔记
| = 翻译为主+团体心得
| = 为防止能够产生的不用要的费事请勿转载,感谢
| = 接待品评斧正,但愿和一切PHP喜好者配合前进!
+-------------------------------------------------------------------------------+
*/
第八节--会见体例
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
<?php
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<br>n");
}
//FALSE
if($w1->equals($w3))
{
print("w1 and w3 are the same<br>n");
}
//FALSE, == includes id in comparison
if($w1 == $w2) //不等,由于ID分歧
{
print("w1 and w2 are the same<br>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办法可以挪用这个protected办法.固然关于证实Widget::getName办法是protected,这个例子显得过于复杂. 在实践情形下,利用protected办法要依附于对对象的外部布局的了解.
Listing 6.9 Protected members
<?php
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 (still!) 了局依然为真
if($w1->equals($w2))
{
print("w1 and w2 are the same<br>n");
}
//print Cog 输入 Cog
print($w2->getName());
?>
一个子类能够改动经由过程覆写父类办法来改动办法的会见体例,虽然如斯,依然有一些限制. 假如你覆写了一个public类成员,他子类中必需坚持public. 假如你覆写了一个protected成员,它可坚持protected或酿成public.Private成员依然只在以后类中可见. 声明一个与父类的private成员同名的成员将复杂地在以后类中创立一个与本来分歧的成员. 因而,在手艺上你不克不及覆写一个private成员.
Final关头字是限制会见成员办法的另外一个办法. 子类不克不及覆写父类中标识为final的办法. Final关头字不克不及用于属性.
//haohappy注:PHP5的面向对象模子依然不敷完美,如final不像Java中那样对Data,Method乃至Class都可以用. 培训的第一阶段,学习的是HTML/CSS/JavaScript基础。 |
|