分类目录归档:图片/文字

向大家推荐前几天刚下载的免费杀毒软件avast! free版

之前用了近一年多的免费杀软小红伞。

小红伞的杀毒、监控能力还是挺强的,但总觉得操作起来不够人性化,老是误报

最近看到avast!出了5.0最新的beta版,就下载下来用用,第一感觉就是界面比以前的老版本漂亮了不少,

并且是官方中文版的,相对于英文版的小红伞,一下就感觉亲切多了。

目前最新的avast免费版是5.0 beta2

下载地址:http://dl.pconline.com.cn/html_2/1/66/id=10585&pn=0.html

 

qq截图未命名.png

南昌的冰糖发糕,网上找的最新配方,以前做的太粘手了

从新浪博客 香水百合 找到的配方,找个空试试。

之前也自己琢磨过怎么做,但不知道是水放多了还是怎么的,太湿了,非常的粘手。

这次十一回南昌都没吃过南昌的冰糖发糕,好像没得卖了。只有自己捣鼓着做,好一饱口福。

原料:1.大米2斤

 2.白糖一斤  3.水2斤4两
大米洗净泡水5-6小时(室温25度左右,室温低可延长时间)
泡好米后,加水分次,研磨成细微粒米浆。(我用打碎机打碎,效果也不错,细微状态为,用手指捻不出颗粒为好。
放白糖搅拌米浆均匀,2小时后蒸制(可放入金属类盘蒸,时间20分钟,根据厚度,增加时间)

Zend Studio 7.0.2下载

一个屡获大奖的专业 PHP 集成开发环境,具备功能强大的专业编辑工具和调试工具,支持PHP语法加亮显示,支持语法自动填充功能,支持书签功能,支持语法自动缩排和代码复制功能,内置一个强大的PHP代码调试工具,支持本地和远程两种调试模式,支持多种高级调试功能。

Zend Studio for Eclipse v6.0是PHP官方的开发工具.它基于Eclipse和PDT,加入了ZendStudio的专用特性,ZF框架,ZendCore Zend Platform.Zend Studio一直是很多PHP开发者的首选工具,它与Java的关系一向甚为亲密,Zend Studio 5一直都是基于Java Swing的,现在好了,Zend Studio直接改投Eclipse了.

从魔兽看PHP设计模式

前段时间看到有人用魔兽来解释设计模式,感觉很有意思,于是我把它改了改,又添加了些设计模式内容,今天发出来。有些地方借鉴了前人的内容,没有注明,请前人不要见怪啊。

这里用大家感兴趣的魔兽3来讨论PHP的几种常见的设计模式:单件模式、策略模式、工厂模式、观察者模式。今天就讲这四个吧,以后继续。

这些设计模式,都是针对面向对象来说的,所以都用PHP5,另外在这里我想说的是PHP4从2008年8月8日(我记得是和北京奥运会同一天,没查证,呵呵)的时候官方就发了最后一个PHP4的补丁,这意味这PHP4的时代已经终结,所以,我建议大家现在就别理PHP4吧,就以PHP5来说吧。

一、单件模式:

问题的提出:

某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。

问题的解决:

那么下面我们就开始玩魔兽吧。首先双击war3.exe,这时候就开始运行魔兽了。我们用代码来实现吧。

<?php
class War3
{

public function __construct()

{

echo "War3 is Running.","<br />";

}
}
$war = new War3();

运行!很好,输出

War3 is Running.

我们已经可以开始游戏了,但是,如果我在代码末尾再加入

$war2 = new War3();

$war3 = new War3();

会怎么样呢?我们试试,输出结果:

War3 is Running.

War3 is Running.

War3 is Running.

完了,如果不小心双击了两次就开了3个魔兽,那如果再双击几次,那电脑肯定爆掉。。。我们还是来想想解决方法吧。

既然我们不能这么随意的就把这个类实例化了,那么我们就把构造函数改成私有方法。

class War3
{

private function __construct()

{

echo "War3 is Running.","<br />";

}
}

可是私有变量外部是无法访问的,这样以来,我们就连一个都打不开了啊。别急,我们再给他加一个不用通过实例化,外部也能访问的函数,那就是静态函数,
class War3
{

private function __construct()

{

echo "War3 is Running.","<br />";

}

 

public static function runWar()

{

 

}
}

通过这个静态的方法runWar()我们来控制类War3的实例化,那么还缺上一个标识,我们再创建一个标识,通过这个标识来表示我们的类是否已经实例化,如果实例化,直接返回句柄就行了。

把类修改成

class War3
{

protected static $_instance = null;

private function __construct()

{

echo "War3 is Running.","<br />";

}

 

public static function runWar()

{

if (null === self::$_instance) {

self::$_instance = new self();

}

return self::$_instance;

}
}

当然,我们运行魔兽时的实例化也要换种方法,就通过
$war = War3::runWar();
就能开始玩魔兽了,好了,下面把完整的代码附上来:

<?php
class War3
{

protected static $_instance = null;

private function __construct()

{

echo "War3 is Running.","<br />";

}

public static function runWar()

{

if (null === self::$_instance) {

self::$_instance = new self();

}

return self::$_instance;

}
}

$war = War3::runWar();
$war2 = War3::runWar();
$war3 = War3::runWar();

运行一下,结果是:

War3 is Running.

太好了,我双击了这么多次,也就只运行了一个魔兽,现在随便你怎么打开,机子都不会爆掉了。

这就是传说中的单价模式,主要用于一些很占资源的而且实例仅有一个实例就够用的东西,比如,zend framework中的Zend_Controller_Front前端控制器,就是采用单价模式来设计的,大家有兴趣的话可以看看那个。

二、策略模式:

问题的提出:

在此模式中,算法是从复杂类提取的,因而可以方便地替换。例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分 —— 一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。

问题的解决:

呵呵,不讲那么复杂,刚才魔兽好不容易打开了,我们还是玩魔兽好了。
下面我们选battle,哇好多种族啊,有人族(Human),兽族(ORC),暗夜精灵族(Nighy Elf),不死族(Undead)。我选精灵族(Nighy Elf),再选一个精灵族和两个兽族(ORC),一个兽族和我是一家的,另一个精灵族和兽族是另一家的。

每一个玩家在进入游戏后都会得到一些资源,如一个大厅,五个小精灵(苦工)和一个矿山。这些可以称为是初始化的一些东西,这里我们就可以用到策略模式来封装这些初始化。

进入正题,首先我们来构建一个玩家类:

<?php
class player
{

//玩家名字

protected $_name;

//种族

protected $_race;

//队伍

protected $army;

//建筑

protected $building;

//人口

protected $population;

//黄金

protected $gold;

//木材

protected $wood;

//构造函数,设定所属种族

public function __construct($race)

{

$this->race = $race;

}

//__get()方法用来获取保护属性

private function __get($property_name)

{

if(isset($this->$property_name)) {

return($this->$property_name);

}

else {

return(NULL);

}

}

//__set()方法用来设置保护属性

private function__set($property_name,$value)

{

$this->$property_name=$value;

}
}

接着,我们再建一个玩家初始化的接口,

<?php
interface initialPlayer
{

//制造初始化的部队

public function giveArmy($player);

//制造初始化的建筑

public function giveBuilding($player);

//初始化资源

public function giveSource($player);
}

好了,到这里我们就该对这个接口来实现了,为了方便,我只选了两个种族,就只写这两个种族的初始化了:

首先是精灵族:

<?php
class NighyElfInitial implements initialPlayer
{

//制造初始化的部队

public function giveArmy($player)

{

//五个小精灵

for($i=0; $i<=5;$i++)

{

$creator = new CreatArms();//这个是创建部队类,在后面得工厂模式中会用到,这里我就不多说了

$player->army[] = $creator->Creat(‘Wisp’,’./Arms/’);

}

}

//制造初始化的建筑

public function giveBuilding($player)

{

$creator = new CreatBuildings();

//一个基地

$player->building[] = $creator->Creat(‘TownHall’,’./Buildings/’);

//一个矿场

$player->building[] = $creator->Creat(‘Mine’,’./Buildings/’);

}

//初始化人口上限

public function giveSource($player)

{

$player->population= 10;

$player->gold= 1000;

$player->wood= 100;

}
}

接下来是兽族:

<?php
class ORCInitial implements initialPlayer
{

//制造初始化的部队

public function giveArmy($player)

{

//五个苦工

for($i=0; $i<=5;$i++)

{

$creator = new CreatArms();//这个是创建部队类,在后面得工厂模式中会用到,这里我就不多说了

$player->army[] = $creator->Creat(‘Peon’,’./Arms/’);

}

}

//制造初始化的建筑

public function giveBuilding($player)

{

$creator = new CreatBuildings();

//一个基地

$player->building[] = $creator->Creat(‘TownHall’,’./Buildings/’);

//一个矿场

$player->building[] = $creator->Creat(‘Mine’,’./Buildings/’);

}

//初始化人口上限

public function giveSource($player)

{

$player->population= 10;

$player->gold= 1000;

$player->wood= 100;

}
}

好了,到这里初始化代码就写好了,现在还差一个控制这些初始化得类,也就是封装他们:

<?php
class initialController {
//构造函数,参数为玩家的数组
public function __construct($playerArray)
{

foreach ($playerArray as $player)

{

switch ($player->race)

{

case ‘NighyElf’:

$initialController = new NighyElfInitial();break;

case ‘ORC’:

$initialController = new ORCInitial();break;

}

$initialController->giveArmy($player);

$initialController->giveBuilding($player);

$initialController->giveSupply($player);

}

}
}

最后就是简单这么一调用,就OK:

<?php
//有两个精灵族两个兽族
$playerArray = array(new player(‘NighyElf’), new player(‘NighyElf’), new player(‘ORC’), new player(‘ORC’));
//进行初始化工作
$initialController = new initialController($playerArray);

这就是策略模式,他将不同情况下的算法封装在一起。Zend framework中的Zend_Application_Resource就是用策略模式来设计的。

三、工厂模式:

问题的提出:

最初在设计模式一书中,许多设计模式都鼓励使用松散耦合。要理解这个概念,让我们最好谈一下许多开发人员从事大型系统的艰苦历程。在更改一个代码片段时,就会发生问题,系统其他部分 —— 您曾认为完全不相关的部分中也有可能出现级联破坏。

该问题在于紧密耦合。系统某个部分中的函数和类严重依赖于系统的其他部分中函数和类的行为和结构。您需要一组模式,使这些类能够相互通信,但不希望将它们紧密绑定在一起,以避免出现联锁。

在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类。这时候,使用工厂模式会很方便。

工厂模式是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。

问题的解决:

呵呵,估计有些phper没看懂吧,没关系,那是我从其他地方抄的,我们下面还是通过魔兽来进行吧。这一部分,我看都已经有前人写好了,我就基本上照抄了,请前人不要见怪啊。呵呵。

前面选了暗夜精灵族(Nighy Elf),和兽族(ORC),因为小精灵(Wisp)能建造建筑,还能自爆。所以根据这个我们下面先写个小精灵(Wisp)的类。

<?php
class Wisp
{

private $mHealthPoint = 120;//这是小精灵的血量

private $mArmor = 0;//这是小精灵的护甲

//小精灵能建造建筑

public function Build()

{

echo ‘精灵建造建筑咯。<br/>’;

}

//每个小精灵被造出来时还会占用一个人口

public function __construct()

{

echo ‘你已经建造了一个小精灵。<br/>’;

//这里是增加已有人口的代码

}

//每个小精灵死亡会减少你占用的人口

public function __destruct()

{

//这里是减少已有人口的代码

}
}

把这些代码放在Arms/ Wisp.php中。
啊,还有还有,还有苦工(Peon)的类

<?php
class Peon
{

private $mHealthPoint = 250;//这是苦工的血量

private $mArmor = 0;//这是苦工的护甲

 

//苦工能建造建筑

public function Build()

{

echo ‘苦工建造建筑咯。<br/>’;

}

 

//每个苦工被造出来时还会占用一个人口

public function __construct()

{

echo ‘你已经建造了一个苦工。<br/>’;

//这里是增加已有人口的代码

}

//每个苦工死亡会减少你占用的人口

public function __destruct()

{

//这里是减少已有人口的代码

}
}
把这些代码放在Arms/ Peon.php中。

等等,这样岂不是很复杂,魔兽里面还有那么多的兵种,另外都还有两个种族,每次创建一个兵就要new一个,要是记不住这个兵的类名,岂不是new不了?而且如果一个兵是一个类,放在一个文件里,那是不是一开始就要把所有的几十上百个文件都include一次啊,那效率可想而知啊。

嘿嘿,当然是有解决办法的啊,我们再写一个类把这些类都封装起来,这个把兵种都封装起来的类我们称之为工厂类,他可以像生产产品一样,来创建兵,帮我们对其实例化。下面我们就来看这个类怎么实现吧。

<?php
class CreatArms
{

public function __construct(){}

public function Creat($arms,$path = ”)

{

include $path.$arms.’.php’; //包含要这个类的文件

return new $arms; //返回你创建的兵种对象的句柄

}
}

这样,即使在兵种多样的情况下,我们仍然可以很方便地实例化:

$creator = new CreatArms();
$w1 = $creator->Creat(‘兵种名’,’前缀或路径’);
例如创建小精灵:
$creator = new CreatArms();//不管创建啥,我都只要使用这个类
$w1 = $creator->Creat(‘Wisp’,’./Arms/’);//创建一个小精灵
$w1->Build();//让小精灵造建筑

这就是传说中的工厂模式,通过工厂模式,对于如论坛那种有很多种用户的,特别是为了以后扩展比较方便的,采用工厂模式,是个很好的解决方法。在zend framework中的Zend_Form、Zend_Filter、Zend_Validate就是用工厂模式来构架的。

四、观察者模式:

问题的提出:

观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。

问题的解决:

呵呵,上面还是抄的,看不懂没关系,我们今天重点是玩魔兽。

已经造了很长时间的兵了,现在可以出去带兵打仗了,如果我去打电脑的兽族,那么电脑与那个兽族同盟的精灵族就会过来帮忙。那么如何让他知道自己的同盟受攻击了呢。现在我们就来讨论这个问题。
首先我们写一下结盟的抽象类:

<?php
abstract class abstractAlly
{

//放置观察者的集合,这里以简单的数组来直观演示

protected $oberserverCollection;

//增加观察者的方法,参数为观察者(也是玩家)

public function addOberserver($oberserver)

{

$this->oberserverCollection[] = new oberserver($oberserver);

}

//将被攻击的电脑的名字通知各个观察者

public function notify($beAttackedPlayerName)

{

//把观察者的集合循环

foreach ($this->oberserverCollection as $oberserver)

{

//调用各个观察者的救援函数,参数为被攻击的电脑的名字,if用来排除被攻击的电脑的观察者

if($oberserver->name != $beAttackedPlayerName)

$oberserver->help($beAttackedPlayerName);

}

}

 

abstract public function beAttacked($beAttackedPlayer);
}

下面我们就写具体的结盟类:

<?php
class Ally extends abstractAlly
{

//构造函数,将所有电脑玩家的名称的数组作为参数

public function __construct($allPlayer)

{

//把所有电脑玩家的数组循环

foreach ($allPlayer as $player)

{

//增加观察者,参数为各个电脑玩家的名称

$this->addOberserver($player);

}

}

//将被攻击的电脑的名字通知各个观察者

public function beAttacked($beAttackedPlayerName)

{

//调用各个观察者的救援函数,参数为被攻击的电脑的名字,if用来排除被攻击的电脑的观察者

$this->notify($beAttackedPlayerName);

}
}

接着在二、策略模式中我们定义的player类中加入一个help方法
public help($beAttackedPlayerName)
{

//这里简单的输出,谁去救谁,最后加一个换行,便于显示

echo $this->name." help ".$beAttackedPlayerName."<br />";
}

这样就行了。最后就是仿真了。

<?php
//先设置敌方电脑
$allComputePlayer = array(‘NighyElf2’, ‘ORC2’);
//新建电脑结盟
$Ally = new Ally($allComputePlayer);
//假设我进攻了电脑的兽族
$Ally->beAttacked(‘ORC2’);

这样结盟的另一家就能接到通知,去救援。观察者模式主要就是用在这种情况下。可以将某个状态变化立即通知到相关的对象,相关的对象就可以采用相应的策略。例如,zend framework中的Zend_Message就是用的观察者模式。

好了,今天就玩到这里,以后有空再和大家一起玩魔兽啊。

改写thinkphp内置分页类,使之支持ajax分页

在网上下了一个在原thinkphp分页类基础上添加了多种样式的分页类,但是项目要使用ajax分页,所以在它的基础上做了一点小改动,以支持ajax分页

类文件及css文件下载

page.class.php.rar

演示代码

/Lib/Action/test2Action.class.php

 

PHP代码
  1. <?php   
  2. class test2Action extends Action{   
  3.     public function index()   
  4.     {   
  5.         $this->display();   
  6.     }   
  7.   
  8.     public function ajax()   
  9.     {   
  10.         if($_GET[‘do’]==‘list’){   
  11.             $_GET[‘page’]=$_POST[‘page’];   
  12.             $perapective_=D(‘Perapective’);   
  13.             import("@.ORG.Page"); //导入分页类      
  14.             C(‘PAGE_NUMBERS’,’10’); //Discuz分布是显示前后共10页的按钮   
  15.             C(‘VAR_PAGE’,‘page’);   
  16.             C(‘AJAX_FUNCTION’,‘getlist’);   
  17.             $total = $perapective_->count();   
  18.             $pnew Page($total,5);   
  19.   
  20.             if($data=$perapective_->findAll(,,‘pid desc’,$p->firstRow.‘,’.$p->listRows)){   
  21.                 $status=0;   
  22.                 $info[‘page’] = $p->show();   
  23.                 $info[‘style’]="manu";//分页样式   
  24.             }else{   
  25.                 $status=1;   
  26.             }   
  27.             $this->ajaxReturn($data,$info,$status);    
  28.         }   
  29.     }   
  30. }   
  31. ?>  

 

前台模板文件:

 

XML/HTML代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <title>ajax测试</title>  
  5.   
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  7. <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />  
  8. <SCRIPT LANGUAGE="JavaScript" src="/public/js/jquery.js"></SCRIPT>  
  9. <style>  
  10. body{font-size:12px;}   
  11. a:link,a:visited,a:active{ color:#000; text-decoration:none;}   
  12. a:hover{ color:#87B600; text-decoration:none;}   
  13. #box{margin:20px auto;width:600px;border:1px solid #E6E6E6}   
  14. #menu{clear:both;float:right;}   
  15. #menu ul{list-style:none;clear:both;}   
  16. #menu ul li{float:left;margin:3px;width:70px;text-align:center;}   
  17. #listbox{margin:10px auto;width:580px;display:none;}   
  18. #listbox ul{list-style:none;}   
  19. #listbox ul li{color:blue;padding-top:10px;}   
  20. #page{clear:both;text-align:left;padding-left:35px;}   
  21. .clear{clear:both;}   
  22. </style>  
  23. <link rel="stylesheet" type="text/css" href="/public/css/style2.css" />  
  24. </head>  
  25. <body>  
  26.   
  27. <div id="box">  
  28.     <div id="menu">  
  29.         <ul>  
  30.                
  31.         </ul>  
  32.            
  33.     </div>  
  34.     <div id="listbox"></div>  
  35.        
  36.     <div class="clear"></div>  
  37. </div>  
  38. <SCRIPT LANGUAGE="JavaScript">  
  39. <!–   
  40.     function getlist(page){   
  41.         url="/test2/ajax/do/list";   
  42.         var html="";   
  43.         $.post(url,{page:page},function(data){   
  44.             list=data.data;   
  45.             page=data.info.page;   
  46.             style=data.info.style;   
  47.             status=data.status;   
  48.             if(status==0){   
  49.                 html+="<ul>";   
  50.                 for(var i = 0; i < list.length; i++){   
  51.                     html+="<li>"+list[i].title+"</li>"   
  52.                 }   
  53.                 html+="</ul>";   
  54.                 html+="<div id=‘page’ class=‘"+style+"’>"+page+"</div>";   
  55.             }else{   
  56.                 html+="无数据!";   
  57.             }   
  58.             $("#listbox").html(html);   
  59.             $("#listbox").show();   
  60.         },"json");   
  61.     }   
  62.     getlist(1);   
  63. //–>  
  64. </SCRIPT>  
  65. </body>  

 

效果图

ddd.jpg

最简单的模板技术

php的模板,例如smarty等,都是采用模板内置的标记语言进行模板变量等操作。其目的是为了让开发模板的美工不需要太大的学习成本,可是采用这种方式有几个不足2点:

1,现在做页面的美工基本上都是直接把页面给程序处理成模板,这样的话,程序员就要承担模板这部分的学习成本

2,smarty中的模板最终也是编译成一个php html混排的文件,如此的话,模板将在编译上花费一部分的系统资源,其实php本身就是一个非常好的模板语言,何必在模板程序里用正则转换模板的标记语言呢!

从功能上来说,采用纯php来做模板语言的话,也非常容易实现页面模板与程序的分离,同时页面模板里的处理能力也大大的加强

下面是临时写的一个简易的模板类,没有其它功能,纯粹用于页面与程序的分离!

首页index.php文件

PHP代码
  1. <?php   
  2. header("content-type:text/html; charset=utf-8");   
  3. define(‘TPLDIR’,dirname(__FILE__).‘/tpl/’);   
  4. $template=new template;   
  5. $template->a=‘这里是模板输出变量测试!’;   
  6. $template->tpl(‘a.html’);   
  7.   
  8.   
  9. //模板类   
  10. class template   
  11. {   
  12.     function tpl($tplname)   
  13.     {   
  14.         $tpl=TPLDIR.$tplname;   
  15.         if(file_exists($tpl)){   
  16.             include($tpl);   
  17.         }else{   
  18.             echo ‘模板’.$tplname.‘不存在’;   
  19.         }   
  20.         unset($tpl);   
  21.     }   
  22. }   
  23. ?>  

 

模板文件 tpl/a.html

 

XML/HTML代码
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
  2. <HTML>  
  3.  <HEAD>  
  4.   <TITLE> 最简单的php模板 </TITLE>  
  5.   <META NAME="Generator" CONTENT="EditPlus">  
  6.   <META NAME="Author" CONTENT="">  
  7.   <META NAME="Keywords" CONTENT="">  
  8.   <META NAME="Description" CONTENT="">  
  9.  </HEAD>  
  10.   
  11.  <BODY>  
  12.  从模板里输入变量a: <?php echo $this->?>  
  13.  <br>  
  14.   从1加到10000等于:   
  15.   <?php  
  16.   $s=0;   
  17.     for($i=1;$i<=10000;$i++){   
  18.         $s+=$i;   
  19.     }   
  20.     echo $s;   
  21.     ?>  
  22.  </BODY>  
  23. </HTML>  
  24.