若天明 发表于 2015-2-4 00:16:18

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
(
    => Array
      (
      )
    => 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 类。类名位于顶层,属性在两头,办法在底层。

图 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像素都不会弄。

蒙在股里 发表于 2015-2-4 10:26:44

在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、

活着的死人 发表于 2015-2-6 14:49:10

写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。

小妖女 发表于 2015-2-7 18:11:14

多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。

透明 发表于 2015-2-11 16:14:18

学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql

再见西城 发表于 2015-2-14 15:57:21

我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。

柔情似水 发表于 2015-3-4 07:52:13

我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。

海妖 发表于 2015-3-11 03:47:41

说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。

不帅 发表于 2015-3-17 19:42:01

有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。

因胸联盟 发表于 2015-3-19 20:49:49

写的比较杂,因为我也是个新手,不当至于大家多多指正。

小女巫 发表于 2015-3-22 02:39:35

本文当是我的笔记啦,遇到的问题随时填充

只想知道 发表于 2015-3-23 10:13:31

说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。

admin 发表于 2015-3-31 13:23:39

如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,

金色的骷髅 发表于 2015-4-4 07:02:53

这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。

仓酷云 发表于 2015-4-22 02:32:16

爱上php,他也会爱上你。

爱飞 发表于 2015-4-25 10:11:30

兴趣是最好的老师,百度是最好的词典。

莫相离 发表于 2015-6-5 07:16:20

因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax

灵魂腐蚀 发表于 2015-6-6 07:41:45

对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。

精灵巫婆 发表于 2015-6-24 12:04:08

在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。

冷月葬花魂 发表于 2015-7-9 11:44:52

本文当是我的笔记啦,遇到的问题随时填充
页: [1]
查看完整版本: PHP教程之入手下手懂得 PHP V5 中的对象