日志标签 ‘php’

php的多分支控制

2009年4月27日

php的多分支控制
原文 (飞扬轻狂,fallseir) 20090427
==== php的多分支控制 ====
### if 方式 实现多分支控制

if(runStep(1)){
  if(runStep(2)){
    if(runStep(3)){
      # all steps are success!!
    }else{
	# step 03 is failed!
    }
  }else{
    # step 03 is failed!
  }
}else{
  # step 03 is failed!
}

# some others steps

### if 方式 2 实现多分支控制

$r=0;
if(runStep(1))
  if(runStep(2))
    if(runStep(3))
    else $r=3;
  else $r=2;
else $r=1;
if($r){
  # step $r is failed!
  return false;
}

# some others steps

### do..while(false) 方式 2 实现多分支控制

do{
  if(!runStep(1)) # step 01 is failed!
  break;
  if(!runStep(2)) # step 02 is failed!
  break;
  if(!runStep(3)) # step 03 is failed!
  break;
  # all steps are success!!
}while(false);

# some others steps

### switch(true) 方式 2 实现多分支控制

switch(true){
  case !runStep(1):
	# step 01 is failed!
	break;
  case !runStep(2):
	# step 02 is failed!
	break;
  case !runStep(3):
	# step 03 is failed!
	break;
  default:
	# all steps are success!!
    break;
}

# some others steps

### try..catch 方式实现

try{
  if(!runStep(1)) throw new SomeError(1); # step 01 is failed!
  if(!runStep(2)) throw new SomeError(2); # step 02 is failed!
  if(!runStep(3)) throw new SomeError(3); # step 01 is failed!
  # all steps are success!!
}catch(SomeError $ex){
  # step $ex is failed!
  return false;
}
# some others steps

使用反射 实现的 简单的 单元测试框架

2009年4月27日

使用反射 实现的 简单的 单元测试框架
原文 (飞扬轻狂,fallseir) 20090427
==== generalized test methods use introspection ====

class customClass{
  function selfTest(){[..] return [message|false]}
}
class tester{
  function test($thing){
    if(is_object($thing)){
      if(method_exists($thing,'selfTest')){
        $this->handleTest(call_user_method('selfTest',$thing));
      }
    }else if(is_array($thing)){
      foreach($thing as $component){ $this->test($component); }
    }else{
    ;//ignore if not an array or object
    }
  }
  function handleTest($result){if($result)print "Warning $result";}
}

参考:
John.Wiley.and.Sons.PHP5.and.MySQL.Bible

一段用于替换字符串中指定的key的代码

2008年5月6日

一段用于替换字符串中指定的key的代码

–[[User:Fallseir|飞扬轻狂]] 2008年5月6日 (二) 02:32 (PDT)
$str=mapKeys($formatstr,$maps);

$str=“replace this template string !the key maps is here
key1=>{key1},key{{2=>{key{2},key3}=>{key3{}}”
;
echo 
mapKeys($str
  
,array(“key1″=>“value 1″
  
,“key{2″=>“value 2″
  
,“key3}”=>“value 3″
  
)
);
echo 
“\n”

output>>
replace this template string !the key maps is here
key1=>value 1,key{2=>value 2,key3}=>value 3
abc[the abc value]}}%[%}%%%]%{%[0}%%,%%%,{key],%%,%%[the %value% 2],%%[the %value% 2],%$$%%{,%,
abc%%%%%%%%%,%%%,%key%,%%,%%%key,2%,%,%$$%%,%,

$ php -r ‘highlight_file(“test.php”);’


<?php
/** test */
$str="replace this template string !the key maps is here
key1=>{key1},key{{2=>{key{2},key3}=>{key3{}}"
;
echo 
mapKeys($str
  
,array("key1"=>"value 1"
  
,"key{2"=>"value 2"
  
,"key3}"=>"value 3"
  
)
);
echo 
"\n";

$str="abc{key}{}}%{%{}%%%}%{{%{0{}%%,%%%,{key},%%,%%{key,2},%%{key,2},%$$%%{,%,";
echo 
mapKeys($str,array("key"=>"[the abc value]"
,"key,2"=>"[the %value% 2]"));
echo 
"\n";

$str="abc%%%%%%%%%,%%%,%key%,%%,%%%key,2%,%,%$$%%,%,";
echo 
mapKeys($str,array("key"=>"[the abc value]"
    
,"key,2"=>"[the %value% 2]"),"|%|");
echo 
"\n";
//end test*/
/*
$ php test.php
output>>
replace this template string !the key maps is here
key1=>value 1,key{2=>value 2,key3}=>value 3
abc[the abc value]}}%[%}%%%]%{%[0}%%,%%%,{key],%%,%%[the %value% 2],%%[the %value% 2],%$$%%{,%,
abc%%%%%%%%%,%%%,%key%,%%,%%%key,2%,%,%$$%%,%,
 
 */
 
 
/**
 * 使用maps中定义的value替换对应其key的由开始标记字符和结束标记字符包含的字符串
 *
 * 当标记对外开始标记后跟着开始标记时或结束标记时表示第一个开始标记为转义符
 * 当标记对内开始标记后跟着结束标记时表示第一个开始标记为转义符
 * 末尾没有匹配的开始标记将原样输出
 */
function mapKeys($str,$maps,$fstart=null,$fend=null){
  if(!
$fstart){
      
$fstart="{";
      
$fend="}";
  }
  if(!
$fend){
    
$fend=$fstart;    
  }
  
  
// 如果标记相同则使用mapKeysBase进行替换
  
if($fstart==$fend){return mapKeysBase($str,$maps,$fstart);}
 
  
$index=0;
  
$offset=0;
  while(
false!==($index=strpos($str,$fstart,$offset))){
    
# 找到开始标记,处理开始标记之前的数据
    
$v=substr($str,$offset,$index-$offset);
    
$offset=$index+strlen($fstart);
    
$p=true;
    while((
$find=substr($str,$offset,strlen($fstart)))==$fstart
      
||($find=substr($str,$offset,strlen($fend)))==$fend){
      
$v.=$find;
      
$offset=$offset+strlen($find);
      
$p=false;# 如果这个标记是用来转义的
      
if(false!==($index=strpos($str,$fstart,$offset))){
        
$v.=substr($str,$offset,$index-$offset);
        
$offset=$index+strlen($fstart);
        
$p=true;# 查找下一个开始标记
      
}
    }
    
$o.=$v;
    
$v="";
    
# 标记了开始 并找到了 结束
    
while($p
      
&&false!==($end=strpos($str,$fend,$offset))){
      
$v.=substr($str,$offset,$end-$offset);
      
# 如果这个标记是被转义的
      
if(($find=substr($str,$end-strlen($fend),strlen($fstart)))
        ==
$fstart){
        
$v=substr($v,0,strlen($v)-strlen($fstart)).$fend;
        
$offset=$end+strlen($fend);
        continue;
      }
      
$p=false;
    }
    if(
$v){
      if(
array_key_exists($v,$maps)){
        
$v=$maps[$v];
      }else{
        
$v="[".$v."]";
      }
      
$o.=$v;
      
$offset=$end+strlen($fend);
    }
  }
  if(
$p){
    
$o.=$fstart;
  }
  
$v=substr($str,$offset);
  
$o.=$v;
  return 
$o;
}
/**
 * 使用maps中定义的value替换对应其key的由标记字符包含的字符串
 *
 * 如果标记重复出现 则第一个为转义字符(这也意味着标记字符不能作为key的开始字符)
 */
function mapKeysBase($str,$maps,$find=null){
  if(!
$find){
    
$find="%";
  }
  
$p=false;
  
$v="";
  
$index=0;
  
$offset=0;
  while(
false!==($index=strpos($str,$find,$offset))){
    
$v.=substr($str,$offset,$index-$offset);
    
$offset=$index+strlen($find);
    while(
substr($str,$offset,strlen($find))==$find){
      
$v.=$find;
      
$offset=$offset+strlen($find);
      if(
false!==($index=strpos($str,$find,$offset))){
        
$v.=substr($str,$offset,$index-$offset);
        
$offset=$index+strlen($find);
      }
    }
    if(
$p){
      if(
array_key_exists($v,$maps)){
        
$v=$maps[$v];
      }else{
        
$v="[".$v."]";
      }
      
$o.=$v;
      
$v="";
      
$p=false;
    }else{
      
$o.=$v;
      
$v="";
      
$p=true;
    }
  }
  if(
$p){
    
$v.=$find;
  }
  
$v.=substr($str,$offset);
  
$o.=$v;
  return 
$o;
}
?>


取自”http://www.fallseir.com/wiki/PHP/MapKeys.html

Win下出现apache无法启动的解决方式

2008年5月6日

Win下出现apache无法启动的解决方式

使用xampp时,时常会遇到apache启动不了的情况,而xampp的控制面板有没有什么像样的提示 只有一个”Busy…”

但重启Win后,先启动apache就不会遇到问题。

但是事情总是有原因的,决定去查下,也许是xampp给的提示不足,而不是apache的问题,

> cmd
> d:\
> cd tools\xampp\apache\bin\ #我的apache安装位置
> httpd # apache的启动程序

(OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。  : make_sock: c
ould not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
# 找到原因了 原来是我的80端口被占用了

> netstat -ano # 查看网络状态

  Proto  Local Address          Foreign Address        State           PID
  TCP    127.0.0.1:80           127.0.0.1:1920         CLOSE_WAIT      1112
  TCP    127.0.0.1:80           127.0.0.1:2016         CLOSE_WAIT      1112
  ...
# 通过 Local Address 中端口为80的行 可以看到 我的80端口被PID为1112的进程占用了

任务管理器>进程 / 工具栏 > 查看 > 选择列 在“PID(进程ID)”项上打勾
在进程列表中 查找PID为1112的进程
# 我这里是该死的迅雷 !!
# 当然之前我还遇到过QQ的时候
ok 杀掉这个进程 或者关掉罪魁,启动Apache 道路终于通畅了!^_~

取自”wiki:Win下出现apache无法启动的解决方式

尝试恢复因为重装了系统改变目录而导致不可用的xampp

2008年4月23日

尝试恢复因为重装了系统改变目录而导致不可用的xampp
出自Fallseir’s Wiki

尝试恢复因为重装了系统改变目录而导致不可用的xamppPHP

1、恢复mysql

* 查看mysql的启动项 xampp\mysql_start.bat

mysql\bin\mysqld –defaults-file=mysql\bin\my.cnf –standalone –console

* 修改mysql的配置 mysql\bin\my.cnf

更改其中的配置路径
socket = “C:/tools/develop/xampp/mysql/mysql.sock”
socket = “C:/tools/develop/xampp/mysql/mysql.sock”
basedir = “C:/tools/develop/xampp/mysql”
tmpdir = “C:/tools/develop/xampp/tmp”
datadir = “C:/tools/develop/xampp/mysql/data”

* 打开xampp-control 开启mysql服务 ok!
2、 恢复apache
* 修改apache的配置文件 xampp\apache\conf\httpd.conf

更改其中的配置路径
ServerRoot “c:/tools/develop/xampp/apache”
DocumentRoot “c:/tools/develop/xampp/htdocs”

ScriptAlias /cgi-bin/ “C:/tools/develop/xampp/cgi-bin/”

* 更改apache中的xampp的配置

xampp\apache\conf\extra\httpd-xampp.conf

* 更改自己的web站点配置

xampp\apache\conf\extra\httpd-vhost.conf

* 打开xampp-control 开启apache服务 ok!
3、恢复php
* 修改php配置信息中的路径

xampp\apache\bin\php.ini

* 重启apache ok!