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()一般我們是輸出變量的內容,類型和字符串的內容,類型,長度,從而我們可以看到變量的類型是什麼。

總結

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

發佈了38 篇原創文章 · 獲贊 28 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章