PHP编码规范(建议)

命名规则

函数命名

函数采用驼峰命名规则。一般采用

actionDescribeTarget

的形式。

例如:

getInternalName

getName

getValue

 

动作的名称使用匹配的方法规则。以下是常用的配对

get/set

from/to

init/uninit

add/remove

避免采用value(),name()这类语义不清的函数名。

 

对于缩写,推荐仅首字母大写。例如

parseXmlText

而不采用

parseXMLText.

 

对于类中的protected以及private函数,加前导线’_’例如

protected function _intertnalInit(){}

 

类命名

一般命名规则为class MyClassName,即所有首字母大写。

 

类库命名

采用以下命名规则:

类库名_Abstract_名称_类型_Interface

例如:

Zend_Session_Adapter_Interface

Zend_Session_Namespace

 

文件的目录则为

Zend/Session/Adapter/Interface.php

一般的功能类,不使用下划线分割。

 

文件命名

文件命名和类命名相似。

例如:

MyFileName.php

 

变量命名

局部变量

建议采用驼峰命名法。

例如:

$errCode

也可以采用简单的

$error

 

类的内部变量

采用前导下划线声明,采用驼峰命名法。例如

class A

{

static private $_instance;

}

 

书写规则

脚本声明

Php代码使用<?php的头声明,不得使用<?头声明。

对于非嵌入网页的脚本,不得使用?>尾部声明。防止另外追加的空格或者回车影响输出。

文件编码

除非有特殊原因,所有文件都应该使用utf-8编码,并且尽量避免中英文混排。

缩进

代码缩进采用4个字符空格的tab键

大括号规则

对于类、函数声明采用以下格式,首大括号另起一行。

class A

{
}

 

function B()

{
}

 

对于if/else/switch/while等判断条件语句,首大括号不另起一行。

if (){

}

else{

}

while(){

}

switch(){

case 0:

break;

default:

break;

}

的方式。

 

判断

是/非判断:

不能使用

if (true == judge()){

}

这样的判断,而应该使用

if (judge()){
}

同样

if (false == judge()){

}

也是不能使用的方法。应该写作:

if (!judge()){

}

除非必须判断强等于时,例如

if (false === judge()){
}

则可以使用。

注释

文件、函数、类应该有完整注释。

 

文件注释:

文件注释用于描述文件的信息。一般包括以下内容:

文件名       可以包含完整路径

作者         作者名字,email地址

创建时间      发布文件的时间

文件说明

修改历史      文件修改的历史记录

 

/**

* index.php

* author:  张三<zhangsan@qq.com>

* create:  2009-2-27

* note:

*    采用XXX的方法,可以完成YYY的效果。

* history:

*     2002-02-28 修订了认证失败信息错误的Bug

*/

 

函数注释

/**

* 函数描述,功能性描述

*

* @param  类型 参数名称 描述

* @return 类型

*/

 

例如:

/**

* 计算传入参数的和

*

* @param  number $a

* @param number  $b

* @return number

*/

function add($a, $b)

{
}

注:Zend Studio可以自动生成这个形式的注释。

 

类注释

当前类的一些功能。所属的包。等其他说明信息。

一般一个文件一个类。文件的注释和类的注释有相重的地方。

 

Tonitech版权所有 | 转载请注明出处: http://www.tonitech.com/?p=1167

线程之间的通信

        通常情况下,一个次级线程要为主线程完成某种特定类型的任务,这就隐含着表示在主线程和次级线程之间需要建立一个通信的通道。一般情况下,有下面的几种方法实现这种通信任务:使用全局变量、使用事件对象、使用消息。使用全局变量的方法相信有点基础的人都会,在这里不做讲解,我们主要介绍后两种方法。

  (一) 利用用户定义的消息通信

  在Windows程序设计中,应用程序的每一个线程都拥有自己的消息队列,甚至工作线程也不例外,这样一来,就使得线程之间利用消息来传递信息就变的非常简单。首先用户要定义一个用户消息,如下所示:#define WM_USERMSG WMUSER+100;在需要的时候,在一个线程中调用::PostMessage((HWND)param,WM_USERMSG,0,0)或CwinThread::PostThradMessage()来向另外一个线程发送这个消息,上述函数的四个参数分别是消息将要发送到的目的窗口的句柄、要发送的消息标志符、消息的参数WPARAM和LPARAM。下面的代码结果是在线程结束时显示一个对话框,提示线程结束:

UINT ThreadFunction(LPVOID pParam)
{
 while(!bend)
 {
  Beep(100,100);
  Sleep(1000);
 }
 ::PostMessage(hWnd,WM_USERMSG,0,0);
 return 0;
}
////////WM_USERMSG消息的响应函数为OnThreadended(WPARAM wParam, LPARAM lParam)
LONG CTestView::OnThreadended(WPARAM wParam,LPARAM lParam)
{
 AfxMessageBox("Thread ended.");
 Retrun 0;
}

  上面的例子是工作者线程向用户界面线程发送消息,对于工作者线程,如果它的设计模式也是消息驱动的,那么调用者可以向它发送初始化、退出、执行某种特定的处理等消息,让它在后台完成。在控制函数中可以直接使用::GetMessage()这个SDK函数进行消息分检和处理,自己实现一个消息循环。GetMessage()函数在判断该线程的消息队列为空时,线程将系统分配给它的时间片让给其它线程,不无效的占用CPU的时间,如果消息队列不为空,就获取这个消息,判断这个消息的内容并进行相应的处理。

  (二)用事件对象实现通信

  在线程之间传递信号进行通信比较复杂的方法是使用事件对象,用MFC的Cevent类的对象来表示。事件对象处于两种状态之一:有信号和无信号,线程可以监视处于有信号状态的事件,以便在适当的时候执行对事件的操作。上述例子代码修改如下:

////////////////////////////////////////////////////////////////////

Cevent threadStart ,threadEnd;

UINT ThreadFunction(LPVOID pParam)
{
 ::WaitForSingleObject(threadStart.m_hObject,INFINITE);
 AfxMessageBox("Thread start.");
 while(!bend)
 {
  Beep(100,100);
  Sleep(1000);
  Int result=::WaitforSingleObject(threadEnd.m_hObject,0);
  //等待threadEnd事件有信号,无信号时线程在这里悬停
  If(result==Wait_OBJECT_0)
   Bend=TRUE;
 }
 ::PostMessage(hWnd,WM_USERMSG,0,0);
 return 0;
}

/////////////////////////////////////////////////////////////

Void CtestView::OninitialUpdate()
{
 hWnd=GetSafeHwnd();
 threadStart.SetEvent();//threadStart事件有信号
pThread=AfxBeginThread(ThreadFunction,hWnd);//启动线程
 pThread->m_bAutoDelete=FALSE;
 Cview::OnInitialUpdate();
}

////////////////////////////////////////////////////////////////

Void CtestView::OnDestroy()
{
 threadEnd.SetEvent();
 WaitForSingleObject(pThread->m_hThread,INFINITE);
 delete pThread;
 Cview::OnDestroy();
}

  运行这个程序,当关闭程序时,才显示提示框,显示”Thread ended”。

Linux Shell 脚本中字符串的连接方法

如果想要在变量后面添加一个字符,可以用一下方法:

$value1=home
$value2=${value1}"="
echo $value2

把要添加的字符串变量添加{},并且需要把$放到外面。

这样输出的结果是:home=,也就是说连接成功。

Linux Shell中删除文件中某一行的方法

如果有一个abc.txt文件,内容是:

aaa

bbb

ccc

ddd

eee

fff

如果要删除aaa,那么脚本可以这样写:

sed -i '/aaa/d' abc.txt

如果删除的是一个变量的值,假如变量是var,应该写成:

sed -i '/'"$var"'/d' abc.txt

至于grep -v aaa abc.txt这个方法,是无法将修改的结果写入abc.txt中去的

Tonitech版权所有 | 转载请注明出处: http://www.tonitech.com/?p=79