|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
工具程序用来显示 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 类。类名位于顶层,属性在两头,办法在底层。
图 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像素都不会弄。 |
|