Archives for 二月 2009

PHP的魔术函数们

PHP5带给我们的面向对象的变化是伟大的是空前的是胜利的,就像所有的两会一样。尤其是它提供给我们的那些魔术函数,更是像桂林山水一样令人流连忘返。
1. __construct() 构造函数

这是PHP默认的构造函数,它并不能主动被程序调用只能是在对象创建的时候被自动调用。同时为了向下兼容,PHP5也支持与类同名的构造函数,值得一提的是当两种构造函数同时存在的时候,__construct()将不会被调用。
2. __destruct() 析构函数
3. __get($key)
当读取一个不存在的属性时调用。

< ?php
class Obj {
public function __get($key) {
echo $key.’ is not exsit’;
}
}
$obj = new Obj();
echo $obj->varnotexist;
?>

上面的这段程序将会输出:varnotexist is not exist。
4. __set($key, value)
与__get($key)类似,而它是在修改一个不存在的属性时被调用。
5. __call($key, $args)
与__get($key)类似,而它是在调用一个不存在的方法时被调用。
6. __toString()
在试图打印一个对象时被调用

< ?php
class Obj {
private $a;
private $b;
public function __construct() {
$this->a = ‘a’;
$this->b = ‘b’;
}
public function __toString() {
echo $this->a.’|’.$this->b;
}
}
$obj = new Obj();
echo $obj;
?>

此时程序会打印:a|b
7. __clone()
当对象被克隆的时候被打印。

< ?php
class Obj {
public function __clone() {
echo [...]

云计算:梦想和“共产主义”

这篇文章要从一个叫做google的公司谈起。这是一个伟大的公司,甚至是一个像神一样的公司,他总是在安排着互联网和数据的未来,不管是无意的还是计划的。他有着我喜欢的东西,技术创新和梦想。
现在,这个一直都充满了梦想的公司又有了一个新的梦想。去年差不多也是这个时候,一个叫做施密特的人来了中国,这个人是google的CEO,他来到一个狭小的会议室里,他告诉人们,就像一个预言家,“未来的互联网发展,最重要的一个改变就是从个人计算机的架构逐渐转向云计算”。
云计算?google告诉人们,“人们对计算机的使用正在从桌面为中心转向以网络为中心”。
那么什么是云计算呢,为了找到一个答案我去了wiki。
云计算(cloud computing,台湾译作云端运算),是分布式计算技术的一种,其最基本的概念,是透过网络将庞大的计算处理程序自动分拆成无数个较小的子程序,再交由多部服务器所组成的庞大系统经搜寻、计算分析之后将处理结果回传给用户。透过这项技术,网络服务提供者可以在数秒之内,达成处理数以千万计甚至亿计的信息,达到和“超级计算机”同样强大效能的网络服务。
同时我们还注意到一个叫做网格计算的概念,同样是wiki。
网格计算(Grid Computing),通过利用大量异构计算机(通常为桌面)的未用资源(CPU周期和磁盘存储),将其作为嵌入在分布式电信基础设施中的一个虚拟的计算机集群,为解决大规模的计算问题提供了一个模型。网格计算的焦点放在支持跨管理域计算的能力,这使它与传统的计算机集群或传统的分布式计算相区别。
云计算是由网格计算发展过来的。而云计算去替代网格计算,即是说服务信息则并不是一个桌面PC上,而是存在网络中。
云计算显而易见的有这样一个好处,如果有一天google的数据中心大火,消防员扑救不及,所有的服务器毁于一旦,虽然它们可能被装上了防火墙,但是也于事无补了。这时候我们多么希望有这样一个银行,我们把数据存到银行里,让我们不要把所有的数据都放在一个地方。云计算就是这样的一个银行。
前几天我女朋友丢了手机,手机号码都没有,我不禁感慨,云计算应该快一点。
正是因为云计算的特质,使得它必须有一个绝对开放的标准,业界不能有独裁,必须相互尊重和信任,否则这事就云不起来。就像共产主义,数据的共产主义。所以在这里我要批评DELL,批评DELL的原因不光是因为它的售后,虽然它的售后真的很烂,同时还因为他正在申请Cloud Computing商标。

PHP的MVC

PHP的面向对象的特性越来越完善使得,PHP能够更好的从代码结构上进行系统的封装。当一个系统,其中有大量的逻辑存在与流程控制之中,MVC的优势就开始渐渐体现。
MVC的模式要求对系统的总体结构在逻辑上分成三部分

View(界面/视图):用户界面,网页模板
Controller(控制/流程):系统业务流程
Model(模型/逻辑):系统设计中的一些基础类和数据操作

拿一个简单的登陆流程当例子
最常见的登陆流程是这样的,我们假设我们的网站根目录下有一个叫做/user的文件夹来存放所有与用户操作相关的页面,其中有一个页面是/user/login.php。而我们的根目录上有文件/index.php作为网站的首页。当我们打开/index.php的时候进行判断,如果未登陆则跳转到/user/login.php进行登陆,如果成功则跳回/index.php,否则跳到/error.php。
流程图如下:

根据文字和流程图的描述,我们可以开始编码了。
/index.php

< ?php
//…
$userLib = new userLib();
if (!$userLib->chkLogin()) header(’location: /user/login.php’);
//…
?>

/user/login.php

< ?php
//…
if (isset($_POST[’submit’])) {
$userLib = new userLib();
$succ = $userLib->login($_POST[’name’], $_POST[’pass’]);
header(’location: ‘.($succ?’/index.php’:'/error.php’));
}
$tpl = new Template();
$tpl->show(’user_login.tpl’);
?>

/error.php

< ?php
$tpl = new Template();
$tpl->show(’error.tpl’);
?>

关于Controller
就像上面三段程序就是系统中的controller,他们并不执行什么具体的操作也不输出,只是不断调用Model中的不同方法来处理逻辑。
关于Model
Model则是另一个重要的话题,那便是在PHP中如何更好的类封装。但是在这里我们看到的在/user/login.php中被使用的userLib类和Template类都是系统中的model,他们处理具体的数据操作,并返回值来用controller使用。
从PHP5开始,我们有了接口,从PHP5.3开始,虽然还没有Release,我们有了namespace,PHP真正面向对象的时代已经到来了。这时候我们已经没有必要再去讨论我们应该把userLib写成userLib.function.php还是userLib.class.php,我们要做的只是更好的封装和理解各model之间的从属逻辑结构。更好的设计model中的各个库来保障系统的运行效率和维护效率。
关于View
View的部分往往被看作是前段设计人员的工作,但是作为PHP的程序员也必须关注这一话题。
对于view和controller来说,所有的页面都是围绕着流程来产生的。而controller有时也担负着处理页面与页面之间相互传递的工作。我们要确定页面的元素,特别是表单元素,并通过表单元素来处理用户提交的数据,其次我们还要确定PHP传递给模板的变量,然后才能交付给设计人员。
最后
我们还经常用来一些常用的文件夹名和文件名来暗示程序的阅读者,特别是新的阅读者,该文件夹或文件的作用。这也是相当重要的。