第1次亲密接触PHP5(1)


Posted in PHP onOctober 09, 2006

文章来源:PHPBuilder.com
原作者:Luis Argerich
翻译:erquan
erquan注:本人现还未来得及体验PHP5,只是翻译一篇老外的文章。
以下均由erquan翻译,第1次作这些的事情希望没有误导大家。有些不准的地方请谅解。
大家看这样的行不行,如果行的话,偶就翻译完,不行就翻译了,免得误导了大家,也累哦。。。。:)
转贴时请注明文章来源,谢谢:)

PHP5的正式版还没发布,但我们可以学习、体验下开发版给我们带来的PHP新特性。
本文将集中介绍以下3大PHP5新功能:
* 新对象模式
* 结构化异常处理
* 名称空间

在正式开始之前,请注意:
*文章中的部分例子用PHP4的方法实现,只是为了增强文章的可读性
*本文所描述的新特性可能会与正式版特性有出入,请以正式版本为准。

* 新对象模式

PHP5新的对象模式在PHP4的基础上做了很大的"升级",你看起来会很像JAVA:(。
下面的一些文字将对它做一些简单介绍,并且附有小例子让您开始体验PHP5的新特性
come on~~:)

* 构造函数 和 析构函数
* 对象的引用
* 克隆对象
* 对象的3种模式:私有、公共和受保护
* 接口
* 虚拟类
* __call()
* __set()和__get()
* 静态成员

构造函数 和 析构函数

在PHP4中,和类名一样的函数被默认为该类的构造器,并且在PHP4没有析构函数的概念。(二泉 注:这点和JAVA一样)
但从PHP5开始,构造函数被统一命名为 __construct,而且有了析构函数:__destruct(二泉 注:这点却和Delphi一样,可见PHP5吸收了众多的成熟的OO思想,可C可贺~~):
例1:构造函数和析构函数

<?php
class foo {
  var $x;

  function __construct($x) {
    $this->x = $x;
  }

  function display() {
    print($this->x);
  }

  function __destruct() {
    print("bye bye");
  }
}

$o1 = new foo(4);
$o1->display();
?>

运行完你将看到输出了"bye bye",这是因为类在终止的时候调用了__destruct()析构函数~~

对象的引用

正如你所知道的一样,在PHP4中,对一个函数或方法传递一个变量时,实际上是传递了一个copy,除非你用了传址符&来声明
你在做一个变量的引用。在PHP5中,对象总是以引用的方式被指定:
例2:对象的引用

<?php
class foo {
  var $x;

  function setX($x) {
    $this->x = $x;
  }

  function getX() {
    return $this->x;
  }
}

$o1 = new foo;
$o1->setX(4);
$o2 = $o1;
$o1->setX(5);
if($o1->getX() == $o2->getX()) print("Oh my god!");
?>

(二泉 注:你将看到"Oh my god!"的输出)
克隆对象

如上,如果有时不想得到对象的引用而想用copy时,怎么办?在PHP5提供的 __clone 方法中实现:
例3:克隆对象

<?php
class foo {
  var $x;

  function setX($x) {
    $this->x = $x;
  }

  function getX() {
    return $this->x;
  }
}

$o1 = new foo;
$o1->setX(4);
$o2 = $o1->__clone();
$o1->setX(5);

if($o1->getX() != $o2->getX()) print("Copies are independant");
?>

克隆对象的方法在已被应用到很多语言中,所以你不必担心它的性能:)。

Private, Public 和 Protected

在PHP4中,你可以在对象的外面操作它任意的方法和变量--因为方法和变量是公用的。在PHP5引用了3种模式来控制
对变量、方法的控制权限:Public(公用的)、Protected(受保护)和Private(私有)

Public:方法和变量可以在任意的时候被访问到
Private:只能在类的内部被访问,子类也不能访问
Protected:只能在类的内部、子类中被访问

例子4:Public, protected and private

<?php
class foo {
  private $x;

  public function public_foo() {
    print("I'm public");
  }

  protected function protected_foo() {
    $this->private_foo(); //Ok because we are in the same class we can call private methods
    print("I'm protected");
  }

  private function private_foo() {
    $this->x = 3;
    print("I'm private");
  }
}

class foo2 extends foo {
  public function display() {
    $this->protected_foo();
    $this->public_foo();
    // $this->private_foo();  // Invalid! the function is private in the base class
  }
}

$x = new foo();
$x->public_foo();
//$x->protected_foo();  //Invalid cannot call protected methods outside the class and derived classes
//$x->private_foo();    //Invalid private methods can only be used inside the class

$x2 = new foo2();
$x2->display();
?>

提示:变量总是私有形式,直接访问一个私有变量并不是一个好的OOP思想,应该用其他的方法来实现 set/get 的功能

接口

正如你知道的一样,在 PHP4 中实现继承的语法是"class foo extends parent"。无论在PHP4 还是在 PHP5 中,都不支持多重继承即只能从一个类往下继承。 PHP5中的"接口"是这样的一种特殊的类:它并不具体实现某个方法,只是用来定义方法的名称和拥有的元素,然后通过关键字将它们一起引用并实现具体的动作。

Example 5: 接口
<?php
interface displayable {
  function display();
}

interface printable {
  function doprint();
}

class foo implements displayable,printable {
  function display() {
    // code
  }

  function doprint() {
    // code
  }
}
?>

这对代码的阅读性和理解性是非常有帮助的:读到该类时,你就知道foo包含了接口displayable和printable,而且一定有print()(二泉 注:应该是doprint())方法和display()方法。不必知道它们内部是如何实现就可轻松操作它们只要你看到foo的声明。

虚拟类

虚拟类是一种不能被实例化的类,它可以像超类一样,可以定义方法和变量。
在虚拟类中还可以定义虚拟的方法,而且在该方法也不能在该类是被实现,但必须在其子类中被实现

Example 6: 虚拟类

<?php
abstract class foo {
  protected $x;

  abstract function display();

  function setX($x) {
    $this->x = $x;
  }
}

class foo2 extends foo {
  function display() {
    // Code
  }
}
?>

__call()方法

在PHP5时,如果你定义了 __call()方法,当你试图访问类中一个不存在的变量或方法时,__call()就会被自动调用:
Example 7: __call

<?php
class foo {

  function __call($name,$arguments) {
    print("Did you call me? I'm $name!");
  }
}

$x = new foo();
$x->doStuff();
$x->fancy_stuff();
?>

这个特殊的方法被习惯用来实现"方法重载",因为你依靠一个私有参数来实现并检查这个参数:
Exampe 8:  __call 实现方法重载

<?php
class Magic {

  function __call($name,$arguments) {
    if($name=='foo') {
      if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
      if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
    }
  }

  private function foo_for_int($x) {
    print("oh an int!");
  }

  private function foo_for_string($x) {
    print("oh a string!");
  }
}

$x = new Magic();
$x->foo(3);
$x->foo("3");
?>

__set()方法 和 __get()方法

当访问或设置一个未定义的变量时,这两个方法将被调用:

Example 9: __set and __get

<?php
class foo {

  function __set($name,$val) {
    print("Hello, you tried to put $val in $name");
  }

  function __get($name) {
    print("Hey you asked for $name");
  }
}

$x = new foo();
$x->bar = 3;
print($x->winky_winky);
?>

PHP 相关文章推荐
PHP4与PHP5的时间格式问题
Feb 17 PHP
PHP读取ACCESS数据到MYSQL的代码
May 11 PHP
简单的PHP缓存设计实现代码
Sep 30 PHP
php实现utf-8和GB2312编码相互转换函数代码
Feb 07 PHP
解析使用ThinkPHP应该掌握的调试手段
Jun 20 PHP
C# WinForm中实现快捷键自定义设置实例
Jan 23 PHP
PHP中的traits简单使用实例
May 13 PHP
php判断访问IP的方法
Jun 19 PHP
WordPress中查询文章的循环Loop结构及用法分析
Dec 17 PHP
教你php如何实现验证码
Jan 20 PHP
PHP使用Nginx实现反向代理
Sep 20 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
Oct 09 #PHP
文件上传类
Oct 09 #PHP
多文件上载系统完整版
Oct 09 #PHP
php中文件上传的安全问题
Oct 09 #PHP
ftp类(example.php)
Oct 09 #PHP
PHP概述.
Oct 09 #PHP
PHP安装问题
Oct 09 #PHP
You might like
php smarty的预保留变量总结
2008/12/04 PHP
Firefox div高度自适应
2009/04/28 Javascript
精通Javascript系列之Javascript基础篇
2011/06/07 Javascript
JQuery动画和停止动画实例代码
2013/03/01 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
JS实现同时搜索百度和必应的方法
2015/01/27 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
javascript中SetInterval与setTimeout的定时器用法
2015/08/24 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
canvas实现刮刮卡效果
2017/03/14 Javascript
node.js 抓取代理ip实例代码
2017/04/30 Javascript
jquery dataTable 获取某行数据
2017/05/05 jQuery
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
小程序Request的另类用法详解
2019/08/09 Javascript
[02:20]DOTA2英雄基础教程 黑暗贤者
2013/12/19 DOTA
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
浅析Python中yield关键词的作用与用法
2016/11/29 Python
python算法表示概念扫盲教程
2017/04/13 Python
Python正则捕获操作示例
2017/08/19 Python
详解python中的 is 操作符
2017/12/26 Python
深入浅析python 中的匿名函数
2018/05/21 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
tensorflow常用函数API介绍
2020/04/19 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
python实现数字炸弹游戏程序
2020/07/17 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
日本最大美瞳直送网:Morecontact(中文)
2019/04/03 全球购物
2013年保送生自荐信格式
2013/11/20 职场文书
电子商务专业推荐信范文
2013/12/02 职场文书
党风廉正建设个人工作总结
2015/03/06 职场文书
关于感恩的歌曲整理(8首)
2019/08/14 职场文书
导游词之台湾安平古堡
2019/12/25 职场文书