当前位置:首页 » 编程语言 » php代码分析

php代码分析

发布时间: 2022-04-15 19:19:39

1. php源码分析之DZX1.5随机数函数random用法

本文实例讲述了php源码分析之DZX1.5随机数函数random用法。分享给大家供大家参考。具体如下:
<?php
/**
*
@param
int
$length:
随机数长度
*
@param
int
$numeric:
0或非0,其中0表示随机数由全数字组成,非0表示随机数由全字母组成
*
@return
string:
返回生成的随机数
*/
function
random($length,
$numeric
=
0)
{
$seed
=
base_convert(md5(microtime().$_SERVER['DOCUMENT_ROOT']),
16,
$numeric
?
10
:
35);
$seed
=
$numeric
?
(str_replace('0',
'',
$seed).'012340567890')
:
($seed.'zZ'.strtoupper($seed));
$hash
=
'';
$max
=
strlen($seed)
-
1;
for($i
=
0;
$i
<
$length;
$i++)
{
$hash
.=
$seed{mt_rand(0,
$max)};
}
return
$hash;
}
echo
random('15',1);
echo
'<br
/>';
echo
random('15');
/*End
of
php*/
运行结果如下:
228283270677112
SjqffsU76994qfS
希望本文所述对大家的php程序设计有所帮助。

2. 拿到一个php源码怎么分析它用的是什么框架

一。先把源代码安装起来,结合它的文档和手册,熟悉其功能和它的应用方式。
二。浏览源代码的目录结构,了解各个目录的功能。
三。经过以上两步后相信你对这个开源的产品有了一个初步的了解了,那现在就开始分析它的源码吧。这一步我们开始分析源代码框架。例如入口方式是单入口还是多入口,页面之间的调用规则,能根据规则找出某个功能用到的页面。
四。熟悉源代码的代码写作风格,例如缩进方式,排版格式等。
五。熟悉一下源代码用到的数据库和表,可以参考它的技术支持文档。
六。经过以上几步相信大家已经对这份源代码有了更深刻的了解,不过这种了解还只是表面的,下来我们从6个方面具体的去分析它吧:
1.入口构造以及页面调用方式的具体实现,如果阅读时看到工具类和工具函数,尽量去熟悉一下。这一步的分析可以学习到源代码的系统架构方式。
2.分析源代码用到的工具类和工具函数,这样可以学到很多程序编写技巧。可以提升自己编程功力。
3.结合一些安全规则,研究这个源代码是怎样实现安全方面的设计的。这样可以提高自己在安全方面的意识和功力。
4.如果有模板引擎的话,研究一下源代码的模板引擎。大致从实现方式,效率,易用性等几个方面去考虑。
5.研究系统的各个功能模块,这样既能学习编程技巧还能打开自己的编程思路,下次遇到类似的东东就心里有谱了。
6.研究系统所用到设计模式,一样的功能实现,用到的设计模式可能相差很多,对比我们之前所作的东东分析设计模式,是提升我们驾驭代码的不二法门。
7.研究源代码对访问压力,执行效率,系统效率,数据库查询的优化。

3. php代码hash解析

就是生成一段hash值,比md5和sha1更加安全而已

4. php代码解读

<?phpexit;?>//执行结束推出

<!--{subtemplatecommon/header}-->//调用common下的header文件


<!--{eval
empty($appleDownloadUrl)&&$appleDownloadUrl=sprintf("javascript:alert('%s')",Appbyme::t('ios版应用正在发布到Appstore,目前暂时无法下载,请稍后...'));
}-->

//调用css样式
<linkhref="{$assetsBaseUrlPath}/css/download.css"type="text/css"rel="stylesheet">

代码看着像dz的

5. PHP代码解析

<html>
<head>
<meta http-equiv="Content-Type" content="text ml; charset=gb2312">
<title></title>
</head>
<body>
<?php
require_once("db_conn.php");//预加载db_conn.php 看是预加载不是include包含额 页面打开就加载的而且是只加载一次,db_conn.php是连接数据库用的
$sql="select * from message";//列出message表所有字段记录集
$rs=mysql_query($sql);//执行sql得到记录集$rs
$total=mysql_num_rows($rs);//得到记录集总数$total 都是固定套路了
$pagesize=6;//单页记录数赋值为6
$totalpage=ceil($total/$pagesize);//总页数为记录总数除以单页记录数并取整
if(isset($_GET["page"])){
$page=$_GET["page"];
}else{
$page=2;
}//这个if判断就是当前接收页page排错 page为空就为2
$i=$pagesize*($page-1);
$sql.=" limit "."$i ".','." $pagesize";//查询字符串赋值填上限制条件看好是.=而不是=额前面$sql已经赋值成"select * from message"这样就得出了当前页需要查询字符串 要是再不明白看看手册吧 我没能力了
$rr=mysql_query($sql);//老套路执行查询字符串得到记录集
?>

<CENTER><table width="100%" border="1" cellspacing="1" cellpadding="3"></CENTER>
<tr>
<th colspan="7"><CENTER>留言信息浏览</CENTER></th>

</tr>
<CENTER><tr>

<th width="12%" >主题</th>

<th width="30%">留言内容</th>

<th width="18%">留言时间</th>

<th width="10%">留言者</th>

<th width="10%">电子邮箱</th>

<th width="10%">IP地址</th>

<th width="10%">是否删除</th>

</tr></CENTER>

<?php
while ($jg=mysql_fetch_array($rr)) {
?>
<tr>
<td bgcolor="#FFFFFF"><?php echo $jg["m_title"]?></td><!--这些都属输出数组$jg里面的东西---->
<td bgcolor="#FFFFFF"><?php echo $jg["m_content"]?></td>
<td bgcolor="#FFFFFF"><?php echo $jg["m_time"]?></td>
<td bgcolor="#FFFFFF"><?php echo $jg["m_user"]?></td>
<td bgcolor="#FFFFFF"><?php echo $jg["m_mail"]?></td>
<td bgcolor="#FFFFFF"><?php echo $jg["m_ip"]?></td>
<td><center>
<A HREF="contact_delete.php?m_id=<?= $jg["m_id"]?>">删除</A><BR> <!-- 用来向所连接到的地址传递参数 -->
</tr>

<?php
}
?>
<tr>
<!-- <td colspan="2" bgcolor="#FFFFFF"> -->
<?php
$first=1;//首页初始化赋值为1
$pre=$page-1;//得到前页
$next=$page+1;//得到下页
$last=$pagesize;//得到末页
if($page>1){
echo "<a href =".$_SERVER['PHP_SELF']."?page=".$first.">首页</a>";
echo "<a href =".$_SERVER['PHP_SELF']."?page=".$pre.">上页</a>";
}
if($page<$totalpage){
echo "<a href =".$_SERVER['PHP_SELF']."?page=".$next.">下页</a>";
echo "<a href =".$_SERVER['PHP_SELF']."?page=".$last.">末页</a>";
}//这个if判断就是防止page超出报错的 这你要是再看明白还是那句老话 看看手册吧...
//5分少了点 打字辛苦^-^
?>
</td>
</tr>
</table>

</body>
</html>

6. 从php核心代码分析require和include的区别

在php手册中:
require() is identical to include() except upon failure it will also proce a fatal E_ERROR level error. In other words, it will halt the script whereas include() only emits a warning (E_WARNING) which allows the script to continue.
就是说在失败的时候,require是会中止php运行的,而include是可以继续运行的。
倒底有什么样的区别呢?我们带着这个疑问来一起进入PHP的核心代码。
下面是一个PHP运行过程的图(这个图是出自哪里的?鸟哥画的?)

补习一下:lex是代码扫描器,扫描代码用的,yacc是Yet Another Compiler Compiler,作用是把任何一种代码的语法转成yacc语法,yacc就是解析器(真TMD绕)。
lex在c下的后缀是*.l yacc是*.y
正题
下面看操作记录:
cc@cc-laptop:/opt/workspace$ svn checkout http://svn.php.net/repository/php/php-src/branches/PHP_5_3 php-src-5.3
从svn取最新的php源代码。
开始深入:
cc@cc-laptop:/opt/workspace/php-src-5.3$ find . -type f -name “*.l” -exec grep -Hn “require_once” {} \;
./Zend/zend_language_scanner.l:1093:”require_once” {
寻找lex代码扫描器文件中出现require_once的地方,zend_language_scanner.l的1093行。
1093 “require_once” {
1094 return T_REQUIRE_ONCE;
1095 }
然后再搜一下T_REQUIRE_ONCE,
cc@cc-laptop:/opt/workspace/php-src-5.3$ find . -type f -name “*.y” -exec grep -Hn “T_INCLUDE” {} \;
./Zend/zend_language_parser.y:52:%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE
./Zend/zend_language_parser.y:985: | T_INCLUDE expr { zend_do_include_or_eval(ZEND_INCLUDE, &$$, &$2 TSRMLS_CC); }
./Zend/zend_language_parser.y:986: | T_INCLUDE_ONCE expr { zend_do_include_or_eval(ZEND_INCLUDE_ONCE, &$$, &$2 TSRMLS_CC); }
在985行附近,有这样一群代码:
internal_functions_in_yacc:
T_ISSET ‘(‘ isset_variables ‘)' { $$ = $3; }
| T_EMPTY ‘(‘ variable ‘)' { zend_do_isset_or_isempty(ZEND_ISEMPTY, &$$, &$3 TSRMLS_CC); }
| T_INCLUDE expr { zend_do_include_or_eval(ZEND_INCLUDE, &$$, &$2 TSRMLS_CC); }
| T_INCLUDE_ONCE expr { zend_do_include_or_eval(ZEND_INCLUDE_ONCE, &$$, &$2 TSRMLS_CC); }
| T_EVAL ‘(‘ expr ‘)' { zend_do_include_or_eval(ZEND_EVAL, &$$, &$3 TSRMLS_CC); }
| T_REQUIRE expr { zend_do_include_or_eval(ZEND_REQUIRE, &$$, &$2 TSRMLS_CC); }
| T_REQUIRE_ONCE expr { zend_do_include_or_eval(ZEND_REQUIRE_ONCE, &$$, &$2 TSRMLS_CC); }
;
于是乎,我们需要继续深入寻找zend_do_include_or_eval,
cc@cc-laptop:/opt/workspace/php-src-5.3$ find . -type f -name “*.c” -exec grep -Hn “zend_do_include_or_eval” {} \;
./Zend/zend_compile.c:4317:void zend_do_include_or_eval(int type, znode *result, const znode *op1 TSRMLS_DC) /* {{{ */
zend_do_include_or_eval中组装了一个结构体,ZEND_INCLUDE_OR_EVAL。
再在zend_vm_def.h中找到ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMP|VAR|CV, ANY):
switch (Z_LVAL(opline->op2.u.constant)) {代码略}
中间关键的一句是:
new_op_array = compile_filename(Z_LVAL(opline->op2.u.constant), inc_filename TSRMLS_CC);
在zend_complie.h文件中:
ZEND_API zend_op_array *compile_filename(int type, zval *filename TSRMLS_DC);
这个函数定义在zend_language_scaner.l文件中,找出最核心的代码:
if (open_file_for_scanning(file_handle TSRMLS_CC)==FAILURE) {
// require与include的差别:错误信息的显示级别(有lout和无lout)
if (type==ZEND_REQUIRE) { //require时
zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename TSRMLS_CC);
zend_lout();
} else {
zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename TSRMLS_CC);
}
compilation_successful=0;
} else {代码略}
继续追踪zend_message_dispatcher可以在main/main.c文件中找到php_message_handler_for_zend函数:
//include输出错误信息时的级别为:E_WARNING
case ZMSG_FAILED_INCLUDE_FOPEN:
php_error_docref(“function.include” TSRMLS_CC, E_WARNING, “Failed opening ‘%s' for inclusion (include_path='%s')”, php_strip_url_passwd((char *) data), STR_PRINT(PG(include_path)));
break;
//require输出错误信息时的级别为:E_COMPILE_ERROR
代码略
总结
和开头PHP手册所说完全一致,require和include的区别在于,出现错误时,一个是error一个是warning。

7. PHP代码解读

defined('BASE_PATH')是否定义了BASE_PATH
or define('BASE_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);

没有的话,就定义BASE_PATH

8. PHP是如何执行代码解析过程的

就PHP语言来说,它也是一组符合一定规则的约定的指令。 在编程人员将自己的想法以php语言实现后,通过PHP的虚拟机(确切的来说应该是PHP的语言引擎Zend)将这些PHP指令转变成c语言 (可以理解为更底层的一种指令集)指令,而c语言又会转变成汇编语言, 最后汇编语言将根据处理器的规则转变成机器码执行。这是一个更高层次抽象的不断具体化,不断细化的过程。

9. php代码是怎么被解析的

php代码的编译分4个步骤(下面4步参考依据:chenglin博客);
1.Scanning(Lexing) 将PHP代码转换为语言片段(Tokens);
2.Parsing 将Tokens转换成简单而有意义的表达式;
3.Compilation 将表达式编译成Opocdes;
4.Execution 按顺序执行Opcodes,每次一条,从而实现PHP脚本的功能。

10. config.php中开始一段代码分析

楼上的别乱说,isset()不是自定义函数,而是PHP内建函数,一般用来检测变量或对象是否存在
而unset()相反是删除变量或对象。
我觉得这样写法是很实用的写法,代码又简化。
//当$_REQUEST['type']存在时$type=$_REQUEST['type']否则='setup,setup相当是默认值
$type = isset($_REQUEST['type'])?$_REQUEST['type']:'setup';
//同上
$display = isset($_REQUEST['display'])?$_REQUEST['display']:'';

//当$_REQUEST['restrictmods']存在时
if (isset($_REQUEST['restrictmods'])) {
//把$_REQUEST['restrictmods']插分为数组到 $restrict_mods
$restrict_mods = explode('/',$_REQUEST['restrictmods']);
//反转数组,就是说键名变为值,值变为键名
$restrict_mods = array_flip($restrict_mods);
} else {
//否则设置$restrict_mods为false
$restrict_mods = false;
}

热点内容
phpif循环 发布:2025-01-21 16:40:36 浏览:874
js代码编译器 发布:2025-01-21 16:35:47 浏览:180
阿特兹蓝天时尚版有哪些配置 发布:2025-01-21 16:32:59 浏览:469
怎么把安卓手机视频导入苹果ipad 发布:2025-01-21 16:10:43 浏览:997
c语言实现编译器 发布:2025-01-21 16:03:19 浏览:392
做解压橡皮 发布:2025-01-21 15:03:06 浏览:991
双系统win访问mac 发布:2025-01-21 14:53:52 浏览:485
安卓车机系统如何安装carplay 发布:2025-01-21 14:52:24 浏览:590
sql操作手册 发布:2025-01-21 14:46:08 浏览:312
青橙脚本 发布:2025-01-21 14:44:05 浏览:219