一家之言的經驗之談php+mysql扎實個人基本功

一. 10句話
1.不要依賴register_global=ON的環境,從你剛懂得配置php運行環境甚至尚不明白register_global的ON/OFF會對自己有什么影響的那天起,就應該勇敢地把它設為OFF.
2.寫程序前看看怎么用error_reporting.
3.不懂就問本身沒錯,但你需要在那之前查查手冊。
4.當然,你需要懂得使用手冊。手冊上找不到答案的時候,應該考慮下網絡上的搜索引擎。
5.剛學會php+mysql之后,不要叫嚷著要寫論壇,要寫XXX。要明白,剛學會寫漢字并不表示你有能力寫詩。
6.在學web編程的時候,你應該先去認識html這個朋友。
7.有點能力后,試著回答新手的問題,不要看到自己懂的而別人不懂就沾沾自喜,扔下一名“簡單,那是基本的東西”就走更要不得。
8.思考是一個好習慣,不動手去寫就等于空想,什么也沒有。
9.寫好一段程序,如果覺得很滿意,一周后再看一遍,也許你會認為它應該有所改變
10.有空多看看別人的程序,找出他人的不足或優點,自己掂量。

二. 各取所需

1.善于使用“引用”,它能直接影響到程序的效率。

2.善于用三元運算子,可以讓程式較精簡有效率。
比如:

CODE:
[Copy to clipboard]
<?php
if ($data[$i]['nickname'])
{
    $nickname =  $data[$i]['nickname'];
}
else
{
    $nickname =  $data[$i]['ip'];
}
?>
可以寫成:

CODE:
[Copy to clipboard]
<?php
$nickname =  $data[$i]['nickname'] ? $data[$i]['nickname'] : $data[$i]['ip'];
?>
3.善于組織if...else...回圈
比如:

CODE:
[Copy to clipboard]
<?php
$ext_name = strtolower(str_replace(".", "", strrchr($upfilename, ".")));
if (!empty($type))
{
    if (!strpos($type, $ext_name))
    {
        echo "Please upload the file of $type form.";
        exit();
    }
}
?>
上面的代碼你應該寫成這樣:

CODE:
[Copy to clipboard]
<?php
$ext_name = strtolower(str_replace(".", "", strrchr($upfilename, ".")));
if (!($type==='') && strpos($type, $ext_name)===false)
{
    echo "Please upload the file of $type form.";
    exit();
}
?>
4.盡量讓你的代碼清淅些
如果寫成這樣,是比較讓人頭痛的:

CODE:
[Copy to clipboard]
<?php
$foo=$_post["foo"];
   $username=$_post["user"]; 
$group=$_POST["group"];
if ($group=="wheel"){
$username=$username."wheel";
}
?>
同樣的代碼,這樣就比較讓人看得舒服了:

CODE:
[Copy to clipboard]
<?php
$foo      = $_post["foo"];
$username = $_post["username"];
$group    = $_POST["group"];
if ($group=="wheel")
{
    $username = $username."wheel";
}
?>
當然,有一定基礎后,你應該要寫成這樣:

CODE:
[Copy to clipboard]
<?php
$foo      = &$_POST['foo'];
$username =  $_POST["group"]!='wheel' ? $_POST["username"] : $_POST["username"].'wheel';
?>
5.編寫規范的mysql 語句。
字段和表名用"`"引起來,避免保留字的影響。
如果看到下面這樣的一個sql query,會讓人比較頭痛:

CODE:
[Copy to clipboard]
<?php
$query="select `flash_comment`.`content` , `flash_comment`.`nickname` , `flash_comment`.`date` , `flash_comment`.`ip` , `product`.`p_name` , `sgflash`.`fid` from `flash_comment` left join `product` on ( `flash_comment`.`p_no` = `product`.`p_no` ) left join `sgflash` on ( `product`.`p_name` = `sgflash`.`f_name` ) where `flash_comment`.`p_no` != '' order by `flash_comment`.`date`";
?>
同樣的一個query,寫成這樣就令人看得明白得多了:

CODE:
[Copy to clipboard]
<?php
$query = "SELECT `flash_comment`.`content` , `flash_comment`.`nickname` , `flash_comment`.`date` , `flash_comment`.`ip` , `product`.`p_name` , `sgflash`.`fid` 
          FROM `flash_comment` 
          LEFT JOIN `product` ON ( `flash_comment`.`p_no` = `product`.`p_no` ) 
          LEFT JOIN `sgflash` ON ( `product`.`p_name` = `sgflash`.`f_name` ) 
          WHERE `flash_comment`.`p_no` != ''
          ORDER BY `flash_comment`.`date`";
?>
//
.....

(忙工作去了)待續...

作者: Van.T   發布時間: 2004-05-08

精典!
咱學著,奮斗著!

作者: yjjqtdht   發布時間: 2004-05-08

好啊

作者: yuguanglou   發布時間: 2004-05-08

思:從一點一滴做起。

作者: wormbaby   發布時間: 2004-05-08

to 樓主: 對于你所說的擅于用"引用", 速度更快.本人可不敢茍同.

PHP中使用引用有時速度會比不用引用速度慢很多.

不信?? 在一個函數中傳遞一個很大的數組,然后多調用幾次這個函數..去掉引用再調用相同次,看結果哪個快.

作者: 帥的像人渣   發布時間: 2004-05-08

看似簡單,但往往被我們忽略了

不錯,頂一把

作者: pooer   發布時間: 2004-05-08



QUOTE:
最初由 帥的像人渣 發布
[B]to 樓主: 對于你所說的擅于用"引用", 速度更快.本人可不敢茍同.

PHP中使用引用有時速度會比不用引用速度慢很多.

不信?? 在一個函數中傳遞一個很大的數組,然后多調用幾次這個函數..去掉引用再調用相同次,看結果哪個快. [/B]
呵,我哪里說了速度更快?
寫任何程序都要按實際需要而寫的,否則就是犯教條主義了
我所說的“善于使用”,并不是盲目使用。

作者: Van.T   發布時間: 2004-05-08



QUOTE:
善于使用“引用”,它能直接影響到程序的效率
你的效率是指?

作者: 帥的像人渣   發布時間: 2004-05-08

寫得不錯

作者: ljbb   發布時間: 2004-05-08



QUOTE:
最初由 帥的像人渣 發布
[B]你的效率是指? [/B]
你理解為什么? 
另外,你所理解的"引用"是什么?它存在的意義在于什么?

作者: Van.T   發布時間: 2004-05-08

我只是隨便問問這個效率是指什么??

所以和你抬抬杠..  

別介意.

作者: 帥的像人渣   發布時間: 2004-05-08

人渣這個可說錯,引用的效率的確是高,下面是照你說的的測試代碼,大家跑一下就知道誰更快了:

CODE:
[Copy to clipboard]
<?php

function getmicrotime()

   list($usec, $sec) = explode(" ",microtime()); 
   return ((float)$usec + (float)$sec); 


//initialize big array1
$bigArray1 = array();

for($ii=0; $ii<600; $ii++) 
{
    $bigArray1[$ii]=$ii.'value';
}

//initialize big array2
$bigArray2 = array();
for($ii=0; $ii<600; $ii++) 
{
    $bigArray2[$ii]=$ii.'value';
}

//fuction by reference
function passByRef(&$param) 
{
    reset($param);
    while($kek=key($param)) 
    {
        $param[$key] .= '-processed';
        next($param);
    }
}

//function by copy
function passByCopy($param) 
{
    reset($param);
    while($kek=key($param)) 
    {
        $param[$key] .= '-processed';
        next($param);
    }
}

//Call passByRef 50 times
$startTime = getmicrotime();
for($ii=0; $ii<50; $ii++) 
{
    passByRef($bigArray1);
}
$endTime = getmicrotime();
$refTime = $endTime-$startTime;

//Call passByCopy 50 times
$startTime = getmicrotime();
for($ii=0; $ii<50; $ii++) 
{
    passByCopy($bigArray2);
}
$endTime = getmicrotime();
$copyTime =  $endTime-$startTime;

echo('reference time is '.$refTime.'<br>');
echo('copy time is'.$copyTime.'<br>');
?>

作者: shukebeita   發布時間: 2004-05-08

效率問題嘛
還得研究....

作者: wyw5257   發布時間: 2004-05-08

不錯,頂一下~

作者: yourlook   發布時間: 2004-05-08

學習學習!

作者: aks   發布時間: 2004-05-08



CODE:
[Copy to clipboard]
<?php

function getmicrotime()

   list($usec, $sec) = explode(" ",microtime()); 
   return ((double)$usec + (double)$sec); 


//initialize big array1
$bigArray1 = array();

for($ii=0; $ii<600; $ii++) 
{
    $bigArray1[$ii]=$ii.'value';
}

//initialize big array2
$bigArray2 = array();
for($ii=0; $ii<600; $ii++) 
{
    $bigArray2[$ii]=$ii.'value';
}

$i = 0;

//fuction by reference
function passByRef(&$param) 
{
    global $i;

    $i++;

    reset($param);
    while($kek=key($param)) 
    {
        $param[$key] .= '-processed';
        next($param);
    }

    if($i <= 100) passByRef($param);
}

$i = 0;

//function by copy
function passByCopy($param) 
{
    global $i;

    $i++;

    reset($param);
    while($kek=key($param)) 
    {
        $param[$key] .= '-processed';
        next($param);
    }

    if($i < 100) passByCopy($param);
}

//Call passByRef 50 times
$startTime = getmicrotime();
passByRef($bigArray1);

$endTime = getmicrotime();
$refTime = $endTime-$startTime;

//Call passByCopy 50 times
$startTime = getmicrotime();
passByCopy($bigArray2);

$endTime = getmicrotime();
$copyTime =  $endTime-$startTime;

echo('reference time is '.$refTime.'<br>');
echo('copy time is'.$copyTime.'<br>');
?>
不好意思..剛才沒有說清楚..
看看這個例子. 在遞歸時的效率..

作者: 帥的像人渣   發布時間: 2004-05-08

為什么兩個時間相差那么多

作者: aks   發布時間: 2004-05-08

Sorry,你的代碼有問題。正確的寫法應該如下:

CODE:
[Copy to clipboard]
<?php
<?php
function getmicrotime()

   list($usec, $sec) = explode(" ",microtime()); 
   return ((double)$usec + (double)$sec); 

//initialize big array1
$bigArray1 = array();
for($ii=0; $ii<600; $ii++) 
{
    $bigArray1[$ii]=$ii.'value';
}

//initialize big array2
$bigArray2 = array();
for($ii=0; $ii<600; $ii++) 
{
    $bigArray2[$ii]=$ii.'value';
}

//fuction by reference
function passByRef(&$param) 
{
    global $i;
    $i++;
    reset($param);
    while($kek=key($param)) 
    {
        $param[$key] .= '-processed';
        next($param);
    }
    if($i < 100) passByRef($param);
}



//function by copy
function passByCopy($param) 
{
    global $i;
    $i++;
    reset($param);

    while($kek=key($param)) 

    {

        $param[$key] .= '-processed';
        next($param);
    }
    if($i < 100) passByCopy($param);
}

//Call passByRef 50 times
$i=0;//循環計數器歸零
$startTime = getmicrotime();
passByRef($bigArray1);
$endTime = getmicrotime();
$refTime = $endTime-$startTime;

//Call passByCopy 50 times
$i=0; //循環計數器歸零
$startTime = getmicrotime();
passByCopy($bigArray2);
$endTime = getmicrotime();
$copyTime =  $endTime-$startTime;
echo('reference time is '.$refTime.'<br>');
echo('copy time is'.$copyTime.'<br>');
?>
結果還是引用勝出 ;-)

作者: shukebeita   發布時間: 2004-05-08



CODE:
[Copy to clipboard]
<?php
//使用LEFT JOIN
SELECT `sgflash`.`f_name`, `sgflash_comment`.`contents`, `sgflash_comment`.`nickname`, `sgflash_comment`.`date`
FROM `sgflash_comment` LEFT JOIN `sgflash`
ON (`sgflash_comment`.`fid`=`sgflash`.`fid`)
ORDER BY `sgflash_comment`.`date` DESC LIMIT 0, 10000

//不使用LEFT JOIN
SELECT `sgflash`.`f_name`, `sgflash_comment`.`contents`, `sgflash_comment`.`nickname`, `sgflash_comment`.`date`
FROM `sgflash_comment`, `sgflash`
WHERE `sgflash_comment`.`fid`=`sgflash`.`fid` 
ORDER BY `sgflash_comment`.`date` DESC LIMIT 0, 10000
?>
測試對比
顯示行 0 - 29 (10000 總計, 查詢花費 0.6760 秒) 第一次執行用LEFT JOIN
顯示行 0 - 29 (10000 總計, 查詢花費 1.5532 秒) 第二次執行不用LEFT JOIN
顯示行 0 - 29 (10000 總計, 查詢花費 0.6655 秒) 第三次執行使用LEFT JOIN
顯示行 0 - 29 (10000 總計, 查詢花費 1.3730 秒) 第四次執行不合使用LEFT JOIN

作者: Van.T   發布時間: 2004-05-08

高人..

偶也試過了,的確傳遞引用快..  正在找我原來的代碼為什么傳遞引用會慢的原因..

作者: 帥的像人渣   發布時間: 2004-05-08



QUOTE:
最初由 帥的像人渣 發布
[B]高人..

偶也試過了,的確傳遞引用快..  正在找我原來的代碼為什么傳遞引用會慢的原因.. [/B]
一個copy動作,一個是內存指向
你說哪個快?

作者: Van.T   發布時間: 2004-05-08

我當時也這么想,那是去年的一個晚上我試了一晚上,竟然是傳遞拷貝快..

所以我今天才引用并不是什么時候都快,但現在我又試了,傳遞引用確實快多了.

作者: 帥的像人渣   發布時間: 2004-05-08

為什么兩個都是copy  時間也相差那么多?

作者: aks   發布時間: 2004-05-08

時間差上將近一半!

作者: aks   發布時間: 2004-05-08

找到原來的代碼測試..結果,讓我跌眼鏡..COPY竟然還是比REF快...


暈了.

作者: 帥的像人渣   發布時間: 2004-05-08

貼出來大家看看。。。暈倒一大遍更有意思

作者: Van.T   發布時間: 2004-05-08

不錯!!

作者: 一往情深   發布時間: 2004-05-08



QUOTE:
最初由 Van.T 發布
[B]一個copy動作,一個是內存指向
你說哪個快? [/B]
所以俺覺得 for 比 foreach 快,PHP5 比PHP4  快。沒測試,瞎猜的 :p 希望有人來驗證``

作者: Dummy   發布時間: 2004-05-08

學習中!!……

作者: gas2000   發布時間: 2004-05-08

有興趣的可以去看看:
http://www.sitepoint.com/article/object-oriented-php/6

HARRY的建議是,在復雜結構(對象,數組)時,盡量使用引用;而對于普通變量(字符串,整型等等),不必使用(當然還得看情況了。。。;-))

作者: KnightE   發布時間: 2004-05-08

還不懂各位說的引用是啥?

作者: 『殘風』   發布時間: 2004-05-08

不錯,我現在也是盡量規范編碼,容易差錯,也便于以后查看。
這些東西也是要一定經歷后才行的。

作者: huix   發布時間: 2004-05-09

引用當然不是指針,因為PHP與C不同,它建立在比C更高層的應用上,而C是底層的,能訪問物理內存地址,引用的概念來自于面向對象語言,對對象進行賦值操作,就是引用變量的一種例子,將對象引用給一個變量,比如在JAVA中將對象=給左邊的變量,并非是變量的拷貝,而是引用,對被符值的變量的操作,相當于對右邊對象的操作,引用與指針不同的是,引用變量與所賦對象是代碼同一個值,只是一個別名,而指針是物理地址,從高層上看引用有點像指針,但PHP由C++編寫(PHP只是C++編寫出來的一個軟件),他的引用從底層語言來看,或許經過好多指針及拷貝同時作用的過程才完成高層的一個引用

作者: mrfool   發布時間: 2004-05-09

增長見識,學習學習.

作者: 水若寒   發布時間: 2004-05-13

學習學習

作者: digadu   發布時間: 2004-05-13

說得好!收下了

作者: 劉世雄   發布時間: 2004-05-13

有點暈頭,嗯,

程序呀!!!

作者: myowngod   發布時間: 2004-05-13

丫的,這才是群英討論技術交流的帖子嘛!!!

頂一把....

作者: pooer   發布時間: 2004-05-13

恩,學習學習

作者: 鋼盅鍋子   發布時間: 2004-05-13

我也說一句,大多時候,遞歸比推理要慢。
但是,遞歸層次比較少的時候我還是喜歡用。
感覺比較清晰,可擴充性強一些。

作者: 日出東方XP   發布時間: 2004-05-13

我靠,這么多精典,等咱學會,俺老了!老了!^-^

作者: yjjqtdht   發布時間: 2004-05-13

??嗦:
$foo      = $_post["foo"];
$username = $_post["username"];
$group    = $_POST["group"];

作者: xltxlm   發布時間: 2004-05-14

????這個貼子二樓子的啊。加點透明的東東進去先!!!!

作者: 火龍sky2號   發布時間: 2004-05-14

都是大俠,說的如此。。。
俺閉嘴

作者: 游子云   發布時間: 2004-05-14



QUOTE:
最初由 日出東方XP 發布
[B]我也說一句,大多時候,遞歸比推理要慢。
但是,遞歸層次比較少的時候我還是喜歡用。
感覺比較清晰,可擴充性強一些。 [/B]
什么叫推理?!

作者: fivebull   發布時間: 2004-05-14

問一下下面這句是什么意思?
LEFT JOIN `product` ON

作者: jicker   發布時間: 2004-05-14

不參加技術談論(因為不會)。只賺錢(因為沒錢)。

作者: sky_travel   發布時間: 2004-05-14

//fuction by reference
function passByRef(&$param)    //這個地方&$param加&有什么用啊?
{
    global $i;
    $i++;
    reset($param);
    while($kek=key($param))
    {
        $param[$key] .= '-processed';
        next($param);
    }
    if($i < 100) passByRef($param);
}

作者: yueyang   發布時間: 2004-05-14

暈了


呵呵


灌水捎帶頂一下

作者: 波洛   發布時間: 2004-05-15



QUOTE:
最初由 yueyang 發布
[B]//fuction by reference
function passByRef(&$param)    //這個地方&$param加&有什么用啊?
{
    global $i;
    $i++;
    reset($param);
    while($kek=key($param))
    {
        $param[$key] .= '-processed';
        next($param);
    }
    if($i < 100) passByRef($param);
} [/B]
寫個簡單的例子,自己運行一下看看

CODE:
[Copy to clipboard]
<?php
$var = 100;
fvar($var);
function fvar(&$var)
{
    $var += 100;
}
echo $var;
?>

作者: Van.T   發布時間: 2004-05-15

高手啊
佩服!!!

作者: 渺茫   發布時間: 2004-05-15

佩服ing,希望快點看到續篇。

作者: Tung   發布時間: 2004-05-15

我非常遺憾的告訴大家,大家這么多的討論都浪費了。非常抱歉,這一次我錯了通過'&'給函數傳遞參數會比較慢,我在速度測試的例子里面有一個非常低級的錯誤,在這里向 Van T ,人渣和千千萬萬頂貼字的人表示深深的歉意。尤其是人渣,實在是對不起,還讓你在這件事情上費心了。
修改后的速度測試:

CODE:
[Copy to clipboard]
<?php

function getmicrotime()

   list($usec, $sec) = explode(" ",microtime()); 
   return ((float)$usec + (float)$sec); 


//initialize big array1
$bigArray1 = array();

for($ii=1; $ii<20; $ii++) 
{
    $bigArray1[$ii]=$ii.'value';
}

//initialize big array2
$bigArray2 = array();
for($ii=1; $ii<20; $ii++) 
{
    $bigArray2[$ii]=$ii.'value';
}

//fuction by reference
function passByRef(&$param) 
{
    //var_dump($param);
    reset($param);
    while($kek=key($param)) 
    {
        $param[$key].='-Processed';
        echo($param[$key]) ;
        next($param);
    }
}

//function by copy
function passByCopy($param) 
{
    //var_dump($param);
    reset($param);
    while($kek=key($param)) 
    {
        
        $param[$key].='-Processed';
        echo $param[$key] ;
        next($param);
    }
}

//Call passByRef 50 times
$startTime = getmicrotime();
for($ii=0; $ii<5; $ii++) 
{
    passByRef($bigArray1);
}
$endTime = getmicrotime();
$refTime = $endTime-$startTime;

//Call passByCopy 50 times
$startTime = getmicrotime();
for($ii=0; $ii<5; $ii++) 
{
    passByCopy($bigArray2);
}
$endTime = getmicrotime();
$copyTime =  $endTime-$startTime;

echo('<hr>Array Test reference time is '.$refTime.'<br>');
echo('Array Test copy time is'.$copyTime.'<br>');
?>
如果不帶輸出兩種方法的速度差距不算大,引用方式的稍慢一些。
十分抱歉 :blowzy:

作者: shukebeita   發布時間: 2004-05-15



QUOTE:
最初由 shukebeita 發布
[B]我非常遺憾的告訴大家,大家這么多的討論都浪費了。非常抱歉,這一次我錯了通過'&'給函數傳遞參數會比較慢,我在速度測試的例子里面有一個非常低級的錯誤,在這里向 Van T ,人渣和千千萬萬頂貼字的人表示深深的歉意。尤其是人渣,實在是對不起,還讓你在這件事情上費心了。
修改后的速度測試:

CODE:
[Copy to clipboard]
<?php

function getmicrotime()

   list($usec, $sec) = explode(" ",microtime()); 
   return ((float)$usec + (float)$sec); 


//initialize big array1
$bigArray1 = array();

for($ii=1; $ii<20; $ii++) 
{
    $bigArray1[$ii]=$ii.'value';
}

//initialize big array2
$bigArray2 = array();
for($ii=1; $ii<20; $ii++) 
{
    $bigArray2[$ii]=$ii.'value';
}

//fuction by reference
function passByRef(&$param) 
{
    //var_dump($param);
    reset($param);
    while($kek=key($param)) 
    {
        $param[$key].='-Processed';
        echo($param[$key]) ;
        next($param);
    }
}

//function by copy
function passByCopy($param) 
{
    //var_dump($param);
    reset($param);
    while($kek=key($param)) 
    {
        
        $param[$key].='-Processed';
        echo $param[$key] ;
        next($param);
    }
}

//Call passByRef 50 times
$startTime = getmicrotime();
for($ii=0; $ii<5; $ii++) 
{
    passByRef($bigArray1);
}
$endTime = getmicrotime();
$refTime = $endTime-$startTime;

//Call passByCopy 50 times
$startTime = getmicrotime();
for($ii=0; $ii<5; $ii++) 
{
    passByCopy($bigArray2);
}
$endTime = getmicrotime();
$copyTime =  $endTime-$startTime;

echo('<hr>Array Test reference time is '.$refTime.'<br>');
echo('Array Test copy time is'.$copyTime.'<br>');
?>
如果不帶輸出兩種方法的速度差距不算大,引用方式的稍慢一些。
十分抱歉 :blowzy: [/B]
循環次數5次,速度基本相當~
我試了在50次以上,REFE比COPY略快的說~

作者: 秀津   發布時間: 2004-05-15

如果帶上輸出的話copy就會快一些。

作者: shukebeita   發布時間: 2004-05-15

樓上是$kek還是$key?

作者: Van.T   發布時間: 2004-05-15

死光光了,這回糗大了。又犯了一個錯。(常在河邊走,難免會濕鞋)
那個應該是$key。如果不帶輸出(echo)引用速度稍快。如果帶輸出copy方式快一些。

作者: shukebeita   發布時間: 2004-05-15



CODE:
[Copy to clipboard]
<?php
function getmicrotime()

   list($usec, $sec) = explode(" ",microtime()); 
   return ((float)$usec + (float)$sec); 
}

$arrvar = array();
for($i=0; $i<10000; $i++) 
{
    $arrvar[$i] = $i;
}

function passByRef(&$param)
{
    reset($param);
    while ( list( $key, $val ) = each($param) ) {
        if ($key%1000==0)
        {
            echo $param[$key]."<br>";
        } 
    }
}

function passByCopy($param)
{
    reset($param);
    while ( list( $key, $val ) = each($param) ) {
        if ($key%1000==0)
        {
            echo $param[$key]."<br>";
        } 
    }
}

$startTime = getmicrotime();
passByRef($arrvar);
$endTime = getmicrotime();
$refTime = $endTime-$startTime;

$startTime = getmicrotime();
passByCopy($arrvar);
$endTime = getmicrotime();
$copyTime = $endTime-$startTime;

echo('<hr>Array Test reference time is '.$refTime.'<br>');
echo('Array Test copy time is'.$copyTime.'<br>');
?>
結果:
Array Test reference time is 0.0379199981689
Array Test copy time is0.0547819137573

作者: Van.T   發布時間: 2004-05-15

同樣有輸出,還是引用快。

作者: Van.T   發布時間: 2004-05-15

如果每一個元素都輸出引用就不快樂。你每各1000個才輸出一次,循環中大部分時間還是沒有輸出的所以就是這個結果了。

作者: shukebeita   發布時間: 2004-05-15



CODE:
[Copy to clipboard]
<?php
function getmicrotime()

   list($usec, $sec) = explode(" ",microtime()); 
   return ((float)$usec + (float)$sec); 
}

$arrvar = array();
for($i=0; $i<10000; $i++) 
{
    $arrvar[$i] = $i;
}

function passByRef(&$param)
{
    reset($param);
    while ( list( $key, $val ) = each($param) ) {
       // if ($key%1000==0)
        //{
            echo $param[$key]."<br>";
      //  } 
    }
}

function passByCopy($param)
{
    reset($param);
    while ( list( $key, $val ) = each($param) ) {
       // if ($key%1000==0)
       // {
            echo $param[$key]."<br>";
       // } 
    }
}

$startTime = getmicrotime();
passByRef($arrvar);
$endTime = getmicrotime();
$refTime = $endTime-$startTime;

$startTime = getmicrotime();
passByCopy($arrvar);
$endTime = getmicrotime();
$copyTime = $endTime-$startTime;

echo('<hr>Array Test reference time is '.$refTime.'<br>');
echo('Array Test copy time is'.$copyTime.'<br>');
?>
Array Test reference time is 0.289776086807
Array Test copy time is0.751796960831

還是引用快。

作者: Van.T   發布時間: 2004-05-15

而且相差太遠了

作者: Van.T   發布時間: 2004-05-15

懶得和大家爭..

個人試難結果可能都不一樣.

你用兩個循環, 分別歷遍數組兩次結果都不同呢..

作者: 帥的像人渣   發布時間: 2004-05-15

Array Test reference time is 0.221124172211
Array Test copy time is1.36047697067

執行三次, ref 的從0。18------到0。22----------
                      copy 從1。11-------到1。36-----------

作者: graymice   發布時間: 2004-05-15

我試了幾次,如果沒有輸出,引用確實會快,如果有輸出則測試結果很難確定。
第一次:
Array Test reference time is 0.329555988312
Array Test copy time is0.17404294014
第二次:
Array Test reference time is 0.137151002884
Array Test copy time is0.175014972687
第三次:
Array Test reference time is 0.151031970978
Array Test copy time is0.174519062042
第四次:
Array Test reference time is 0.405555963516
Array Test copy time is0.287677049637
第五次:
Array Test reference time is 0.245956897736
Array Test copy time is0.403090953827

作者: shukebeita   發布時間: 2004-05-15



QUOTE:
最初由 shukebeita 發布
[B]我試了幾次,如果沒有輸出,引用確實會快,如果有輸出則測試結果很難確定。
第一次:
Array Test reference time is 0.329555988312
Array Test copy time is0.17404294014
第二次:
Array Test reference time is 0.137151002884
Array Test copy time is0.175014972687
第三次:
Array Test reference time is 0.151031970978
Array Test copy time is0.174519062042
第四次:
Array Test reference time is 0.405555963516
Array Test copy time is0.287677049637
第五次:
Array Test reference time is 0.245956897736
Array Test copy time is0.403090953827 [/B]
你測我那段代碼,不管多少次,引用差不多都比COPY快一倍

作者: Van.T   發布時間: 2004-05-15



QUOTE:
最初由 fivebull 發布
[B]什么叫推理?! [/B]
推理就是if ... else ...
比如舉個簡單的例子讓你求1 - 10000 的和,

你可以用比較比較用推理和遞歸的差距。

好多書上都用求階乘的例子講遞歸,其實用的并不恰當。

作者: 日出東方XP   發布時間: 2004-05-15

上邊的數據就是用你的代碼跑的。在我這邊就是這樣了。

作者: shukebeita   發布時間: 2004-05-15

PHP都不同..

作者: 帥的像人渣   發布時間: 2004-05-15

引不引用跟內存關系比較大吧~~~~~~~~~~

作者: 網絡混混   發布時間: 2004-05-16

學習

作者: sai1691   發布時間: 2004-05-16

光帖測試結果,意義不大...
肯定和環境有關的.

作者: KnightE   發布時間: 2004-05-16

我是新手,看不懂

作者: pingfan88   發布時間: 2004-05-16

寬帶一出。。。。萬事俱休

作者: 開心果   發布時間: 2004-05-17

呵呵,硬件的變化,不會阻礙人們尋找解決問題的最佳途徑的...
so~算法,數據結構,不會落伍的

作者: KnightE   發布時間: 2004-05-17

。。。。。。。。

不打算再在技術版多說什么

只是每次看到一堆人在PHP版為JS特效喝彩、不談工程框架設計思路談小數點后好幾位的比拼、不講信仰講生活。。。。就感到心寒

這就是中國PHP,這就是中國特色的開源社區

作者: 開心果   發布時間: 2004-05-17

恩...

比較喜歡sitepoint那邊氛圍,好多人在真正探討,在研究(當然求助學習的肯定有).

國內就比較少拉....技術論壇,更像是答疑論壇

QUOTE:
為JS特效喝彩、不談工程框架設計思路談小數點后好幾位的比拼、不講信仰講生活。。。。
所以像這帖的*主題*...應該歡迎的^^(原創+思想+探討)



跑題了....-_-

作者: KnightE   發布時間: 2004-05-17

做任何事都要從做好點滴的小事做起
一個強大的系統都有可能會因一個分號或引號而癱瘓

不要好高騖遠而因小失大

作者: Van.T   發布時間: 2004-05-17

忍不住頂! 經驗學習中.....


最后一個問題想問一下 ,對sql語句的寫法 ,我看見一些程序用
sprintf 來做,好象更清晰哦(個人認為), 是不是用sprintf慢點呢?

作者: k999   發布時間: 2004-05-18



QUOTE:
最初由 開心果 發布
[B]。。。。。。。。

不打算再在技術版多說什么

只是每次看到一堆人在PHP版為JS特效喝彩、不談工程框架設計思路談小數點后好幾位的比拼、不講信仰講生活。。。。就感到心寒

這就是中國PHP,這就是中國特色的開源社區 [/B]
偶認為沒必要過于悲觀,現實是真正能達到你所希望的高度的人并不多,就算是我們自已不也正是為了能達到這種高度而希望能有如此的一個環境嗎?

象JS特效這種東東,就好象快餐一樣,當然有很多人喜歡,這也是無可非意的,說起來,真到要用的時候,我還真是懶得自已再去調試算法和流程,能有個現成的一改就用,也不錯啦

作者: s_seraph   發布時間: 2004-05-18

能 給 我說說怎么架設個人服務器嗎?

支持php的

謝謝!


qq:110031677



我的個人主頁:http://feion199.533.net

作者: feion199   發布時間: 2004-05-18

學習學習

作者: 童坦   發布時間: 2004-05-18



QUOTE:
最初由 feion199 發布
[B]能 給 我說說怎么架設個人服務器嗎?

支持php的

謝謝!


qq:110031677



我的個人主頁:http://feion199.533.net [/B]
在GOOGLE里搜inux PHP Mysql,無數無數

作者: s_seraph   發布時間: 2004-05-18

不錯啊
菜鳥的我還是得繼續努力咯

作者: 阿發   發布時間: 2004-05-19

好有感觸啊~~~~
覺得自己的仍處于很低級的學習階段
恩,繼續努力著!

作者: Xhunter   發布時間: 2004-05-21

作者: gavinguo   發布時間: 2004-05-21

好挖!

作者: 絕版英俊   發布時間: 2004-05-21

C語言沒學好,下面那個三元沒看懂

CODE:
[Copy to clipboard]
<?php
同樣的代碼,這樣就比較讓人看得舒服了:

PHP代碼:

$foo      = $_post["foo"];

$username = $_post["username"];

$group    = $_POST["group"];

if ($group=="wheel")

{

    $username = $username."wheel";

}



當然,有一定基礎后,你應該要寫成這樣:

PHP代碼:

$foo      = &$_POST['foo'];

$username =  $_POST["group"]!='wheel' ? $_POST["username"] : $_POST["username"].'wheel';
?>
$username =  $_POST["group"]!='wheel' ? $_POST["username"] : $_POST["username"].'wheel';

這句應該怎么解釋?

如果 $_POST["group"]!='wheel'
那么 $username= $_POST["group"]=$_POST["username"] :

否則 $username= $_POST["group"]=$_POST["username"].'wheel';

我看下來是這樣的,怎么和上面的那個不一樣啊,誰來分析下?

$_POST["group"]!='wheel' ? $_POST["username"] : $_POST["username"].'wheel;

這里沒有對'
$_POST["group"] 賦值嘛?

作者: Dalamar   發布時間: 2004-05-22

很不錯的東西,還沒有全部做到

作者: magicstu   發布時間: 2004-05-22

如果測試的字段是很大的話,pass by reference的優勢就很明顯了

作者: 34010493   發布時間: 2004-05-25

Van.T寫的不錯,應該學習學習。努力學習工作啊!

作者: pippen7923   發布時間: 2004-05-27

二樓子的帖 我再頂

作者: yuguanglou   發布時間: 2004-05-28

頂! (雖然閑話比主題多)

作者: movenet   發布時間: 2004-05-29

不好意思,看了樓主的帖子,有一個不太清楚,什么是“error_reporting”?在哪看?

作者: emylekao   發布時間: 2004-05-31

我是新手,收益不淺,呵呵

作者: 感動   發布時間: 2004-05-31

好,繼續

作者: 亂碼!   發布時間: 2004-06-01

掌聲~~

作者: slackware   發布時間: 2004-06-01

我也喜歡按這樣的風格寫.

作者: polofigo   發布時間: 2004-06-01

...

永遠的初學者[/COLOR]

作者: aplapl   發布時間: 2004-06-02

好東西

作者: rich88   發布時間: 2004-06-02

看多,不錯~~~~~~~

作者: czwu   發布時間: 2004-06-05

這個論壇好好哦,雖然很多都不懂!

作者: 山間小溪   發布時間: 2004-06-08

安全比效率重要

作者: luckcc   發布時間: 2004-06-08

學習 學習 再學習

作者: txdesign   發布時間: 2004-06-13

好強一貼!!受益匪淺。我是初學者。昨天自己寫一小留言簿,就因為error report問題搞得頭大,一直爆warning,后來改為不是全部錯誤都爆才好的。

呵呵,那十句話很經典,謝謝!

作者: 一只傻魚   發布時間: 2004-06-15



QUOTE:
最初由 開心果 發布
[B]寬帶一出。。。。萬事俱休 [/B]
白日做夢

作者: bingle   發布時間: 2004-06-18

我剛剛學習php,可是不知道改從那入手,請大家多多指教

作者: jsj792004   發布時間: 2004-06-18

我也剛學,請大家多多指教

作者: 火龍sky2號   發布時間: 2004-06-19

學習!

作者: 狂龍書生   發布時間: 2004-06-21



QUOTE:
最初由 帥的像人渣 發布
to 樓主: 對于你所說的擅于用"引用", 速度更快.本人可不敢茍同.
人家不是打上引號了嗎?

豬頭說過,一個軟件的好壞,與抽象的數量和質量有著莫大的關聯

樓主的“引用”,不像是簡單地指include/require

偶得理解

作者: 開心果   發布時間: 2004-06-23

不錯。。學習了。

作者: 邊個夠我慘   發布時間: 2004-06-23



QUOTE:
最初由 wormbaby 發布
[B]思:從一點一滴做起。 [/B]
所樓主才說要善于引用阿,又不是能引用就全引用
不過謝謝wormbaby 讓我知道哪些地方不適合引用
謝謝你們倆

作者: 卒仔   發布時間: 2004-06-28

怎么不繼續寫下去呢?!!

作者: 水若寒   發布時間: 2004-06-28

學習中~~~~

作者: noHER   發布時間: 2004-06-30



QUOTE:
最初由 開心果 發布
[B]。。。。。。。。

不打算再在技術版多說什么

只是每次看到一堆人在PHP版為JS特效喝彩、不談工程框架設計思路談小數點后好幾位的比拼、不講信仰講生活。。。。就感到心寒

這就是中國PHP,這就是中國特色的開源社區 [/B]
說的是
A HOWTO on Optimizing PHP

作者: phppp   發布時間: 2004-06-30

佩服!

作者: 風無影   發布時間: 2004-07-01



CODE:
[Copy to clipboard]
<?php
$query = "SELECT `flash_comment`.`content` , `flash_comment`.`nickname` , `flash_comment`.`date` , `flash_comment`.`ip` , `product`.`p_name` , `sgflash`.`fid` 
          FROM `flash_comment` 
          LEFT JOIN `product` ON ( `flash_comment`.`p_no` = `product`.`p_no` ) 
          LEFT JOIN `sgflash` ON ( `product`.`p_name` = `sgflash`.`f_name` ) 
          WHERE `flash_comment`.`p_no` != ''
          ORDER BY `flash_comment`.`date`";
?>

作者: coolsnow001   發布時間: 2004-07-03



CODE:
[Copy to clipboard]
<?php

function getmicrotime()

   list($usec, $sec) = explode(" ",microtime()); 
   return ((float)$usec + (float)$sec); 


//initialize big array1
$bigArray1 = array();

for($ii=0; $ii<600; $ii++) 
{
    $bigArray1[$ii]=$ii.'value';
}

//initialize big array2
$bigArray2 = array();
for($ii=0; $ii<600; $ii++) 
{
    $bigArray2[$ii]=$ii.'value';
}

//fuction by reference
function passByRef(&$param) 
{
    reset($param);
    while($kek=key($param)) 
    {
        $param[$key] .= '-processed';
        next($param);
    }
}

//function by copy
function passByCopy($param) 
{
    reset($param);
    while($kek=key($param)) 
    {
        $param[$key] .= '-processed';
        next($param);
    }
}

//Call passByRef 50 times
$startTime = getmicrotime();
for($ii=0; $ii<50; $ii++) 
{
    passByRef($bigArray1);
}
$endTime = getmicrotime();
$refTime = $endTime-$startTime;

//Call passByCopy 50 times
$startTime = getmicrotime();
for($ii=0; $ii<50; $ii++) 
{
    passByCopy($bigArray2);
}
$endTime = getmicrotime();
$copyTime =  $endTime-$startTime;

echo('reference time is '.$refTime.'<br>');
echo('copy time is'.$copyTime.'<br>');
?>

作者: coolsnow001   發布時間: 2004-07-03

我期待著!

作者: fanfwen   發布時間: 2004-07-07

向你們看齊!向你們致敬!

作者: cnruyi   發布時間: 2004-07-10

很好,很受啟發!但本人有兩個觀點和樓主不同:
1、只有動手才會有提高。所以無論是論壇或是其他什么程序都可以嘗試著去寫,在寫的過程中會讓你思考,會讓你嘗試各種各樣方法,你的能力也就自然的提高了。當然只是叫嚷是沒有用的。
2、三元運算子給人一種不清晰的感覺。我感覺讓程序清晰比效率更重要。

作者: grw   發布時間: 2004-07-11

感覺不錯,學到一點東東,
不過只有先解決溫飽再說小康了,腳踏實地。

作者: bjbs_270   發布時間: 2004-07-23



QUOTE:
最初由 開心果 發布
[B]人家不是打上引號了嗎?

豬頭說過,一個軟件的好壞,與抽象的數量和質量有著莫大的關聯

樓主的“引用”,不像是簡單地指include/require

偶得理解 [/B]
老大,根本就不是指include/require,而是&

作者: mgirl   發布時間: 2004-07-25

剛剛開始,請大家多多指教!!!!!!

作者: 艷兒   發布時間: 2004-07-25

哈哈,看了后解決了我一個問題,謝謝

作者: yema   發布時間: 2004-07-28



QUOTE:
最初由 grw 發布
[B]很好,很受啟發!但本人有兩個觀點和樓主不同:
1、只有動手才會有提高。所以無論是論壇或是其他什么程序都可以嘗試著去寫,在寫的過程中會讓你思考,會讓你嘗試各種各樣方法,你的能力也就自然的提高了。當然只是叫嚷是沒有用的。
2、三元運算子給人一種不清晰的感覺。我感覺讓程序清晰比效率更重要。 [/B]
跟樓主觀點不同
1,寫是必須的,但是寫前看一下代碼還是非常非常有必要的。重要的是了解結構與思想。
2,三元運算,結構非常清晰,是則前,不是則后。

作者: yema   發布時間: 2004-07-28

寫的好  支持一下
我是php新手 請大家多關照

作者: wlimoon   發布時間: 2004-07-30

關注

作者: RustlingWind   發布時間: 2004-07-30

好貼~

作者: hongmo   發布時間: 2004-08-03

I LIKE I CHOOSE 。GOOD~!

作者: applee   發布時間: 2004-08-06

?]甚?N想?f.........?S便一本 php的??都有提及的技巧
不是?f?N出???]甚?N大不了, 而是基本不重要, ?π率侄?言是混?y
??老手就是不合乎???T

三元?\算有好肯定也有不好, 既然他不可以完全取代if...else, ?榻y一起????之
引用也涉及了公用及私有的???},  而且在框架及??中都是直接?{用, ??之

每??人有自己的生活?L格,  ??程序更是, 我??人而言是???}?s化狂
?O???R?r??量都用上4,5??????, 不要和我?f速度
我??告?V你用sun fire 15K 250??cpu去吧, 呵
做n ??循?h都比你的486 ???? echo快

以前用???a程序看??很多都出?e出?e再出?e, 反而外??的就是?y用都?]多大???}
?F在懂了再看原因就是?^份???{效率, 基本?]有考?]太多例外情?r
多???? if...else 都不??用, [email protected]?擁某絳蛟倏煲彩橋?到垃圾桶去踩平

??程序??是?????旱掛磺?, 功能次之, 效率再次, 代?a??法再次

??然sql等技巧都是真理, 不[email protected]????的??出?e率是很高的.....

作者: mlw3031   發布時間: 2004-08-10

雖然我現在還無知,感覺介紹的很詳細,一些細節的問題都那么的注意!頂

作者: Gemse   發布時間: 2004-08-10

說得好!

作者: SiegfriedDK   發布時間: 2004-08-11

好好向大家學習,我的水平一定更上一樓!

作者: shank   發布時間: 2004-08-11

我就不懂~!適合我,謝謝~!

作者: lqy730   發布時間: 2004-08-11

看到這里,我又要發一次誓了,我下決心,學好php

作者: 金臺小子   發布時間: 2004-08-17

o

作者: 天天想你   發布時間: 2004-08-18

我也來頂一下!不過我還只是一個菜鳥了啦!
不大懂就是了!以后多幫忙了哦!

作者: flyhan   發布時間: 2004-08-21

頂!

作者: gzty   發布時間: 2004-08-28

我們是中國設計之窗,日點擊率200多萬次,
因發展需要,特誠邀php高手加盟 ,
本站前景廣闊,回報豐厚。
有意者請email:[email protected]
標題注明:加盟中國設計之窗

在深圳,可以兼職!
請你們主動與我聯系,或留下電話!!!!

作者: pass2004   發布時間: 2004-09-01

好好學習 基本功要扎實

作者: wubai2002   發布時間: 2004-09-04

學習

作者: 哈苦瓜   發布時間: 2004-09-06

看過大家的引用、拷貝測試代碼,我猜測,如果引用傳遞參數進入函數后,如果函數內沒有輸出,則php底層進行的是指針操作,如果有輸出的話,php肯定會臨時將當前引用變量的值復制一份過來用于輸出。這樣的操作多了,就會影響效率。甚至不如一次整個拷貝來的快。但是這也不能確定,因為這跟變量的大小以及執行輸出的次數有關。

但是如果函數內部沒有輸出,引用變量以及函數返回引用,在php底層大概只是進行指針地址的傳遞,因此效率應該絕對高于復制拷貝。

個人結論:
用于界面顯示的函數一般沒有返回值,只在函數內部進行界面輸出,這種函數盡量不要使用引用來傳遞變量。
用于系統邏輯層的純數據傳遞的函數一般由返回值,返回值以數組,對象為主。這種函數盡量使用引用來傳遞變量并且注意函數返回引用。


不只對否?

作者: liubinnet   發布時間: 2004-09-11

不錯
我現在真學習這個

作者: cennycai   發布時間: 2004-09-12

很好值得借鑒,

作者: dreamriver   發布時間: 2004-09-14

I see Isee,great!!

作者: hack_yi   發布時間: 2004-09-25

強,再頂一下
可惜我連C都不會,最.......

作者: hao123   發布時間: 2004-09-29

請問訪問次數PHP編訪問次數怎么寫,

作者: far   發布時間: 2004-10-02

好帖!!

作者: hevi   發布時間: 2004-10-06

OK

作者: snow685159   發布時間: 2004-10-08

liulan

作者: 步步高   發布時間: 2004-10-15

至理名言

作者: 五花小魚   發布時間: 2004-10-24

都是高人阿,佩服

作者: redblade   發布時間: 2004-10-25

你說的PHP引用好像是有兩個REQUIRE 和INCLUDE 為什么我們這的服務器不能用呢???
本人保證所說的PHP代碼完全正確!!!!!
是不是服務器的問題??????

作者: ray2003   發布時間: 2004-10-29

請問:使用left jion,除了速率提高了,還有什么優點呢?
如果鏈接了幾個應該怎么處理?語法?

QUOTE:
最初由 Van.T 發布
[B]

CODE:
[Copy to clipboard]
<?php
//使用LEFT JOIN
SELECT `sgflash`.`f_name`, `sgflash_comment`.`contents`, `sgflash_comment`.`nickname`, `sgflash_comment`.`date`
FROM `sgflash_comment` LEFT JOIN `sgflash`
ON (`sgflash_comment`.`fid`=`sgflash`.`fid`)
ORDER BY `sgflash_comment`.`date` DESC LIMIT 0, 10000

//不使用LEFT JOIN
SELECT `sgflash`.`f_name`, `sgflash_comment`.`contents`, `sgflash_comment`.`nickname`, `sgflash_comment`.`date`
FROM `sgflash_comment`, `sgflash`
WHERE `sgflash_comment`.`fid`=`sgflash`.`fid` 
ORDER BY `sgflash_comment`.`date` DESC LIMIT 0, 10000
?>
測試對比
顯示行 0 - 29 (10000 總計, 查詢花費 0.6760 秒) 第一次執行用LEFT JOIN
顯示行 0 - 29 (10000 總計, 查詢花費 1.5532 秒) 第二次執行不用LEFT JOIN
顯示行 0 - 29 (10000 總計, 查詢花費 0.6655 秒) 第三次執行使用LEFT JOIN
顯示行 0 - 29 (10000 總計, 查詢花費 1.3730 秒) 第四次執行不合使用LEFT JOIN [/B]

作者: bopo   發布時間: 2004-10-31

精深啊!
看來,我的php之路還有很長啊!

作者: smoon   發布時間: 2004-10-31

您為什么寫的這么專業呢?確實,這不僅僅是一種職業修養問題。

作者: singlehero   發布時間: 2004-11-02

習慣決定一切,寫程序要養成一個良好的習慣.

作者: 鍵步隨風   發布時間: 2004-11-02

4.盡量讓你的代碼清淅些
如果寫成這樣,是比較讓人頭痛的:

CODE:
[Copy to clipboard]
<?php
$foo=$_post["foo"];
   $username=$_post["user"]; 
$group=$_POST["group"];
if ($group=="wheel"){
$username=$username."wheel";
}
?>
同樣的代碼,這樣就比較讓人看得舒服了:

CODE:
[Copy to clipboard]
<?php
$foo      = $_post["foo"];
$username = $_post["username"];
$group    = $_POST["group"];
if ($group=="wheel")
{
    $username = $username."wheel";
}
?>
當然,有一定基礎后,你應該要寫成這樣:

CODE:
[Copy to clipboard]
<?php
$foo      = &$_POST['foo'];
$username =  $_POST["group"]!='wheel' ? $_POST["username"] : $_POST["username"].'wheel';
?>
確實好貼,但個人覺得,上面的還是按第2種寫法好一點,看的清楚,雖然第3種更為標準,但是當寫了很久的代碼,腦子木了的時候,還是第2種直觀一些,大家覺得呢?畢竟代碼的標準是為了使代碼更好看

作者: Ice_D(real)   發布時間: 2004-11-04

哈哈,都頂一下,很值得學習啊!!!

作者: zxf2008   發布時間: 2004-11-09

作者: 開花石頭   發布時間: 2004-11-09

大家好初次到來還不太懂呢?多謝指教!

作者: 阿藝   發布時間: 2004-11-11



QUOTE:
最初由 dreamriver 發布
[B]看過大家的引用、拷貝測試代碼,我猜測,如果引用傳遞參數進入函數后,如果函數內沒有輸出,則php底層進行的是指針操作,如果有輸出的話,php肯定會臨時將當前引用變量的值復制一份過來用于輸出。這樣的操作多了,就會影響效率。甚至不如一次整個拷貝來的快。但是這也不能確定,因為這跟變量的大小以及執行輸出的次數有關。

但是如果函數內部沒有輸出,引用變量以及函數返回引用,在php底層大概只是進行指針地址的傳遞,因此效率應該絕對高于復制拷貝。

個人結論:
用于界面顯示的函數一般沒有返回值,只在函數內部進行界面輸出,這種函數盡量不要使用引用來傳遞變量。
用于系統邏輯層的純數據傳遞的函數一般由返回值,返回值以數組,對象為主。這種函數盡量使用引用來傳遞變量并且注意函數返回引用。


不只對否? [/B]
個人表示同意...

作者: lalaqi   發布時間: 2004-11-12

頂一下,學習ing。

作者: guoli   發布時間: 2004-11-18

這就是目標!!!!!

作者: 我的電腦   發布時間: 2004-11-24

怎么樣才算高手啊?

作者: goldSn0ke   發布時間: 2004-12-15

php.ini 里把 register_globals=Off 改成 =On
register_globals =   register_global 么?

作者: zhongli   發布時間: 2004-12-16

I Like This Game!

作者: zhongli   發布時間: 2004-12-16

看了心里有點發虛,本人剛學,還不知道能怎么樣呢?努力中……

作者: 紫禁之巔   發布時間: 2004-12-22

好!!!

作者: topcool   發布時間: 2004-12-24

哎~~怎么就看不懂.......納悶的很

作者: 冰凍の紅茶   發布時間: 2004-12-26

學習

作者: vanrest   發布時間: 2004-12-29

好東西  呀!!謝謝了

作者: ufwiqfcu   發布時間: 2004-12-29

怎么不繼續呀!!

作者: login6532   發布時間: 2005-01-01

討論速度是不是有點偏題了。?
每個人的運行環境不同,速度終究是有差異的!

偶希望能盡快看到這篇帖子的后續內容!!
呵呵!
有 同感的 頂一下?!

作者: songyan   發布時間: 2005-01-01

支持.

作者: songyan   發布時間: 2005-01-01

是應該這樣`` 扎實的基礎學習以后的東西就塊多了!

作者: songyan   發布時間: 2005-01-01

強哈

作者: _寒_   發布時間: 2005-01-02

感覺還不錯了。很有道理的。你也想補兩句。
1、個人覺得寫一程序時用常用echo 來追數據對調試很有好處。
2、還有了,掌握一定的js知識可能對你寫php程序減輕不少前期工作。

作者: 小煞   發布時間: 2005-01-02

up,我正有這樣的壞毛病哩,努力改進

作者: 光風霽月   發布時間: 2005-01-03

我看了2回,好!

作者: iloveangle   發布時間: 2005-01-14

不錯。看來還真得注意啊~好好學習,天天向上!

作者: yjll   發布時間: 2005-01-15

我是菜鳥。。挺多關照。。。謝謝。。

作者: 傻小子   發布時間: 2005-01-15

經典阿,看來我害的努力學習,呵呵

作者: phpnow   發布時間: 2005-01-19

我也貼兩點,從網上摘的,但感覺狠實用,希望對大家有用處:

1,對于不包含規則的字符串替換,使用str_replace(): 要比 ereg_replace()效率高的多

2,PHP和其它很多編程語言一樣,可以使用雙引號(\"\")來引用字符串,也可以使用單引號()。但是在PHP中,如果使用雙引號來引用字符串,那么PHP解析器將首先分析字符串中有沒有對變量的引用,有變量的話,將對變量進行替換。如果是單引號,則沒有如此復雜――直接將單引號包含起來的所有字符串直接顯示出來。顯然,在PHP編程中,如果使用單引號引用字符串變量要比使用雙引號快速一些。

作者: redants   發布時間: 2005-01-24

這些正是我要克服的.

作者: ministrator   發布時間: 2005-01-26

唉,我什么時候能寫出這樣的帖子來啊?

作者: 漫步陽光   發布時間: 2005-01-26

想問問  我現在也在入門PHP  我是中專畢業的 也不知道該怎么學 我對英語和高等數學(函數)都不會  大家推薦下 我該怎么學呀

作者: leeco   發布時間: 2005-01-28

感覺上就是在說我,哈哈!

作者: safetin   發布時間: 2005-02-06

古語有云:“欲速則不達”。
切實是這個道理,
我們不能一味的追求效率,而忽略了過程。
有時候,在寫論壇、購物系統的時候,往往還要回過頭來查資料,翻筆記。這足已說明,掌握基礎是走向更高一層的前提!
磨刀不誤砍材工,是有道理的!

作者: xuxunmeng   發布時間: 2005-02-08

第一貼 頂@@@@@@@@@@@@

作者: 神龍居士   發布時間: 2005-02-10

顯示$var的值的高效寫法:
<?=$var?>

IF的隨意寫法:
if ($a<1)$b=1

作者: bloffice   發布時間: 2005-02-14

最近在學 php,我用的 php-4.3.9-Win32 + Apache2 + mySQL Server 4.1 + WinXP.
  
  
  
  已經用mySQL 創建了一個數據庫,并添加了內容。然后寫了個訪問數據庫的php頁,通過I.E 訪問時,老是出錯。
  
  
  
  Warning: mysql_connect(): Client does not support authentication protocol requested by server; consider upgrading MySQL client in C:\Program Files\Apache Group\Apache2\htdocs\sean\database.php on line 16
  
  
  
  我的第16行是這樣的:
  
  
  
  $connection = mysql_connect($host, $user, $pass) or die (“Unable to connect!“);
  
  
  
  
  搞不清楚怎么回事,求斑竹指教!

作者: undeadbird   發布時間: 2005-02-15

我也學習學習

作者: yueyang   發布時間: 2005-02-18

謝謝樓主指點,高手有云,編程著重于思想!
而語言的精妙則恰好是思想成熟的憑證!

但是我搞不明白為啥register_golbals=Off 這樣會有助于學習呢?

作者: seanysz   發布時間: 2005-02-18

恩,看到前輩們討論的非常積極,小弟今后也開始學習PHP了,是專心的200%,我覺得PHP在這些動態網頁中是最好的,不知道是否如此,

作者: youiou   發布時間: 2005-02-21

學習啊  奮斗啊

作者: nwletian   發布時間: 2005-02-23

我是先叫囂著要寫論壇,要寫XXX,然后才學PHP+mysql
呵呵。

作者: bob520   發布時間: 2005-03-02



QUOTE:
最初由 SiegfriedDK 發布
[B]
以前用???a程序看??很多都出?e出?e再出?e, 反而外??的就是?y用都?]多大???}
?F在懂了再看原因就是?^份???{效率, 基本?]有考?]太多例外情?r
多???? if...else 都不??用, [email protected]?擁某絳蛟倏煲彩橋?到垃圾桶去踩平

??程序??是?????旱掛磺?, 功能次之, 效率再次, 代?a??法再次
[/B]
今天在CSDN看了一篇文章,再次一次體會兄臺的這句話。。。
http://www.csdn.net/news/newstopic/19/19566.shtml

作者: yeoman_z   發布時間: 2005-03-07

大部分用php的人應該都屬于應用層吧
計算機發展到今天,如果不是搞什么大型聯機事務處理,技術底層的問題怕是只有少數情況可以用到吧
個人比較喜歡編程,對一般小型應用來說,人性化處理才是最重要,以人為本,方便,實用,穩定,可能會比技術更值得關注吧(略抒愚見)

作者: haides   發布時間: 2005-03-12

學習中!!……

作者: xhhy   發布時間: 2005-03-23

我正準備學習PHP呢
希望能有一個好的結果
這個貼子不錯的

作者: cysin   發布時間: 2005-04-08



QUOTE:
最初由 nwletian 發布
[B]謝謝樓主指點,高手有云,編程著重于思想!
而語言的精妙則恰好是思想成熟的憑證!

但是我搞不明白為啥register_golbals=Off 這樣會有助于學習呢? [/B]
我來舉個小實例

當你使用Off的時候
$_POST["abc"]和$_GET["abc"]可以代表兩個不一樣的值
而你用On的時候,能嗎?當然不能。

使用Off將讓程序員從開始就養成一個在任何環境下都能通用的,良好的編程習慣。

作者: andsky   發布時間: 2005-04-09

有道理 學習學習

作者: txkss   發布時間: 2005-04-13

PHP代碼:--------------------------------------------------------------------------------
if ($data[$i]['nickname'])
{
    $nickname =  $data[$i]['nickname'];
}
else
{
    $nickname =  $data[$i]['ip'];
}

--------------------------------------------------------------------------------

可以寫成:

PHP代碼:--------------------------------------------------------------------------------
$nickname =  $data[$i]['nickname'] ? $data[$i]['nickname'] : $data[$i]['ip'];
這個不是很懂

作者: jxxysong   發布時間: 2005-04-15

樓上的這是一個判斷賦值的例子
給變量nickname賦值
如果$data[$i]['nickname']為TRUE,則$nickname得到前者的值
如果$data[$i]['nickname']為FALSE,$nickname = $data[$i]['ip']

ps:你哪看到的例子?

作者: quzn   發布時間: 2005-04-15

error_reporting
配置錯誤信息回報的等級。

語法: int error_reporting(int [level]);

返回值: 整數

函數種類: PHP 系統功能




內容說明


本函數用來配置錯誤信息回報的等級,參數 level 是一個整數的位遮罩 (bitmask),見下表。

遮罩值 表示名稱
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING



E_NOTICE 表示一般情形不記錄,只有程序有錯誤情形時才用到,例如企圖存取一個不存在的變量,或是呼叫 stat() 函數檢視不存在的文件。
E_WARNING 通常都會顯示出來,但不會中斷程序的執行。這對除錯很有效。例如:用有問題的正則表達式呼叫 ereg()。
E_ERROR 通常會顯示出來,亦會中斷程序執行。意即用這個遮罩無法追查到內存配置或其它的錯誤。
E_PARSE 從語法中解析錯誤。
E_CORE_ERROR 類似 E_ERROR,但不包括 PHP 核心造成的錯誤。
E_CORE_WARNING 類似 E_WARNING,但不包括 PHP 核心錯誤警告。

作者: bopo   發布時間: 2005-04-29

呼,新人,只有看得分,剛入門呢

作者: Van.T   發布時間: 2005-05-01

二話不說,一個字,頂,
我是初學者,還沒上路,支持!!!1

作者: dzjzmj   發布時間: 2005-05-01

本人英語不是很好,怎么才能提高編程水平呢,哪個高手給點意見呢?可以加我qq:75858175來者說是本站的會員

作者: 閃閃星   發布時間: 2005-05-13

待續……續呢?

作者: 失憶的魚   發布時間: 2005-05-16

小威菜菜深受教育,感謝大蝦的教導呵呵!

作者: ljquartz   發布時間: 2005-05-30

值得一回車,車,好車

作者: 鬼谷子先生   發布時間: 2005-07-01

???

作者: 小威菜菜   發布時間: 2005-07-01

學習

作者: 純粹誤會   發布時間: 2005-07-01

新人過來看看, 不錯

作者: ouok   發布時間: 2005-08-02

程序訪問速度要快
如果過慢,任何人也不會有耐心等待的

作者: maoqi2232   發布時間: 2005-08-11

今天終于領悟代碼風格了

作者: sky2008   發布時間: 2005-08-13

轉自 http://www.jfox.info/php/a/gF/13769f.html 

 一. 10句話
  1.不要依賴register_global=ON的環境,從你剛懂得配置php運行環境甚至尚不明白register_global的ON/OFF會對自己有什么影響的那天起,就應該勇敢地把它設為OFF.
  2.寫程序前看看怎么用error_reporting.
  3.不懂就問本身沒錯,但你需要在那之前查查手冊。
  4.當然,你需要懂得使用手冊。手冊上找不到答案的時候,應該考慮下網絡上的搜索引擎。
  5.剛學會php+mysql之后,不要叫嚷著要寫論壇,要寫XXX。要明白,剛學會寫漢字并不表示你有能力寫詩。
  6.在學web編程的時候,你應該先去認識html這個朋友。
  7.有點能力后,試著回答新手的問題,不要看到自己懂的而別人不懂就沾沾自喜,扔下一名“簡單,那是基本的東西”就走更要不得。
  8.思考是一個好習慣,不動手去寫就等于空想,什么也沒有。
  9.寫好一段程序,如果覺得很滿意,一周后再看一遍,也許你會認為它應該有所改變
linux

  10.有空多看看別人的程序,找出他人的不足或優點,自己掂量。
  
  二. 各取所需
  1.善于使用“引用”,它能直接影響到程序的效率。
  
  2.善于用三元運算子,可以讓程式較精簡有效率。
  比如:
  
  Code:
  if ($data[$i]['nickname'])
  {
  $nickname = $data[$i]['nickname'];
  }
  else
  {
  $nickname = $data[$i]['ip'];
  }
  
  可以寫成:
  
  Code:
  $nickname = $data[$i]['nickname'] ? $data[$i]['nickname'] : $data[$i]['ip'];
  
  3.善于組織if...else...回圈
  比如:
  
  Code:
  $ext_name = strtolower(str_replace(".", "", strrchr($upfilename, ".")));
  if (!empty($type))
  {
  if (!strpos($type, $ext_name))
  {
  echo "Please upload the file of $type form.";
  exit();
  }
  } linux
  
  上面的代碼你應該寫成這樣:
  
  Code:
  $ext_name = strtolower(str_replace(".", "", strrchr($upfilename, ".")));
  if (!($type==='') && strpos($type, $ext_name)===false)
  {
  echo "Please upload the file of $type form.";
  exit();
  }
  
  4.盡量讓你的代碼清淅些
  如果寫成這樣,是比較讓人頭痛的:
  
  Code:
  $foo=$_post["foo"];
  $username=$_post["user"];
  $group=$_POST["group"];
  if ($group=="wheel"){
  $username=$username."wheel";
  }
  
  同樣的代碼,這樣就比較讓人看得舒服了:
  
  Code:
  $foo   = $_post["foo"];
  $username = $_post["username"];
  $group  = $_POST["group"];
  if ($group=="wheel")
  {
  $username = $username."wheel";
  }
  
  當然,有一定基礎后,你應該要寫成這樣:
   linux
  Code:
  $foo   = &$_POST['foo'];
  $username = $_POST["group"]!='wheel' ? $_POST["username"] : $_POST["username"].'wheel';
  
  5.編寫規范的mysql 語句。
  字段和表名用"`"引起來,避免保留字的影響。
  如果看到下面這樣的一個sql query,會讓人比較頭痛:
  
  Code:
  $query="select `flash_comment`.`content` , `flash_comment`.`nickname` , `flash_comment`.`date` , `flash_comment`.`ip` , `product`.`p_name` , `sgflash`.`fid` from `flash_comment` left join `product` on ( `flash_comment`.`p_no` = `product`.`p_no` ) left join `sgflash` on ( `product`.`p_name` = `sgflash`.`f_name` ) where `flash_comment`.`p_no` != '' order by `flash_comment`.`date`";
  
  同樣的一個query,寫成這樣就令人看得明白得多了:
  
  Code:
  $query = "SELECT `flash_comment`.`content` , `flash_comment`.`nickname` , `flash_comment`.`date` , `flash_comment`.`ip` , `product`.`p_name` , `sgflash`.`fid` unix
  FROM `flash_comment`
  LEFT JOIN `product` ON ( `flash_comment`.`p_no` = `product`.`p_no` )
  LEFT JOIN `sgflash` ON ( `product`.`p_name` = `sgflash`.`f_name` )
  WHERE `flash_comment`.`p_no` != ''
  ORDER BY `flash_comment`.`date`";

轉自 http://www.jfox.info/php/a/gF/13769f.html 

作者: PHP 技術狂人   發布時間: 2010-08-19

双面盘玩法