1. 程式人生 > >PHP基礎教程六之函式、常量

PHP基礎教程六之函式、常量

本節講解的內容

  • include和include_once
  • require和require_once
  • 常量
  • 引入檔案和常量結合案列
  • 變數操作函式
  • 輸出語句

前言

在上篇文章中,我們討論了函式的應用,但是隻是在一個檔案中進行函式的呼叫,當我們想在不同的檔案中進行函式的呼叫時,上節的內容就不能夠實現,但是PHP語言提供了引入的概念。讓這個問題得到了完美的解決。

檔案的引用

如果某個檔案,比如a.php 檔案,要使用 b.php 檔案的函式,這是就需要我們把b檔案中的函式引入到a檔案中。PHP位我們提供了四種方式來達到目的, 分別是 include , include_once, require , require_once 。

雖然總共有四種方式,但是每個的引入方式不一樣。

include和include_once

從名字可以看到,這兩個引入都有include,他們兩個共同的特點就是當引入的檔案出錯的時候(因為你不能保證每個引入的檔案都是正確的)不會終止程式,而是會接著執行下去的。

<?php
    include 'a.php';

    echo '上面引入的檔案出錯了';

結果:
這裡寫圖片描述

include

include,一種引入檔案的形式,它有兩個特點:

  1. 當include引入的檔案出錯的時候,程式不會立即停止,它會一直執行下去。
  2. 如果檔案已經引入了,它會重複的引入,

第一個特點上面已經論述過,第二個特點,當在程式碼中重複的使用include引入同一個

檔案,它會重複的引入。

<?php

/**
 * a.php檔案的內容,一個求和的函式
 */
function sum($a,$b){
    return $a + $b;
}

//func.php檔案的內容
<?php
    include 'a.php';
    include 'a.php';
    echo '重複的引入檔案';

結果:
這裡寫圖片描述

在上面可以看到在此時用include它會報錯,意思是說你之前已經引入了檔案,不能再次引入。

include_once

include_once它和include很像,除了引入出錯會繼續執行外,還有一個是當檔案已經引入後,它不會再次引入。

<?php
    include_once 'a.php';
    include_once 'a.php';
    echo '引入一次檔案。';
.....結果......
引入一次檔案。

可以看到上面的程式碼並沒有報錯。

require和require_once

require和require_once是另外一種檔案引入的方式。他們共有的特點是:

當引入的檔案出錯的時候,就會終止程式,不在向下執行。

<?php
    require 'b.php';
    echo '這句話不會執行';

結果:
這裡寫圖片描述

require

require,一種引入檔案的形式,它有兩個特點:

  1. 當require引入的檔案出錯的時候,程式會立即停止。
  2. 如果檔案已經引入了,它會重複的引入,

第一個特點上面已經論述過,第二個特點,當在程式碼中重複的使用require引入同一個檔案,它會重複的引入。

<?php

/**
 * a.php檔案的內容,一個求和的函式
 */
function sum($a,$b){
    return $a + $b;
}

//func.php檔案的內容
<?php
    require 'a.php';
    require 'a.php';
    echo '引入一次檔案。';

結果:
這裡寫圖片描述

在上面可以看到在此時用require它會報錯,意思是說你之前已經引入了檔案,不能再次引入。

require_once

require_once它和require很像,除了引入出錯會終止程式外,還有一個是當檔案已經引入後,它不會再次引入。

<?php
    require_once 'a.php';
    require_once 'a.php';
    echo '引入一次檔案。';
.....結果......
引入一次檔案。

可以看到上面的程式碼並沒有報錯。

系統為我們提供了四種方式,但我們怎麼知道選擇什麼樣的引入方式呢?

如果我們在引入某些檔案(比如獲取資料庫連線,開啟檔案等。建議使用_once這種方式來引入檔案),防止資源浪費。而我們在開發中經常使用require和require_once這種方式。

更推薦使用require_once這種方式。因為使用這種方式可以節省資源,同時可以避免重複定義出現的錯誤。

檔案引入機制

檔案引入的深入瞭解:在PHP中當在一個檔案中引入另外一個檔案的時候,就會去執行引入的檔案,我們在引入的檔案中可以返回一個值,也可以不返回,直到檔案結束。

<?php

    echo '這是引入的檔案<br>';
    require_once 'b.php'; //引入b檔案
    echo '當執行完引入的檔案後執行這句話<br>';
b.php檔案
<?php
    echo '這是另外一個檔案<br>';
    return;
......結果......
這是引入的檔案
這是另外一個檔案
當執行完引入的檔案後執行這句話

仔細看到上面的程式碼,可以看到在引入的檔案中使用return終止語句,並沒有終止主檔案的終止。它們雖然在同一個記憶體中執行,但是不影響各自的執行。

引入檔案的return問題

關於return的問題總結起來總共有三點:

  • 在我們引入一個檔案時,在預設的情況下,成功返回1
  • 我們也可以根據實際情況返回資料,比如一個數組。
  • 在引入檔案過程中,當遇到被引入檔案的return語句時,引入過程將終止,返回主檔案,繼續執行。

常量

在我們的開發過程中,往往需要一些全域性性的值,就是已經確定並且我們在以後不會修改他們,比如說網站的根目錄路徑,這時候我們已經不能夠使用變數,因為變數我們是可以修改的。在這裡就介紹PHP中另外一種常量

常量:常量可以理解成是一種特殊的變數,一旦被定義,就不能再改變或者取消定義[即: 不能unset常量].

那我們用什麼來定義常量呢?PHP中提供了兩種方法來定義常量。

  • define(string $name ,常量的值);定義一個常量
    1. 第一個引數就是我們的常量名。
    2. 第二個引數是常量的值;僅允許標量和 null 。標量的型別是 integer , float , string 或者 boolean 。 也能夠定義常量值的型別為 resource ,但並不推薦這麼做,可能會導致未知狀況的發生。
  • const 在 PHP 5.3.0 以後,可以使用 const 關鍵字在類定義之外定義常量。

我們在定義常量的時候,這兩個都可以使用。

<?php
    define('PI',3.1415926);
    echo PI . '<br>';
    const TAX = 0.012;
    echo TAX;
    ......結果......
    3.1415926
    0.012

從上面的程式碼可以看出常量的定義和變數使不一樣的,它們兩個是有區別的。

常量和變數的區別:

  1. 常量前面沒有美元符號($);
  2. 常量只能用 define() 函式定義,而不能通過賦值語句;
  3. 常量可以不用理會變數的作用域而在任何地方定義和訪問;
  4. 常量一旦定義就不能被重新定義或者取消定義;
  5. 常量的值只能是標量。
  6. 常量的名字一般都是大寫。

處理我們自己定義的常量外,PHP系統還給我們定義了一些常量,比如我們在講整型的時候用到的PHP_INT_MAX,獲取整型的最大值。

魔術常量

PHP語言可以說有一個特色,它的語法中有魔術這個概念。在系統常量中就有魔術這個概念,PHP稱之為魔術常量,那什麼是魔術常量?

魔術常量:PHP 向它執行的任何指令碼提供了大量的預定義常量。不過很多常量都是由不同的擴充套件庫定義的,只有在載入了這些擴充套件庫時才會出現,或者動態載入後,或者在編譯時已經包括進去了。(一大堆看不懂的話-_-);

簡單的來說就是系統總共提供了八個魔術常量,它們的值隨著它們在程式碼中的位置改變而改變。例如 __LINE__ 的值就依賴於它在指令碼中所處的行來決定。這些特殊的常量不區分大小寫。

PHP的魔術常量:

  1. __LINE__ 檔案中的當前行號。
  2. __FILE__ 檔案的完整路徑和檔名。如果用在被包含檔案中,則返回被包含的檔名。自 PHP 4.0.2 起, __FILE__ 總是包含一個絕對路徑(如果是符號連線,則是解析後的絕對路徑),而在此之前的版本有時會包含一個相對路徑。
  3. __DIR__ 檔案所在的目錄。如果用在被包括檔案中,則返回被包括的檔案所在的目錄。它等價於 dirname(__FILE__)。除非是根目錄,否則目錄中名不包括末尾的斜槓。(PHP 5.3.0中新增) =
  4. __FUNCTION__ 函式名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函式被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。
  5. __CLASS__ 類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。類名包括其被宣告的作用區域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 對 trait 也起作用。當用在 trait 方法中時,__CLASS__ 是呼叫 trait 方法的類的名字。
  6. __TRAIT__ Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定義時的名字(區分大小寫)。Trait 名包括其被宣告的作用區域(例如 Foo\Bar)。
  7. __METHOD__ 類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。
  8. __NAMESPACE__ 當前名稱空間的名稱(區分大小寫)。此常量是在編譯時定義的(PHP 5.3.0 新增)。

示例:

<?php
    define('PI',3.1415926);
    echo PI . '<br>';
    const TAX = 0.012;
    echo TAX . '<br>';

    echo __DIR__; //使用魔術常量來獲取當前檔案所在的絕對路徑。
    ......結果......
    3.1415926
    0.012
    D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu

可以看到在使用__DIR__這個魔術常量的時候,在執行後,自動獲取檔案當前的絕對路徑。

上面的內容就是常量的使用,當然還是多練。當我們在開發中怎麼利用魔術常量和檔案引入開發呢?

引入檔案和魔術常量的最佳示例

在開發中我們在引入檔案的時候,檔案的路徑是一個關鍵,我們有兩種選擇,一種是相對路徑,一種是絕對路徑。開發中我們往往選擇是絕對路徑,也就是檔案所在的路徑比如c:/mywamp/apache24/…,這種格式就可以理解為絕對路徑。

在這裡我們來對引入檔案和魔術常量進行一個綜合應用:

這裡寫圖片描述

在上面使我們在開發中可能用到的資料夾,今天我們只是簡單的進行使用,就是後面的流程

  • 在lib資料夾下有一些f函式檔案,裡面有我們使用的函式,我們可以定義為function.php
  • 在lib的init.php中使用魔術常量來定義一些常量,用來表示檔案的絕對路徑,就算你把專案的路徑換了,也是可以的,同時在init.php中引入函式庫
  • 在index.php中引入init.php檔案。

function.php:

<?php

    function getSum($a,$b){ //計算兩個數的和
        return $a + $b;
    }

    function getSub($a,$b){ //計算兩個數的差
        return $a - $b;
    }

init.php

<?php

    //定義專案的根目錄
    define('WEB_ROOT_PATH',dirname(__DIR__) . '/');

    //定義css的路徑
    define("CSS_PATH",WEB_ROOT_PATH . 'css/');

    //定義js的路徑
    define('JS_PATH',WEB_ROOT_PATH . 'js/');

    //定義圖片的路徑
    define('IMAGE_PATH',WEB_ROOT_PATH . 'image/');

    //定義存放模板的路徑
    define('TEMPLATE_PATH',WEB_ROOT_PATH . 'template/');

    //定義lib的路徑
    define('LIB_PATH',WEB_ROOT_PATH . 'lib/');

    //定義model的路徑
    define('MODEL_PATH',WEB_ROOT_PATH . 'model/');


    //我們使用lib的絕對路徑來引入function.php檔案
    require LIB_PATH . 'function.php';

在init中我們使用魔術常量__DIR__來動態的獲取檔案的所在目錄,然後通過dirname()(說明給出一個包含有指向一個檔案的全路徑的字串,本函式返回去掉檔名後的目錄名),得到專案的根目錄,然後根據根目錄得到各個資料夾的絕對路徑,在最後通過絕對路徑引入函式檔案。

index.php

<?php
    require_once './lib/init.php'; //這裡通過相對路徑來獲取初始化檔案

    //上面的表示已經引入了初始化檔案,而我們在初始化中又引入了函式檔案,所以可以在這裡直接用函式檔案裡面的函式。

    $sum = getSum(10,23);
    $sub = getSub(10,5);
    echo $sum;
    echo '<br>';
    echo $sub;
    ......結果......
    33
    5

可以看到在index.php檔案中可以正常的使用lib下的函式檔案裡面的函式。

上面的就是引入檔案和魔術常量的最基本的用法。

函式的結尾

通過上面的介紹,算是基本介紹完了函式的使用和常量的使用,學完函式,我們在來回顧回顧以前不知道的。

操作變數的函式

  • isset() : 檢測變數是否設定,未定義或值為null時返回假
  • unset() : 銷燬指定的變數。你可以在函式中傳入變數進行銷燬。
  • empty() : 判斷一個變數是否被認為是空的。當一個變數並不存在,或者它的值等同於 FALSE ,那麼它會被認為不存在。
  • is_int() : is系列有很多函式,用來判斷變數的型別,如is_int,當變數是整型型別的,返回true,否則返回false。

PHP輸出語句

echo

echo 實際上不是一個函式,是PHP語句,所以後面可以不適用括號,當你想用echo輸出多個值得時候,可以用逗號隔開。echo並沒有返回值。

print

print 和echo用法一樣,但是echo的速度要比print的速度快,print也不是一個函式,它是有返回值得,總是返回1.

print_r

print_r(變數)列印關於變數的易於理解的資訊。如果變數是string,integer,float將會直接輸出其值,如果變數是一個數組,則會輸出一個格式化後的陣列。

printf

printf函式返回一個格式化後的字串,它的語法是

printf(format,arg1,arg2)

var_dump

var_dump()一般我們是輸出變數的內容,型別和字串的內容,型別,長度,從而我們可以看到變數的型別是什麼。

總結

通過這兩節的講解,函式和常量的知識算是說完了,函式的呼叫過程和操作在以後開發中我們一定要了然於胸。