仓酷云
标题:
PHP教程之入手下手懂得 PHP V5 中的对象
[打印本页]
作者:
若天明
时间:
2015-2-4 00:16
标题:
PHP教程之入手下手懂得 PHP V5 中的对象
工具程序用来显示 Rasmus Lerdorf 的个人履历,以及统计网页流量。对象 本文描写 PHP V5 中对象和类的基本常识,从最根基的概念一向讲到承继,次要针对经历丰厚的面向对象法式员僧人未接触过对象的读者。 作为 PHP 法式员,您一定晓得变量和函数。但类和对象能够就是另外一回事。不界说单个类,就能够创立完善的体系。但即便您决意在本人的代码中不利用面向对象的编程,您仍能够需求懂得面向对象的编程。例如,假如利用第三方库,好比经由过程 PHP Extension and Application Repository (PEAR) 可使用的库,您将发明本人在实例化对象和挪用办法。
甚么是类和对象?
复杂地说,类 是一个由变量和办法构成的自力块或束。这些组件凡是联合完成单个义务或一组义务。在本文中,您将创立一个类,该类搜集了用于查询和填充由项和值构成的辞书的办法。
类可以直接用作组织数据和功效的复杂办法,就像一组函数和变量一样。但利用类可以疏忽它的存在。类可用于在内存中生成多个实例。如许的实例叫做对象。每一个对象可以会见一组不异的函数(在面向对象高低文中叫做办法)和变量(叫做特征或实例变量),但每一个变量的实践值在每一个对象中是分歧的。
思索脚色饰演游戏中的一个单位――好比坦克。类能够为坦克设置一组变量:进攻和防御才能,局限,安康情况,等等。该类也能够界说一组函数,个中包含 move() 和 attack()。当体系包括一个坦克类时,该类可用于生成数十个或数百个坦克对象,每一个对象都潜伏地具有本人的安康情况或局限特点。因而,类是用于生成对象的蓝图或模板。
了解类和对象最复杂的办法能够就是创立一些类和对象。
第一个类
可以用 class 关头字创立类。最复杂的情形是,类由关头字类、称号和代码块构成:
class Dictionary {
}
类名可以包括字母、数字和下划线字符的任何组合,但不克不及以数字打头。
上例中的 Dictionary 类虽然用途无限,但完整正当。那末若何利用该类来创立一些对象呢?
$obj1 = new Dictionary();
$obj2 = new Dictionary();
$obj3 = new Dictionary();
最少在模式上,实例化对象与挪用函数类似。关于函数挪用,必需供应圆括号。与函数一样,一些类需求您为其传递参数。您还必需利用 new 关头字。这就告知 PHP 引擎您但愿实例化一个新对象。然后,前往的对象可以存储在一个变量中以供未来利用。
属性
在类的主体中,可以声明叫做属性的特别变量。在 PHP V4 中,属性必需用关头字 var 挪用。这还是正当的语法,但次要是为了向后兼容。在 PHP V5 中,属性必需声明为 public、private 或 protected。可以在 关头字:在此咱们是不是可以有一点隐私?中浏览有关这些限制词的内容。但如今在例子中将一切属性声明为 public。清单 1 显示一个声了然两个属性的类。
清单 1. 声明两个属性的类
class Dictionary {
public $translations = array();
public $type ="En";
}
正如所看到的,可以同时声明属性并为其赋值。可以用 print_r() 函数疾速阅读一下对象的形态。清单 2 显示 Dictionary 对象如今具有更多成员。
清单 2. Dictionary 对象一览
$en = new Dictionary();
print_r( $en );
假如运转该剧本,将看到以下对象的输入:
Dictionary Object
(
[translations] => Array
(
)
[type] => En
)
可使用对象操作符 -> 会见公共对象属性。所以 $en->type 暗示由 $en 援用的 Dictionary 对象的 $type 属性。假如可以会见属性,就意味着可以设置和取得其值。清单 3 中的代码创立 Dictionary 类的两个实例 ―― 换言之,它实例化两个 Dictionary 对象。它更改一个对象的 $type 属性,并添加两个对象的翻译:
清单 3. 创立 Dictionary 类的两个实例
$en = new Dictionary();
$en->translations['TREE'] = "tree";
$fr = new Dictionary();
$fr->type = "Fr";
$fr->translations['TREE'] = "arbre";
foreach ( array( $en, $fr ) as $dict ) {
print "type: {$dict->type} ";
print "TREE: {$dict->translations['TREE']}\n";
}
该剧本输入以下
type: En TREE: tree
type: Fr TREE: arbre
所以 Dictionary 类如今对照有效了。单个对象可以存储分歧的键值组合,还有一个标记,该标记告知客户端有关这类 Dictionary 的具体信息。
虽然 Dictionary 类以后与联系关系数组的包装器相差无几,但这里有一些懂得对象功效的线索。今朝,咱们已可以很好地暗示咱们的示例数据了,如清单 4 所示。
清单 4. 示例数据
$en = array(
'translations'=>array( 'TREE' => 'tree' ),
'type'=>'En'
);
$fr = array(
'translations'=>array( 'TREE' => 'arbre' ),
'type'=>'Fr'
);
固然该数据布局完成了与 Dictionary 类不异的目标,但它没有供应布局的包管。假如传递 Dictionary 对象,咱们晓得它具有 $translations 属性。但假如是一个联系关系数据,则没有如许的包管。这个现实使得相似 $fr['translations']['TREE']; 的查询有些试试看,除非停止查询的代码肯定数组的发源。这是对象的重点:对象的类型是其特点的包管。
固然用对象存储数据有长处,然而您能够没有一点感到。对象可所以器材,但关头在于它们还可以干事情。
办法
复杂地说,办法是在类中声明的函数。它们凡是(但不老是)经由过程对象实例利用对象操作符来挪用的。清单 5 向 Dictionary 类中添加一个办法,并挪用该办法。
清单 5. 向 Dictionary 类中添加办法 class Dictionary {
public $translations = array();
public $type ="En";
function summarize() {
$ret = "Dictionary type: {$this->type}\n";
$ret .= "Terms: ".count( $this->translations )."\n";
return $ret;
}
}
$en = new Dictionary();
$en->translations['TREE'] = "tree";
print $en->summarize();
它供应以下输入: Dictionary type: En
Terms: 1
正如所看到的,声明 summarize() 办法与声明任何函数的体例一样,只不外它是在类中声明。summarize() 办法是经由过程 Dictionary 实例利用对象操作符挪用的。summarize() 函数会见属性来供应对象形态的简述。
注重关于本文来讲的一个新特征的用法。$this 伪变量供应了一种用于对象援用本人的属性和办法的机制。在对象内部,可使用句柄来会见它的元素(在本例子中是 $en)。在对象外部,则无此句柄,所以必需乞助于 $this。假如感觉 $this 有些利诱,则在代码中碰到它时,试着在思想顶用以后实例 交换它。
类凡是利用通用建模言语 (Universal Modeling Language,UML) 暗示在图表中。UML 的具体信息超越了本文的局限,但这类图表不外是一种可视化类关系的好办法。图 1 显示用 UML 暗示的 Dictionary 类。类名位于顶层,属性在两头,办法在底层。
登录/注册后可看大图
20072703849404.jpg
(4.91 KB, 下载次数: 38)
下载附件
保存到相册
PHP教程之入手下手懂得 PHP V5 中的对象
2015-2-4 00:16 上传
图 1. 利用 UML 显示 Dictionary 类
机关函数
PHP 引擎辨认很多“魔术”办法。假如界说了办法,则 PHP 引擎将在响应的情形产生时主动挪用这些办法。最常完成的办法是机关函数办法。PHP 引擎在实例化对象时挪用机关函数。对象的一切根基设置代码都放在机关函数中。在 PHP V4 中,经由过程声明与类同名的办法来创立机关函数。在 V5 中,回声明叫做 __construct() 的办法。清单 6 显示需求 DictionaryIO 对象的机关函数。
清单 6. 需求 DictionaryIO 对象的机关函数 class Dictionary {
public $translations = array();
public $type;
public $dictio;
function __construct( $type, DictionaryIO $dictio ) {
$this->type = $type;
$this->dictio=$dictio;
}
//...
要实例化 Dictionary 对象,需求将类型字符串和 DictionaryIO 对象传递给它的机关函数。机关函数利用这些参数来设置自有属性。以下代码显示可以若何实例化 Dictionary 对象: $en = new Dictionary( "En", new DictionaryIO() );
Dictionary 类如今比之前更平安。一切 Dictionary 对象都已用必须的参数初始化过了。 固然,还没法禁止一些人随后更改 $type 属性或将 $dictio 设置为空。可喜的是,PHP V5 可以匡助您完成这一功效。
关头字:在此咱们是不是可以有一点隐私? 后面已看到与属性声明相干的 public 关头字。该关头字暗示属性的可见度。现实上,属性的可见度可以设置为 public、private 和 protected。声明为 public 的属性可以在类内部写入和读取,声明为 private 的属性只在对象或类高低文中可见。声明为 protected 的属性只能在以后类及其子类的高低文中可见。(在 承继 局部将会看到这些内容起感化。)可使用 private 属性来真正锁定类。假如将属性声明为 private 并试图从类局限内部会见它(如清单 7 所示),PHP 引擎将抛出致命毛病。
清单 7. 试图从类局限内部会见属性 class Dictionary {
private $translations = array();
private $dictio;
private $type;
function __construct( $type, DictionaryIO $dictio ) {
$this->type = $type;
$this->dictio = $dictio;
}
// ...
}
$en = new Dictionary( "En", new DictionaryIO() );
$en->dictio = null;
输入以下: Fatal error: Cannot access private property
Dictionary::$dictio in...
普通来讲,应将大多半属性声明为 private,然后依据需求供应取得和设置这些属性的办法。如许就能够掌握类的接口,使一些数据只读,在将参数分派给属性之前对参数停止清算或过滤,并供应与对象交互的一套明白的划定规矩。 修正办法可见度的办法与修正属性可见度的办法一样,即在办法声明中添加 public、private 或 protected。假如类需求利用一些内部世界无需晓得的家务办理办法,则可以将其声明为 private。在清单 8 中,get() 办法为 Dictionary 类的用户供应了提取翻译的接口。该类还需求跟踪一切查询,因而供应了 private 办法 logQuery()。
清单 8. get() 办法为 Dictionary 类的用户供应了接口 function get( $term ) {
$value = $this->translations[$term];
$this->logQuery( $term, $value, "get" );
return $value;
}
private function logQuery( $term, $value, $kind ) {
// write log information
}
将 logQuery() 声明为 private 简化了公共接口,并且避免了类不恰当地挪用 logQuery()。与属性一样,测验考试从包括类内部挪用公有办法将招致致命毛病。
[1] [2] 下一页
刚开始觉得自己对这些多少有些基础,很简单,但是看了老师那么熟练的进行网页布局的时候,突然之间发现,其实,我的基础并没有自己想像的那么好,自己设计的页面其实并不好看,就连表格的边框为1像素都不会弄。
作者:
蒙在股里
时间:
2015-2-4 10:26
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
作者:
活着的死人
时间:
2015-2-6 14:49
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
作者:
小妖女
时间:
2015-2-7 18:11
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
作者:
透明
时间:
2015-2-11 16:14
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
作者:
再见西城
时间:
2015-2-14 15:57
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
作者:
柔情似水
时间:
2015-3-4 07:52
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
作者:
海妖
时间:
2015-3-11 03:47
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年 具体的记不清啦,囧。
作者:
不帅
时间:
2015-3-17 19:42
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
作者:
因胸联盟
时间:
2015-3-19 20:49
写的比较杂,因为我也是个新手,不当至于大家多多指正。
作者:
小女巫
时间:
2015-3-22 02:39
本文当是我的笔记啦,遇到的问题随时填充
作者:
只想知道
时间:
2015-3-23 10:13
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
作者:
admin
时间:
2015-3-31 13:23
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
作者:
金色的骷髅
时间:
2015-4-4 07:02
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
作者:
仓酷云
时间:
2015-4-22 02:32
爱上php,他也会爱上你。
作者:
爱飞
时间:
2015-4-25 10:11
兴趣是最好的老师,百度是最好的词典。
作者:
莫相离
时间:
2015-6-5 07:16
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
作者:
灵魂腐蚀
时间:
2015-6-6 07:41
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
作者:
精灵巫婆
时间:
2015-6-24 12:04
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
作者:
冷月葬花魂
时间:
2015-7-9 11:44
本文当是我的笔记啦,遇到的问题随时填充
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2