存档

文章标签 ‘php’

zen cart 的sidebox 机制

2009年8月24日 没有评论

zen cart的左右边栏很有特色,由一块一块的sidebox拼合起来的,在模板的sidebox文件夹建立一个sidebox程序,登陆管理后台后,选择外观控制,系统会自动检测到新增加的sidebox程序,并提醒你操作。并把所有的sidebox配置信息存储在layout_boxes的表格中。

程序调用边栏是通过includes/modules 目录下的column_left.php,和column_right.php 控制。分析下源码也非常简单:首页查询layout_boxes数据表,检索出在左栏和或右栏显示的所有sidebox,再直接require 进来 layout_box_name 字段标记的sidebox名称。随便打开一个sidebox的源代码,如系统自带的includes/modules/sideboxes/banner_box.php,banner_box.php只要用来获取sidebox显示所要的数据,再通过require($template->get_template_dir(‘tpl_banner_box.php’,DIR_WS_TEMPLATE, $current_page_base,’sideboxes’),载入显示这个sidebox的模板,其实这个所谓的模板就是生成一个$content的字符串,然后再require($template->get_template_dir($column_box_default, DIR_WS_TEMPLATE, $current_page_base,’common’) . ‘/’ . $column_box_default) 再用一个显示sidebox的公共模板,在$column_box_default中打印出$content的内容,这样一个sidebox就显示完成了!

如何添加一个自己的sidebox?其实很简单,在includes/modules/sideboxes/{模板目录}/  建立一个文件,就是一个sidebox了,可以在后台控制是否显示在默认的左右边栏和排序 。在这个文件中就输出任何内容了,当然可以按照标准的模式,再在includes/templates/{模板目录}/sideboxes 下建立一个模板文件require进来,尽量做到 M/V的分离,这样以后修改也会比较方便!

zen cart的运行过程

2009年8月23日 2 条评论

zencart是典型的单入口程序,所有的程序的url都是index.php?mainpage=XX的形式,通过$_GET['mainpage']载入相应的页面程序。先说首页的输出过程如下:入口index.php->载入初始化文件application_top.php->载入首页默认变量文件mail_template_vars.php->载入公用模板控制文件tpl_main_template.php->载入方框(sidebox)控制文件column_left.php,column_left.php->载入各个sidebox的控制文件和模板->载入首页默认核心部分模板tpl_index_default.php->载入公共页面底部,到这里就完成了首页的显示。其他页面的显示则是在载入include/pages/ $_GET['mainpage']文件下的文件,基本跟首页相同,只是根据不同页面载入不同配置文件和模板。

初次接触zencart,觉得zencart的模板系统异常的复杂,其最大的特点就是覆盖机制,通过其class/template_func.php模板类的get_template_dir方法,按照预先设定的位置按顺序查找模板文件,这种机制极大的提高了模板修改的灵活性,同时避免影响其他的模板和系统程序,也方便了以后的升级,我像扩充下系统默认的模板很简单,拷贝到我自己的模板相应文件夹,想怎么改就怎么改,也不会担心会跟系统不和谐。

以上皆是根据印象所写,文件名也许错误,下次修正。

php递归遍历目录

2009年7月10日 没有评论

demo:http://anfirst.cn/wap.php

<?php
class listdir{
var $depth;
var $dirname;
var $list;
var $tostring;

function listdir($dir){
$this->dirname=$dir;
$this->depth=0;
$this->tostring=”";
}

//把结果保存进多维数组
function getlist($dir=”"){
if($dir==”")$dir=$this->dirname;
$d=@dir($dir);
while(false!==($item=$d->read()))
{
if($item!=”.”&&$item!=”..”)
{
$path=$dir.”/”.$item;
if(is_dir($path)){
$this->depth+=1;
$this->getlist($path);
}else{
$this->list[$this->depth][]=$item;
}
}
}
$this->list[$this->depth]['directory']=$dir;
$this->depth-=1;
$d->close();
return $this->list;
}

//字符窜化结果

function tostring($dir=”"){
if($dir==”")$dir=$this->dirname;
$d=@dir($dir);
$this->tostring.=”<UL>\n”;
$this->tostring.=”Directory:”.$dir.”\n”;
while(false!==($item=$d->read()))
{
if($item!=”.”&&$item!=”..”)
{
$path=$dir.”/”.$item;
if(is_dir($path)){
$this->depth+=1;
$this->tostring($path);
}else{
$this->tostring.=”<LI>”.$item.”</LI>\n”;
}
}
}
$this->depth-=1;
$d->close();
$this->tostring.=”</UL>\n”;
return $this->tostring;
}
}
$wapdir=”jquery”;
$d=new listdir($wapdir);
echo $d->tostring();
?>

输出结果:

<UL>
Directory:jquery
<LI>jquery-1.3.2.js</LI>
<LI>jquery-1.3.2.min.js</LI>
<LI>jquery-1.3.2-vsdoc2.js</LI>
<LI>test.html</LI>
<LI>common.js</LI>
<UL>
Directory:jquery/d
<LI>common.js</LI>
<LI>jquery-1.3.2.js</LI>
</UL>
</UL>

按指定概率随机抽取

2009年6月15日 1 条评论

$ar=array(‘a’=>30,’b'=>30,’c'=>10,’d'=>20,’e'=>10);
function myrandom($ar)
{
$ar_temp=array();
$temp=0;
foreach ($ar as $k => $v)
{
$ar_temp[$k]=array(‘min’=>$temp,’max’=>$temp+$v);
$temp+=$v;
}
$rand=rand(0,100);
$key=null;
foreach ($ar_temp as $k => $v)
{
if($rand>$v[min]&&$rand<=$v[max])
{
return $ar[$k];
break;
}
}

}

echo myrandom($ar);

获取$_SERVER["REQUEST_URI"] 的通用方法

2009年5月27日 没有评论

$_SERVER["REQUEST_URI"] 只有apache环境才有的
下面是一个通用的方法
drupal中的一个小函数,很简单

  1. function request_uri()
  2. {
  3. if (isset($_SERVER['REQUEST_URI']))
  4. {
  5. $uri = $_SERVER['REQUEST_URI'];
  6. }
  7. else{
  8. if (isset($_SERVER['argv']))
  9. {
  10. $uri = $_SERVER['PHP_SELF'] .’?’. $_SERVER['argv'][0];
  11. }else
  12. {
  13. $uri = $_SERVER['PHP_SELF'] .’?’. $_SERVER['QUERY_STRING'];
  14. }
  15. }
  16. return $uri;
  17. }
分类: 全部文章, 学习笔记 标签: ,

10条PHP编程习惯助你找工作[转]

2009年3月6日 没有评论

  本文来自于作者的一段面试经历,从而总结出10条编写PHP程序时的好习惯和技巧,帮助你在找工作时获得更多的优势。
  过去的几周对我来说是一段相当复杂的经历。我们公司进行了大裁员,我是其中之一,但却体验到了其中的乐趣。我从来没有被开除过,所以很难不去想得太多。我开始浏览招聘板块,一个全职PHP程序员的职位很吸引人,所以我寄去了简历并获得了面试机会。在面试之间,我和其主要的程序员们在咨询电话中聊了聊,最后他们给我出了一套测试题,其中有一道很耐人寻味。

  找出以下代码的错误之处:
PHP代码:

<?function baz($y $z) {
    $x = new Array();
    $x[sales] = 60;
    $x[profit] = 20:
    foreach($x as $key = $value) {
        echo $key+" "+$value+"<BR>";
    }
}

  你能找到几个呢?

  如果你发现函数参数列表中少了逗号、“new Array()”是不正确的、行末用了冒号而不是分号、foreach中没有用“=>”及用“+”来连接字符串,那恭喜你,你找到了所有的错误,你已经掌握了PHP编程的基础。

  现在我来说说我是怎么回答这道题的。我当然也找出了以上这些问题,但我更进一步。比如,你有没有发现在数组索引里没有用引号将字符串括起来?虽然这不会造成严重错误,但这是一个编码错误。另外,你注意到在echo一行它使用了双引号而不是单引号吗?使用了PHP开始标志的缩写形式?并且没有用“<br/>”而是用了“<BR>”?

  在找出了实际错误后,我又在上面找到的问题后面加了注释。这足够让这份答卷从“正确”转变为“发人深省”了,这也给我的申请加了不少分,所以他们决定聘用我。(但最后我拒绝了,因为我喜欢紧凑的生活节奏,并将自己的PHP技能奉献给我的客户,而不是一家涉猎电信市场的公司。我需要一个舞台来大展身手。)

  那么接下来就来看看我写的10条PHP编程习惯吧:

1、使用单引号括起来的字符串

  当使用双引号来括字符串时,PHP解释器会对其进行变量替换、转义等操作,如“\n”。如果你只想输出一个基本的字符串,就用单引号吧,这样会节省一些资源。当然,如果你需要进行变量替换的,那就必须用双引号了,但其他情况下还是用单引号吧。

2、字符串的输出

  你认为以下哪一条语句的运行速度最快?
复制PHP内容到剪贴板
PHP代码:
print "Hi my name is $a. I am $b";
echo "Hi my name is $a. I am $b";
echo "Hi my name is ".$a.". I am ".$b;
echo "Hi my name is ",$a,". I am ",$b;
echo ‘Hi my name is ‘,$a,’. I am ‘,$b;

  也许这看起来很奇怪,但事实上最后一条的运行速度是最快的。print比echo要慢,在字符串中进行变量替换时会慢,而连接字符串要比用逗号连接来得慢,最后一句则是第一个习惯的体现。所以,不在字符串中进行变量替换不仅会加快程序运行速度,也会让你的代码在任何语法高亮显示的编辑器中显得更为易懂(变量会被高亮显示出来)。很少人知道echo的参数可以用逗号连接,且速度会比字符串连接要来得快。最后再用上第一个习惯,那这条语句就非常好了。

3、在数组索引中使用单引号

  正如你在上面的测试题中所看到的,我指出了$x[sales]从严格意义上来说是错误的,索引应该被括起来,即$x['sales']。这是因为PHP会将没有括起来的索引辨认为“裸”字符串,并把它解释为一个常量。当找不到该常量的定义时,才将其解释为一个字符串,所以这条语句才是可运行的。把索引括起来可以省去这部分工作,如果将来正好要用这一字符串定义常量时也就不会有错误了。我甚至听说这样做要快七倍左右的时间,虽然我没有亲自测试过。更多关于这一话题的讨论,请看PHP手册“数组”一章中的的“数组的能与不能”一节。

4、不要使用开始标志的缩写形式

  你正在使用这样的符号吗?“<?”是非常糟糕的符号,它会引起与XML解释器的冲突。而且一旦你发布了这些代码,那么使用者就必须修改php.ini文件来打开对此符号的支持。所以实在没有理由去使用这种形式。用“<?php“吧。

5、尽量不要使用正则表达式

  在进行常规的字符串操作时,尽可能不要去使用正则表达式(preg和ereg系列函数)。str_replace函数要比preg_replace快得多,甚至strtr函数也要比str_replace来得快。省去这些不必要的麻烦吧,你的老板会感谢你的。

6、不要在循环声明中使用函数

  这个问题不单单出现在PHP中,你可以在其他语言的代码中经常看到:

差:for($i=0;$i<count($array);$i++){…}

好:$count=count($array);for($i=0;$i<$count;$i++){…}

  这因该很好解释,但许多人就是想少写一行代码而浪费了系统资源。如果在循环声明中使用了count函数,那每次循环都会调用一次。如果你的循环次数很多,那就会浪费非常多的时间。

7、永远不要使用register_globals和magic quotes

  这是两个很古老的功能,在当时(十年前)也许是一个好方法,但现在看来并非如此。老版本的PHP在安装时会默认打开这两个功能,这会引起安全漏洞、编程错误及其他的问题,如只有用户输入了数据时才会创建变量等。如今这两个功能都被舍弃了,所以每个程序员都应该避免使用。如果你过去的程序有使用这两项功能,那就尽快将其剔除吧。

8、一定要对变量进行初始化(这里的“初始化”指的是“声明”——译者注)

  当需要没有初始化的变量,PHP解释器会自动创建一个变量,但依靠这个特性来编程并不是一个好主意。这会造成程序的粗糙,或者使代码变得另人迷惑,因为你需要探寻这个变量是从哪里开始被创建的。另外,对一个没有初始化的变量进行递增操作要比初始化过的来得慢。所以对变量进行初始化会是个不错的主意。

9、对代码进行注释

  这个问题已经提过很多次了,但再多次也不够。我知道有些地方是不聘用不对代码进行注释的程序员的。我在前一次工作面试后和副总、面试官一起浏览我写的代码,当他们对我所做的代码注释印象深刻,还了解了一下我的这一习惯。一天之后,我得到了这个工作。

  我知道有些自称为PHP大师的人声称自己的代码写得很好,不需要添加什么注释。在我看来,这些人都是垃圾。学一写注释的规范和技巧,熟悉一下phpDocumentor或Doxygen之类的注释辅助软件,都是值得的。

10、遵循一个编程规范

  关于这一点,是你需要在面试中询问你潜在的老板的,问问他们正在使用什么编程规范。PEAR?Zend?内部规范?要提及你正在使用的编程规范,不管是你自己创建的,还是目前普遍流行的一种。对于PHP这种松松垮垮的语言来说,如果没有一个好的编程规范,那么那些代码就会看起来想一堆垃圾。发臭的,令人作呕的垃圾。一些基本的规范包括空格规范、打括号匹配、命名风格等。这对任何一个追求高质量的代码的人来说都是必须的。

  有人说:“我讨厌你的4个空格的缩进。”我要说,什么?用4个空格来缩进?这比用制表符过占用3个字符的空间。更重要的是,只要是使用比记事本高级的编辑器,你可以自定义制表符的缩进值。所以每个程序员都可以以其最习惯的方式来看代码。可以时设置为4,也可以设置为0(如果你是个受虐狂)。反正我不在乎,但你就是不能用空格来缩进!

  总的来说,我希望以上这些编程习惯可以对你有所帮助。如果你想在面试中留下好印象,只需要一些小细节就可以了。

转自http://www.yeeyan.com/articles/view/38585/11529

heredoc? php..

2009年3月1日 没有评论

我发现了一个熟悉的符号”<<<”,这是什么,有点像C++里的输出符号cout<<,可是那只有两个,其实它的名字叫heredoc,字面理解,应该是标记“这里是文档”,在php里有什么用呢?

<?php
$title="this is title";
$text="this is text";
$who="girl";
if($who!="PHPer"){

echo<<< EOT

$title
<hr>
$text,you can use "quote" without "\"

EOT;
}
实际输出

this is title


this is text,you can use "quote" without "\"

其中EOT只是一个标记,表示end of Template,也可以自己用其他名字代替,两个EOT中间的部分就是heredoc所要提示的内容,其中变量会直接替换并输出到html,其中双引号也可以直接使用,就像在编辑html文本一样,估计php设计这个是为了在程序中更好的控制显示输出吧,不过这个符号看起来觉得怪怪的

php错误”Cannot modify header information – headers already sent by”

2008年11月14日 没有评论

<?php

header(‘Content-Type: text/xml’);

echo “<?xml version=’1.0′ ?>

<root>

    hello,world!

</root>”;

?>

这是一个简单的php输出xml格式脚本,用firefox的firebug,总是提示”Cannot modify header information – headers already sent by”..

这都是因为utf-8编码文件含有的bom原因,而php4,5都是不支持bom的。去掉bom,可以用uultraedit打开,另存为时选择“utf-8 无BOM”解决..

cakephp乱码问题解决原则

2008年11月10日 没有评论

cakephp这个框架的却很不错,一开始使用的时候,中文乱码问题是一个老生长谈的话题,其实乱码分为两种情况,一个是view文件夹下面的thtml文件自身的编码跟vies\layout\文件下文件里定义的charset不一致,这样浏览时就会发生乱码,这种情况下如果从浏览器里手动选择default.cpt里定义的charset一致的编码,即可显示正常,还有一种情况就是数据库的乱码问题,如果数据库自身的编码 跟 \cake\app\config\database.php 里的encoding不一致,或者跟页面显示用的charset不一致,也会产生乱码。

其实处理乱码只要遵循这个原则就行了:数据库的编码,\cake\app\config\database.php的encoding,\cake\app\views\layouts\default.cpt里的charset,还有thtml的编码全部保持一致就行了。

php中$_SERVER参数HTTP_X_FORWARDED_FOR & REMOTE_ADDR与获取IP

2007年12月16日 没有评论

在PHP 中使用 $_SERVER["REMOTE_ADDR"] 来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取。

不过要注意的事,并不是每个代理服务器都能用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取客户端的真实 IP,有些用此方法读取到的仍然是代理服务器的 IP。

还有一点需要注意的是:如果客户端没有通过代理服务器来访问,那么用$_SERVER["HTTP_X_FORWARDED_FOR"] 取到的值将是空的。因此,如果要在程序中使用此方法,可以这样处理:

<?php

if ($_SERVER["HTTP_X_FORWARDED_FOR"]==”")

{

$user_ip=$_SERVER["REMOTE_ADDR"];

}

else

$user_ip=$_SERVER["HTTP_X_FORWARDED_FOR"];

?>

即:如果客户端通过代理服务器,则取 HTTP_X_FORWARDED_FOR 的值,如果没通过代理服务器,就取 REMOTE_ADDR 的值。

获得客户端真实的IP地址

function GetIP(){

if (getenv(“HTTP_CLIENT_IP”) && strcasecmp(getenv(“HTTP_CLIENT_IP”), “unknown”))

$ip = getenv(“HTTP_CLIENT_IP”);

else if (getenv(“HTTP_X_FORWARDED_FOR”) && strcasecmp(getenv(“HTTP_X_FORWARDED_FOR”), “unknown”))

$ip = getenv(“HTTP_X_FORWARDED_FOR”);

else if (getenv(“REMOTE_ADDR”) && strcasecmp(getenv(“REMOTE_ADDR”), “unknown”))

$ip = getenv(“REMOTE_ADDR”);

else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], “unknown”))

$ip = $_SERVER['REMOTE_ADDR'];

else

$ip = “unknown”;

return($ip);

}