仓酷云

标题: PHP编程:第八节--会见体例 -- Classes and Obje... [打印本页]

作者: 逍遥一派    时间: 2015-2-4 00:21
标题: PHP编程:第八节--会见体例 -- Classes and Obje...
可以说你的马步已经扎的差不多了,接下来就要开始练把势的时候了,如果有条件的话,用笔或者打印一个简易的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基础。
作者: 爱飞    时间: 2015-2-4 12:32
Ps:以上纯属原创,如有雷同,纯属巧合
作者: 活着的死人    时间: 2015-2-7 19:15
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
作者: 金色的骷髅    时间: 2015-2-11 13:50
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者: 若相依    时间: 2015-3-2 13:32
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
作者: 变相怪杰    时间: 2015-3-4 15:59
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
作者: 透明    时间: 2015-3-11 20:16
基础有没有对学习php没有太大区别,关键是兴趣。
作者: 精灵巫婆    时间: 2015-3-13 03:09
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
作者: 飘灵儿    时间: 2015-3-20 11:11
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
作者: 飘飘悠悠    时间: 2015-3-20 11:11
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
作者: 小魔女    时间: 2015-3-23 11:20
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
作者: 简单生活    时间: 2015-4-4 23:54
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
作者: 灵魂腐蚀    时间: 2015-4-6 21:08
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
作者: 仓酷云    时间: 2015-4-12 19:37
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
作者: 逍遥一派    时间: 2015-4-16 11:09
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
作者: admin    时间: 2015-4-26 02:12
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
作者: 分手快乐    时间: 2015-4-30 14:08
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
作者: 小女巫    时间: 2015-6-11 20:30
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
作者: 不帅    时间: 2015-6-15 22:24
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
作者: 因胸联盟    时间: 2015-6-19 19:10
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
作者: 谁可相欹    时间: 2015-7-6 00:45
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2