第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 相关文章推荐
PHP下MAIL的另一解决方案
Oct 09 PHP
php array_slice函数的使用以及参数详解
Aug 30 PHP
Discuz 6.0+ 批量注册用户名
Sep 13 PHP
PHP+FastCGI+Nginx配置PHP运行环境
Aug 07 PHP
PHP+FFMPEG实现将视频自动转码成H264标准Mp4文件
Sep 24 PHP
php用户注册时常用的检验函数实例总结
Dec 22 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
Jan 22 PHP
php字符串过滤与替换小结
Jan 26 PHP
Zend Framework框架路由机制代码分析
Mar 22 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 PHP
实现php删除链表中重复的结点
Sep 27 PHP
php实现通过stomp协议连接ActiveMQ操作示例
Feb 23 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小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
通过location.replace禁止浏览器后退防止重复提交
2014/09/04 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
JavaScript中的splice方法用法详解
2016/07/20 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
浅谈JavaScript_DOM学习篇_图片切换小案例
2019/03/19 Javascript
js String.prototype.trim字符去前后空格的扩展
2020/08/23 Javascript
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
urllib2自定义opener详解
2014/02/07 Python
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
python分割列表(list)的方法示例
2017/05/07 Python
在Pycharm中项目解释器与环境变量的设置方法
2018/10/29 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
关于Python Tkinter Button控件command传参问题的解决方式
2020/03/04 Python
雅诗兰黛美国官网:Estee Lauder美国
2016/07/21 全球购物
Turnbull & Asser官网:英国皇室御用的顶级定制衬衫
2019/01/31 全球购物
在线课程:Skillshare
2019/04/02 全球购物
国际花店:Pickup Flowers
2020/04/10 全球购物
行政助理求职自荐信
2013/10/26 职场文书
村优秀党员事迹材料
2014/01/15 职场文书
年度考核自我鉴定
2014/03/19 职场文书
年检委托书
2014/08/30 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
2014年英语工作总结
2014/12/20 职场文书
致我们终将逝去的青春观后感
2015/06/10 职场文书
关于保护环境的建议书
2019/06/24 职场文书
zabbix agent2 监控oracle数据库的方法
2021/05/13 Oracle
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL