當前位置:首頁 » 編程語言 » 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;
}

熱點內容
jd源碼 發布:2025-01-21 12:58:19 瀏覽:643
ftp非阻塞 發布:2025-01-21 12:55:46 瀏覽:426
一般轎車買哪個配置 發布:2025-01-21 12:47:26 瀏覽:233
高強度加密大師解密 發布:2025-01-21 12:41:56 瀏覽:188
腳本精靈開發平台 發布:2025-01-21 12:41:54 瀏覽:61
haproxy演算法 發布:2025-01-21 12:31:05 瀏覽:679
雲伺服器集合 發布:2025-01-21 12:30:17 瀏覽:381
如何給客戶講解代理伺服器 發布:2025-01-21 12:29:31 瀏覽:72
兩g顯卡開守望先鋒什麼配置 發布:2025-01-21 12:27:05 瀏覽:559
趣字演算法 發布:2025-01-21 12:27:02 瀏覽:842