php編程疑難解決-1

全局變量和超全局變量

  1. 若是是php腳本script 或php代碼, 必定要放在 php標籤內<?php ?> 內。 這樣apache纔會把他當作php腳本內容來解析, 纔會去調用php模塊解析,而後返回解析後的內容,由於不管是php仍是html文件擴展名,都是由apache來接受請求並解析的,都是按html代碼來處理的,只是在遇到php標籤的時候,才認爲是php腳本代碼。

也就說,在寫web的時候, 老是先有 標籤, 後有 內容! 應該將內容都放在標籤中,而不是直接將 內容放在文件中。php

1.php的全局變量是 針對一個文件內部, 一個文件域而言的。
凡是在函數外部的變量都叫作 全局變量
跟c/c++的全局變量思惟不同,php認爲函數內外的變量是 兩個互不想通, 互不可見的(函數內的變量是局部變量)。即全局變量不能在 函數內使用。 確實要在函數內部使用全局變量,就要使用 global語句,或者叫global 關鍵字聲明。html

<?php
 $name = 'jack';

function getName(){
global $name;
echo $name;
}

getName();

?>
  1. php的變量聲明?
    能夠不用聲明變量,直接使用;
    但跟其餘編程語言的思想相相似, 變量應該、最好是先聲明再使用;
    可是要注意的是, 全局變量的聲明不能使用var, 而類定義中的 成員變量聲明時應該使用 var關鍵字!
    聲明的時候, 你能夠只寫這個變量,但這樣在形式上,和實際做用上意義都不大, 因此, 應該將變量的聲明和初始化相結合,這樣既聲明瞭變量,同時又給變量初始化,賦了初值。java

  2. unexpected T_VAR in c:\foo.php on lin2, 其中T_VAR表示 terminate variable, 表示意外的 變量結尾,實際上就是變量的聲明錯誤mysql

  3. 變量聲明錯誤是parse ERROR, 而變量undefined variable未聲明是notice! 警告linux

  4. php的超全局變量?
    所謂super global variables, 就是函數外的變量,能夠直接在函數內使用,並且不須要用global語句聲明的變量
    超全局變量都要大寫!
    超全局變量有兩種,一種是系統預約義的,另外一種是用戶自定義的;
  • (php)系統預約義的超全局變量,是用下劃線打頭,而且所有大寫,如$_GET, $_POST, $_SERVER , $_FILES, $_COOKIES...等
  • 用戶自定義的超全局變量只有一個,就是 $GLOBALS, 注意沒有下劃線,並且是所有大寫,GLBOALS, 有s複數
<?php
 $GLOBALS['name'] = 'JACK';

function getName(){
echo $GLOBALS['name'];
}

getName();

?>
  1. html擴展名中,不能包含php標籤及其內容, 由於會自動過濾和忽略! 而php擴展名文件中,則能夠自動識別html標籤。

  1. 所謂的全局變量,實際上也只是 「文件域」的,只是在當前文件範圍內有效。
    一個文件要使用另外一個文件中的 所謂的 「全局變量」,要使用 include...c++

  2. 在php標籤中,能夠包含其餘php文件, 在使用包含include/require/_once 的時候,實際上是作了一些處理、工做的: 先將被包含文件的php標籤先去掉/剝離,
    而後只是將其中的php標籤中的內容包含、複製過來。
    因此, 若是在php標籤中, 你就不能直接地再次使用,php的標籤了,也就是說, php標籤是不能嵌套的. 不然就會出錯,如: <?php <?php ....?> .... ?>web

  3. 可是php的包含include語句,跟c/c++的又有所區別: 被包含的php文件,必定要寫 php標籤, 不然你覺得像c語言同樣,直接複製過來的.可是在php中, 若是被包含文件沒有php標籤的時候, 只是把其中的內容當作"純粹的/原生的html內容來輸出,好比: $foo=10; 只會直接在瀏覽器中 輸出$foo=10;而並不會認爲是一個php變量$foo , 因此後面使用 echo $foo;的時候, 就會報錯: Notice: Undefined variable: foo正則表達式

echo $GLOBALS; 的輸出結果:
Array(
....
 [SCRIPT_FILENAME] => C:/wamp/www/foo.php 
[REMOTE_PORT] => 49275 [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_PROTOCOL] => HTTP/1.1 [REQUEST_METHOD] => GET [QUERY_STRING] => 

[REQUEST_URI] => /foo.php 
[SCRIPT_NAME] => /foo.php 
[PHP_SELF] => /foo.php
 [REQUEST_TIME] => 1507607647 )

 **[name] => JACK** 
)
foo.php文件內容:
<?php
$GLOBALS['age'] = 10;

print_r($GLOBALS);    // 只是包含 系統超全局變量 和一個 age index變量

?>
bar.php文件內容
<?php

$GLOBALS['name'] = 'JACK';

function getName(){
echo $GLOBALS['name'];
}


getName();

echo "<br>";

print_r($GLOBALS);  // 執行完foo.php後, 再執行bar.php, 這時顯示的仍然只有系統超全局變量 和 name 索引變量, 並無 age索引...

?>

前後執行foo.php, 和 bar.php, 看到 $GLOBALS的內容中並不一樣時包含 ['name'] 和 ['age']. 只是包含其中之一!

結論:sql

  1. $GLOBALS 包含全部的 "超全局變量" , 甚至包括: _GET,_POST, _ENV, _FILES, _COOKIES, _SERVER等系統於定義的超全局變量 + 自定義super globals
  2. php腳本是解釋型,不是編譯型, 並不能像c語言那樣, 一個全局變量執行完後, 仍存在於內存中, 確實是全部文件均可以共用的全局變量 , 可是在php中, 腳本是"無狀態的"! 即: 一個腳本文件執行完畢後 , 關於這個腳本的 全部的內存變量都要被清除, 抹掉, 服務器端(php語言)不會保持 這個被請求的php腳本的執行後的任何內容. 當下一次請求其餘php腳本的時候, 全部的一切 內存變量都要 從新開始, "一切又要從頭開始" 好像之前的任何腳本都沒有執行過.數據庫

  3. 所以, 雖然$GLBOALS是超全局變量, 可是你並不能將一個 腳本文件foo.php中的$GLBOALS 索引變量,帶到 另外一個 腳本文件bar.php中來, 由於foo.php執行完畢後, 內存中的$GLBOALS就已經被 銷燬了, 根本就不存在了. 而執行 bar.php的時候, 這個 $GLBOALS 又是 從新 創建的.
  4. 所以 不一樣腳本文件中的 $GLBOALS是變化的, 執行每一個不一樣的腳本,其值多是不一樣的! 文件與文件之間的 $GLBOALS 不是互相傳遞的.

  5. 或者說: php是不保存狀態的, 一個php腳本中的變量 跟另外一個 腳本中的 同名 變量是 沒有毛關係的. 彼此老死不相往來,除非 include...


關於三個函數的區別: is_null, isset, empty?

  1. 在php中,單是一個$foo;是沒有任何意義的, 並無定義、聲明這個變量: 這個foo變量會被認爲是 null, 會被認爲是not set,同時會被
    認爲是undefined. 是沒有被定義的.

  2. 變量爲null 只有兩種狀況: 一是$foo; 二是 $foo = null; 即沒有任何定義,或直接明確賦值爲null

  3. 對於defined和undefined判斷,凡是null,都是認爲 沒有定義的.
    總之, 只有兩種狀況下是null


  1. isset判斷,也很簡單, 只要是 一個變量爲 非null的,就是 is already set的.

  1. empty, 任何一種數據類型均可以/多是empty的,包括:
    數字: 0,
    boolean: false;
    字符串型: '', '0', 單是空格字符串' '不是empty的
    null型的: 都是empty.
    複雜類型的 array() 空數組

只要給變量賦值, 哪怕是空字符串'', 這時變量就再也不爲null了,雖然他仍是爲empty.

<?php

$name;  // 像這樣的語句實際上是沒有任何意義的,固然也不會認爲是錯誤的

if(defined($name)){echo '$name is defined';}else{ echo '$name is undefined';}

if(is_null($name)){
 echo "name is null";
}else{
 echo "name is not null";
}

echo "<br>---------------------------------<br>";

$name = null;
if(defined($name)){echo '$name is defined';}else{ echo '$name is undefined';}
echo "<br>";
if(is_null($name)){
 echo "name is null";
}else{
 echo "name is not null";
}

echo "<br>---------------------------------<br>";


if(isset($age)){
 echo "age is set";
}else{
 echo "age is not set";
}

echo "<br>---------------------------------<br>";

if(empty($name)){ echo 'name is empty';}else{echo 'name is not empty';}

echo "<br>---------------------------------<br>";


$name='';    // 這裏name被賦予空字符,但已經不是null了, 也就是說,只有給變量賦值, 變量就不爲null
if(is_null($name)){
 echo "name is null";
}else{
 echo "name is not null";
}


?>


  1. 超全局變量$_GLOBLAS也是文件域的
    當一個文件結束時, 全部有關這個文件的東西都將在內存中消失.
    get/post的內容是如何傳遞到 "跳轉"文檔中的?
    可能有兩種可能:
    一種是: 跳轉時, 原文檔自己並是立刻關閉, 要將傳遞的內容傳遞 到 目標頁面後(即在交際的時間點, 是有兩個文檔 在內存中同時並存被打開的, 即A -> B , 那麼A和B 都打開並同時生存), 原文檔才關閉.
    另外一種多是: 源文檔中的傳遞變量/參數, 由apache來管理, 將它發到一個臨時內存變量區中, 隨即關閉原文檔, 而後再打開 跳轉的目標文檔, 而後把保存的 變量合併到目標文檔中.
    兩種方式, 均可實現, 可是反正都是單文件做用域的

  2. php和html: 一切都是標籤 的 標籤文檔
    因爲php和html都是在服務器端執行的「腳本」不是在os下執行的C/c++程序,因此它是面向的apache,因此是標籤文檔,「一切都是標籤」:嚴格來講,文檔中只有標籤. 全部的內容都要用標籤來進行"語義化"說明. 那種隨便"甩東西在文檔中"的寫法實際上是沒有理解標籤文檔的含義的

  3. 在php中, 要計算"數字字符串"的數值時, 不要使用toint()函數 ,應該使用intval()函數.由於這個函數會作一些安全性處理.
    當判斷一個變量是否爲數字,不然進行賦值時的 "通用寫法"是:

if( isset($_GET['id']) && !empty($_GET['id']) )

  1. 在php中,變量的名稱是不包括前面的$符號的,$只是一種前導符一種格式.好比出錯信息是: " undefined varible nChar in ... on line x" 其中的變量是 $nChar.

php代碼 雙引號字符串中的空格、表示空格的字符表示符號在html瀏覽器中的顯示效果:

由於瀏覽器會把多個空格(包括製表符)當作一個 空格來顯示,因此:

  1. 凡是: 字符串中 的一個space, 多個space, \n, \t 都將只顯示爲一個空格的效果;
  2. 在代碼中 不必定老是用 回車、換行來分割顯示, 使用空格也能夠的。

  3. APR是什麼?
    APR是apache portalbe runtime (library) 可移植運行庫, 是從apache項目中分離出來的,(之前的apache是本身在內部, 來實現對操做系統調用的實現, 如今就不是本身直接實現了, 而是apache內部組件 經過 APR (至關於中間件) 來對操做系統資源的調用了 )將不一樣操做系統平臺如win, unix, linux等平臺下的系統調用進行封裝.便於移植, 同時也減輕了apache的重量.

pcre: perl compatible regular expression: perl 兼容正則表達式. 由於apache在處理一些應用/模塊如 rewrite.so重寫模塊的時候,可能就要用到這個pcre.因此手動安裝時可能也要求安裝pcre.

關於php的數據類型?

<?php
$a=10;      // 整數, 包括十進制/ 十六進制的0x表示的, 八進制的 0123 表示的. 都算.
$b=10.2e3;   // 只要是用 指數形式或科學計數法表示的都是 浮點數: float/double/real
$c=11.0;
$d='123';
$e=11.2;

var_dump($a);
var_dump($b);
var_dump($c);
var_dump($d);
var_dump($e);

echo gettype($a)."<br>";
echo gettype($b)."<br>";
echo gettype($c)."<br>";
echo gettype($d)."<br>";

echo is_numeric($a)?"\t數字":"非數字\t";
echo is_numeric($b)?"\t數字":"非數字";
echo is_numeric($c)?"\t數字":"非數字\t";
echo is_numeric($d)?"\t數字":"非數字\t";

settype($a,"double");
echo "<br>".$a;
echo "<br>".gettype($a)."<br>";


?>

上述代碼顯示的結果:

int 10

float 10200

float 11

string '123' (length=3)

float 11.2

integer
double
double
string
數字 數字 數字 數字
10
double

結論:

  1. php中的數據類型, 包括8種「正式」的, 3種「僞類」的
    4種基本、標量類型: 整數,浮點數,布爾值,字符串
    2種複合類型: 數組, 對象
    2種特殊類型: 資源resource, NULL空
    爲了便於理解函數 的參數類型, 規定了3種僞類: mixed,numeric, call_user_function

  2. 關於php中的數字?
    所以,數字實際上是一種 "僞類",叫number, 包括: int, float, 數字字符串"123"等.即上面的$a/b/c/d判斷是否爲數字時,都顯示爲true!

  3. 判斷變量類型的函數有: is_numeric, is_string, is_bool, is_array, is_object, is_resource.注意的是, "123"這樣的數字字符串, 便是數字, 又是字符串的類型...

  4. 在顯示echo, 或var_dump的時候,即便是浮點數(有小數點)的,只要小數點後面是0,仍然會將小數點後面的部分去掉只顯示前面的整數部分, 好比: 10.0,12.00都只顯示爲10, 12

1.(print 和 print_r能夠顯示簡單變量,可是隻是顯示值, 不會顯示顯示 「數據類型」!) var_dump和gettype顯示的類型略有區別, 前者能夠認爲是「簡單」顯示, 後者是「完整」顯示,好比: 整數,前者顯示爲int, 後者顯示爲interger; 浮點數前者顯示爲 :float,後者顯示爲double. 字符串都顯示爲string.

  1. 並且字符串 var_dump還會顯示長度(length=x)

  2. 因此, 對於php來講, 由於是弱類型語言,因此在定義變量時, 並不須要聲明變量類型, 甚至, 同一個變量$a, 還能夠賦予不一樣類型的值, 如$a=10, 後面還能夠$a="abc". 都是能夠的! 所以,不須要用int/integer之類的關鍵字來講明。因此 對於php變量的類型「名稱、字符串」,只是咱們使用的「人」的一種稱呼, php代碼自己其實並不關心「什麼稱呼」的! 或者說 根本就沒有這種說法或問題存在。
    甚至說, 某個變量是整數, 能夠說是: int, integer, 你若是高興,也能夠說他是: inti, inte, integ, integering均可以???只要你的代碼中的數據類型在運算時是正確合適的就行。

因此, 能夠說: php中的int 跟 integer沒有區別,相等的; 一樣的float,double, real都認爲是相等的,一回事!

php是解釋型仍是編譯型?

是否作類型檢查?

php代碼堯轉換爲c代碼嗎? 爲何有 function {main}()?

關於html代碼的寫法?

10<pre class='xdebug-var-dump' dir='ltr'><small>int</small> <font color='#4e9a06'>10</font>
</pre><pre class='xdebug-var-dump' dir='ltr'><small>float</small> <font color='#f57900'>10200</font>
</pre><pre class='xdebug-var-dump' dir='ltr'><small>float</small> <font color='#f57900'>11</font>
</pre><pre class='xdebug-var-dump' dir='ltr'><small>string</small> <font color='#cc0000'>'123'</font> <i>(length=3)</i>
</pre><pre class='xdebug-var-dump' dir='ltr'><small>float</small> <font color='#f57900'>11.2</font>
</pre>integer<br>double<br>double<br>string<br> 數字  數字  數字  數字<br>10<br>double<br><br />
<font size='1'>

<table class='xdebug-error' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
<tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Fatal error: Unsupported operand types in C:\wamp\www\index.php on line <i>30</i></th></tr>
<tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
<tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
<tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0004</td><td bgcolor='#eeeeec' align='right'>375752</td><td bgcolor='#eeeeec'>{main}(  )</td><td title='C:\wamp\www\index.php' bgcolor='#eeeeec'>..\index.php<b>:</b>0</td></tr>
</table>

</font>

  1. echo能夠輸出任意內容:除了html代碼外,還能夠輸出 對瀏覽器端 的 script的js腳本內容:
    好比:echo "<script>alert(\"請先登陸再進行操做\"); window.open('/', '_top'); </script>";
    在雙引號中, 能夠嵌套單引號,若是確實要嵌套雙引號, 可使用 \進行轉義。

  2. isset能夠帶多個參數: if(!isset($_SESSION["uid"],$_SESSION["username"])) ?
    isset: 其中的set表示設置的意思,就是判斷一個變量是否已經設置,並且是否爲null
    若是一個變量被unset,確定就是isset爲false了。
    注意變量被設置爲"",實際上是被設置爲 \0,可是他就不是null了.
    isset能夠帶多個 參數, 此時,只有 這些全部的參數 都被設置且不爲null, 才返回true. 不然返回false. 參數是從左到右進行檢查,遇到錯誤false立刻中止檢查

  3. 平時 多讀 多記 別人的代碼, 框架代碼, 就是增加本身的內功的過程。 要把整個代碼作到「爐火純青」的地步,直到全部的代碼都 「爛熟於心」的地步。

  4. switch語句的case中,若是比較少, 比較簡單的話, 就只用一行來表示就能夠了.
switch($column){
 case 'match_bd31':
       if(($mb_inball==3) && ($tg_inball==1)) $status=1;break;
}
  1. html代碼和php代碼的更緊密的融合:之前沒有記住的就是在 "同一個語句中,講html代碼和php代碼變量的混合書寫", 多用在php文件中的 a 標籤的寫法:
1. 簡單的寫法 echo '<span>hello</span>';
2. 算是比較融合的寫法 <?php for($i=1; $i<3;$i++){ ?>
<tr><th>some text</th></tr>
<?php } ?>
3. 更徹底的更緊密的寫法
 for($i=1;$i<=3;$i++)
    {
       $str .="<a href='{$this->pageUrl}={$i}' >$i</a>"."\n" ;
       $str .= "<a href='{$this->pageUrl}={$i}'>$i</a>"."\n";
     }
  1. var關鍵字是js中定義變量的, 在php中都不使用的。不論是全局、局部變量仍是類的成員變量都不用的
    php更多的是接近 java的語言。
    在定義php的類的時候, 全部的成員變量 和成員函數 都 要用 private/protected/public 來定義, 不須要用
    var來定義。
    至於static和public之間的位置前後關係, 沒有固定的規定, 先後均可以的: public static function getInstance; static private $_instance等等都是能夠的。 私有的成員變量和成員函數推薦用下劃線開頭。

  1. 修改apache httpd的監視端口/服務器端口,很是簡單,就只是改變一下 listen 80的值,好比8080,而後重啓httpd服務便可.

  2. 在windows下,主配置是在conf/下的httpd.conf, 還能夠包含一些附加配置去增長apache的一些附加features, 附加配置是放在conf/extra目錄中,而後只須要在httpd.conf主配置中包含這些附加配置便可.或直接將附加配置文件也是conf結尾的 **.conf的 內容拷貝到主配置文件中.

添加附加配置文件, 確實是添加要去掉#號, 若是加上#, 就被屏蔽了,也就是,不包含這個附加配置
當附加配置的內容有錯誤的時候,有可能致使 主配置文件出錯->致使apache服務啓動不起來.


mysqli和mysql 的區別? 主要參考: http://www.jb51.net/article/28103.htm

  1. apache和php都只有 核心 模塊, 由於不可能把全部的 插件/模塊/擴展 在一開始就寫好/寫完, 因此採用了 可擴展的插件/模塊的方式.
    這中方式 , 主要是在他的 配置文件中進行配置(固然實體文件 要放在對應的 extra/modules/extensions), 如httpd.conf中配置模塊LoadModule... 而php是在
    php.ini中進行設置
  2. mysqli其實並非什麼新的數據庫, 他只是php的一個擴展, 用來 操做mysql數據庫的一個擴展. 是和 php-mysql 擴展- php-mysqli的擴展 相對比的
  3. 在寫mysql的查詢語句的時候, 一種固定的寫法是 : 使用雙引號來表示查詢字符串, 而後裏面的 表示字符串類型的字段必定要用 單引號闊起來, 這樣即便裏面包含變量的話, 也是在雙引號中, 也是有效的 : $sql="select name from users which location='$location'";
  4. mysqli是php-mysql 的improvement加強版, 一是提供的功能更多, 而是安全性有所加強, 同時支持 oop/oos的寫法.如: $conn = new mysqli($db_host, $db_user, $db_passwd, $db); ...
  5. 同時php-mysqli 採用的 永久/持久性鏈接... 而php-mysql採用的是 非持久鏈接..
相關文章
相關標籤/搜索