PHP网页编程之php的类和对象(翻译:midiguy)
理解动态语言的概念,运做机制,熟悉PHP语法对象 /**********************************************************翻译:midiguy
翻译毛病的地方还请列位指出
E-Mail:midiguy@263.net
QQ:5149927
***********************************************************/
面向对象法式设计的来历得自于人们对待德律风、汽车这些物体的设法。良多法式设计者在会商面向对象法式设计的时分喜好用“包装”或“承继”这些让常人困惑不解的词语。咱们可以把面向对象这个概念和天然物体接洽起往来来往了解它的道理。让咱们拿交通东西来做个例如。
设计图
为了构建交通东西咱们需求一份设计图。这份设计图可以界说交通东西的车轮的数目、色彩等等。一种交通东西经由过程必定的属性和行动来界说。在PHP中这些属性和行动就叫做变量和办法(函数)。描写一个对象的一组变量和办法就组成了一个“类”。
扩大的设计图
由于有各类分歧类型的交通东西,好比汽车、自行车和摩托车。咱们需求一种办法,它可让咱们为各类交通东西增添新功效的同时也能够利用交通东西的普通性的办法,换句话说,由于“履带”要用在一切类型的交通东西下面,咱们不需求再从头编写这类办法。咱们可以“承继”来完成这个功效。假设咱们创立一个从“交通东西”承继过去的“汽车”的类,一切在“交通东西”类中的办法将被“汽车”类承继。
笼统
笼统的目标只存眷于一个庞杂对象的局部性质,为懂得决你的成绩需求你去构建一个精细精美的对象。你可以很轻易的失掉一辆汽车不计其数的属性,然而假如你需求设计一个法式去保留一个汽车经销商的目次,那末你应当只需求一个包括10多个属性的子集。如许一辆汽车被笼统成一个合适编程利用的汽车对象.
包装
包装可以埋没一组办法的内容东西机制而只供应给用户一个界说优秀的托言。在面向对象法式编程中,包装使得对象的数据布局和办法组合在一同。最轻易了解“包装”的体例可以参考德律风机。现今花费者可以购置林林总总的德律风机,固然这些德律风机的外部设计办法能够分歧,然而一切这些德律风机械都可以经由过程一个尺度的公共接口通信。这就是包装的思惟.
一个类可以界说新数据类型。PHP自己具有变量类型,好比字符串变量和浮点类型变量。然而经由过程类你可以设计本人的数据类型好比船、用户参考手册和数据库等等。一个类界说这类数据类型的属性和行动(成员变量和办法)。上面的例子显示若何界说一个包括属性和办法的类。
让咱们看一下咱们的交通东西的实践的例子
<?php
/*
** 若何界说一个类
*/
class Class_Name
{
}
?>
----------交通东西类------------
<?php
class vehicle
{
/*
** 属性
*/
var $property1;
var $property2;
var $property3;
/*
** 办法
*/
function setTires($type)
{
if ($type == \"Firestone\")
{
$this->property1 = \"Must be a Ford SUV\";
}
}
function color($col)
{
$this->property2 = $col;
}
}
?>
若何利用界说好的类
类界说好今后,咱们就能够创立它的实例。为了利用方才的例子,咱们鄙人面创立一个“交通东西”类的实例。
<?php
$myCar = new vehicle();
$myCar->setTires(\"Firestone\");
?>
利用类中的变量
最大的分歧点在于利用一个对象和对象具有的值的品种。一个字符串变量却是很轻易了解,由于它具有一个值。
$myStr = \"PHP stands for... uh.. i forget\";
但是一个对象可以具有任何品种的值
$myCar->year = 1988;
$myCar->value = 813.77;
$myCar->hasAirbag = false;
$myCar->color = \"periwinkle\";
在PHP中,一个对象的一切成员变量默许是私有的。没有举措可以强制一个对象的会见属性,然而假如但愿一个变量是公有变量的话,咱们可以用一种强调的体例来完成。
$this pointer
假如你想挪用一个对象的办法,你可使用 \'$this\'来挪用此对象指定实例的成员变量。刚入手下手,你能够对这个有点不睬解,让咱们来看个例子。起首,假定你有两辆汽车。
$myCar = new vehicle();
$spousesCar = new vehicle();
如今你有了统一个类的两个对象。你能够也听过如许的说法,“如今你有了统一个用户界说变量类型的两个综合变量”。 These are just different ways of talking about the same OOP concepts.
每一个变量,$myCar 和 $spousesCar, 具有这个类的自力的一套属性。
$myCar->property1;
//这两个是分歧的
$spousesCar->property1;
//即便property1只在类界说中呈现一次。你必需清晰,它仅仅是为了组成一个新数据类型而设计的。
然而在这个类内只要一个setTires()函数。当咱们利用上面的语句的时分,它若何懂得是谁挪用了它呢?
$myCar->setTires(\"Firestone\");
呵呵,如今这个$this就起感化了。在一个指定对象挪用类外部的函数时分,这个对象就主动作为一个参数传递。用$this是出于便利的需求。看看上面的例子你应当可以了解。
$myCar->setTires(\"Firestone\");
/*
** 办法
*/
function setTires($type)
{
if ($type == \"Firestone\")
{
$this->property1 = \"Must be a Ford SUV\";
}
}
//$this 代表 $myCar 变量
$spousesCar->setTires(\"Goodyear\");
/*
** 办法
*/
function setTires($type)
{
if ($type == \"Firestone\")
{
$this->property1 = \"Must be a Ford SUV\";
}
}
//如今它就代表 $spousesCar.
创立一个机关器
在一个类的实例被创立今后,假如开辟者但愿能有一个“默许”的函数可以挪用,该怎样办呢?这就是要用到“机关器”
其实你只需求复杂的将机关器的名字界说为类的名字就能够完成。如今你每次创立这个类的对象的时分,这个机关器办法将被挪用。
类的承继
咱们之前说过,一个类可以承继另外一个类;然而咱们若何使用这类功效呢?在一个体系中,很多变量起不异的感化,仅仅一些的感化有些分歧,承继长短常有效的。承继是一种办法,经由过程这类办法,一个类可以用别的一个类作为模板来创立本身。承继类将把在被承继类中界说的成员变量和办法承继过去。经由过程延长或承继过去的类叫做子类。被承继类的叫做超类或父类。如许可使类之间的感化分歧而且不会影响现存的代码.如今让咱们看个例子。
class Airplane {
var $tirePressure;
var $fuelLevel;
var $passengerLimit;
function takeOff() {
...
}
function land() {
...
}
function preFlightCheck() {}
}
class sevenFortySeven extends Airplane {
function preFlightCheck() {
//747飞机腾飞准备任务
}
}
class biplane extends Airplane {
function preFlightCheck() {
//双翼飞机腾飞准备任务
}
}
$planeArray[] = new biplane();
$planeArray[] = new sevenFortySeven();
$planeArray[] = new sevenFortySeven();
$planeArray[] = new biplane();
for ($x = 0; $x < count($planeArray); $x++) {
$currentPlane = $planeArray[$x];
if ($currentPlane->preFlightCheck() ) {
$currentPlane->takeOff();
//不论是甚么型号的飞机,它城市晓得它要腾飞了
} else {
print \"飞机出了点成绩.\";
}
}
类的静态办法
当处置一个类的对象的时分,你能够放一个对这个对象有效的函数在这个类中,而不是再另写一个特别类。如许的函数叫做静态办法。一个优秀
类应当包括一切有效的(utility)函数。
class Money {
function addTax($amount,$percent){
return $amount + ($amount * $percent);
}
function convertCurrency ($amount, $from, $to) {
//在数据库中查找一个从$from变换到$to的转换率
return $amount * $rate;
}
}
$total = Money::addTax($subtotal,6.5);
$yen = Money::convertCurrency ($usd, \"america\", \"japan\");
办法工场(Factory Methods)
有时分将代码分红一个一个的块去创立对象很有优点。你可使用大批的类,也能够利用一个类来决意对象利用工场类(factory methods)。
工场类可以匡助你无效的组织你的代码。普通情形下,工场类包括一个对照大的转换声明而且前往一个适合的对象的实例。让咱们看个有关C扫描
仪的例子。有一个Item根基类, 然而也有良多子类,这些子类可觉得各类各样的产物挪用(好比电子类的, 服装网类的...)。
Class Item {
var $price;
var $isTaxable;
var $properties;
function getNewItem($upc) {
//毗连到数据库
//查找$upc的类型并将其放入$type变量中
//查找$upc的属性并将其放如$attrib变量中;
return new $type($attrib);
}
}
class produce extends Item {
function produce ($a) {
$this->properties = $a;
}
function requiresScale() {
return true;
}
}
class hardlines extends Item {
function hardlines ($a) {
$this->properties = $a;
}
function requiresSclae() {
return false;
}
}
while ( $upc = $scanner->next_code() ) { //假定有一个扫描仪的类
$z = Item::getNewItem($upc);
if ($z->requiresScale() ) {
echo \"需求尺寸!\";
}
$subtotal += $z->properties[\"price\"];
}
既然选择了PHP,就要坚持学下去!大家有没有问自己为什么会选择学习PHP呢?就我个人而言,完全是因为兴趣,因为我的专业和计算机完全无关,但是就是对编程很赶兴趣,尤其对网络编程、web开发特别赶兴趣。 我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能: 当然这种网站的会员费就几十块钱。 如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了, 装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。 对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。 实践是检验自己会不会的真理。 真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎, 微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。 其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎 兴趣是最好的老师,百度是最好的词典。 有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。 曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线\\\\\\\'_\\\\\\\' ; 建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。 说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。 我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。 遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。 不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。 曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线\\\\\\\'_\\\\\\\' ;
页:
[1]