PHP函數及作用域知識詳解
本篇文章為大家帶來了關於PHP的相關知識,其中主要介紹了關於函數以及作用域的相關問題,包括了函數命名規範、函數傳回值、可變函數、匿名函數等等內容,下面一起來看一下,希望對大家有幫助。
推薦學習:《PHP影片教學》
一、基本概念
###函數:function,是一種語法結構,將實作某一個功能的程式碼區塊(多行程式碼)封裝到一個結構中,從而實現程式碼的重複利用(重複使用)。
二、基本文法##
函數有幾個對應的重點:function關鍵字、函數名、參數(形參和實參)、函數體和傳回值。
基本語法如下:
Function 函数名([参数]){ //函数体,基本上所有的代码都可以实现,定义变量、定义常量、使用流程控制(分支、循环)、可以调用函数。 //返回值:return 结果; }
是為了實現程式碼的重複利用,一個函數一個函數(簡單明了)。
函數是在程式碼執行階段,碰到函數名字的時候才會調用,而不是在編譯階段。函數的呼叫特點:只要係統在記憶體中能夠找到對應的函數,就可以執行(函數的呼叫可以在函數定義之前)
函數執行的記憶體分析:
三、函數命名規格#讀取程式碼進入到程式碼片段(編譯:將程式碼變成字節碼儲存到記憶體)
- 根據程式碼逐行執行-
- 編譯和執行是分開的(先編譯後執行)
#四、形參和實參命名規格:由字母、數字和底線組成,但不能以數字開頭。函數作為常用的結構,一般遵循以下規則:函數通常名字代表函數的功能,而有些功能會比較複雜,可能一個單字不足以表達,需要多個組合。
- 駝峰法:除了左邊第一個字外,後面所有的字首字母都大寫:showParentInfo()
- 劃線法:單字之間透過底線連接,單字都是小寫:show_parent_info()
形參:形式參數,不具有實際意義的參數,是函數定義時所使用的參數。
實參:實際參數,具有實際意義的參數,是函數呼叫時所使用的參數。
兩者關係式:形參是實參的載體:實參在呼叫時通常是需要傳入到函數內部參與計算(運算),那麼需要在函數內部去找到實際資料的位置才能找到資料本身:需要實際呼叫的時候,將資料以實參的形式傳遞給形參:給形參賦值,從而使得函數內部可以用到外部資料。
<h3>函数参数形参和实参</h3> <?php header("Content-type:text/html;charset=gbk"); //定义函数 function jia($a,$b){ //形参可以有多个,逗号,隔开 echo $a + $b;//函数体使用形参运算 }; $num = 10;//定义实参 jia($num,2);//传入实参,实参可以是变量、常量、运算结果等 ?>登入後複製
#
- 在PHP中允许实参多余形参(个数):函数内部不用而已
- 在PHP中理论上形参个数没有限制(实际开发不会太多)
- 实参不能少于形参个数。
五、形参默认值
默认值:default value,指的是形参的默认值,在函数定义的时候,就给形参进行一个初始赋值:如果实际调用传入的参数(实参)没有提供,那么形参就会使用定义时的值来进入函数内部参与运算。通常默认值是用在一些,一定会有某个数据参与,但是可能通常是某个我们知道的值。
<h3>形参默认值</h3> <?php header("Content-type:text/html;charset=gbk"); $a = 10;//定义实参 //定义函数 function jia($a = 6,$b = 4){ //此时$a是实参,编译不执行,属于jia函数内部,跟外面的$a=10不冲突。 echo $a + $b;//10 + 4 = 14 }; jia($a);//调用$a,有传参就是10,$b是4,所以值就是14 echo "<hr/>"; echo $a;//10 ?>
注意:默认值的定义是放在最右边的(多个),不能左边形参有默认值,但是右边没有函数外部定义的变量名字与函数定义的形参名字冲突(同名)是没有任何关联关系的;如果多个函数使用同样的形参名字也不冲突。
六、实参引用传递
实参在调用时会将值赋值给形参,那么实际上使用的方式就是一种简单的值传递:将实参(如果是变量或者常量或者其他表达式)的结果(值)取出来赋值给形参:形参与外部实际传入的参数本身没有任何关联关系:只是结果一样。有的时候,希望在函数内部拿到的外部数据,能够在函数内部改变,那么就需要明确告知函数(定义时),函数才会在调用的时候去主动获取外部数据的内存地址。以上这种定义形式参数的方式叫作引用传值。
基本定义语法:
Function 函数名(形参1,&形参2){
//函数体
}
<h3>引用传递</h3> <?php header("Content-type:text/html;charset=gbk"); function xiao($x,&$y){ //定义函数xiao() $x = $x * $x; $y = $y * $y; //修改两个形参的值 echo $x;echo "<hr>";echo $y,"<hr>"; }; $x = 4;$y = 2;//定义变量 xiao($x,$y); echo $x,"<hr>",$y,"<hr>"; ?>
思考:两者对比,为什么第二个y变成了4?
参考:php——三篇夯实根基第一篇_xiaochuhe.的博客-CSDN博客里面的变量引用赋值。
注意:引用传值注意事项:在传入实参的时候,必须传入变量!!!
七、函数返回值(return)
返回值:return,指的是将函数实现的结果,通过return关键字,返回给函数外部(函数调用处):在PHP中所有的函数都有返回值。(如果没有明确return使用,那么系统默认返回NULL。
<h3>函数返回值</h3> <?php header("Content-type:text/html;charset=gbk"); function chuhe(){//定义函数 echo __FUNCTION__;echo '<hr/>';//输出当前函数的名称 echo __FILE__;echo '<hr/>';//输出当前文件名的绝对路径 }; //chuhe();echo '<hr>'; var_dump(chuhe());
返回值作用:将计算结果返回给调用处,并且函数的返回值可以是任意数据类型。
<h3>函数返回值——Retrun</h3> <?php header("Content-type:text/html;charset=gbk"); function jia($x,$y){ return $x + $y;//return直接结束jia函数 echo $x; //注意,此时echo函数不执行 }; $num =jia(4,5);//9 echo $num;
- return在函数内部存在的价值:返回当前函数的结果(当前函数运行结束)
- return还可以在文件中直接使用(不在函数里面):代表文件将结果return后面跟的内容,转交给包含当前文件的位置。(通常在系统配置文件中使用较多),在文件中也代表中终止文件后面的代码:return之后的内容不会执行。
八、作用域
作用域:变量(常量)能够被访问的区域
- 变量可以在普通代码中定义
- 变量也可以在函数内部定义
作用域分类:
- 全局变量
- 局部变量
- 超全局变量
1.全局变量
全局变量:就是用户普通定义的变量(函数外部定义)
所属全局空间:在PHP中只允许在全局空间使用:理论上函数内部不可方法
脚本周期:直到脚本运行结束(最后一行代码执行完)
<h3>全局变量</h3> <?php header("Content-type:text/html;charset=gbk"); $global = "这是全局变量!"; //定义变量 function chuhe(){ $inner = __FILE__;//局部变量 echo $global; //肯定是报错的,函数内部肯定是访问不了全局变量滴 }; chuhe();//调用函数
2.局部变量
局部变量:就是在函数内部定义的变量
所属当前函数空间:在PHP中只允许在当前函数自己内部使用
函数周期:函数执行结束(函数是在栈区中开辟独立内存空间运行)
<h3>局部变量</h3> <?php header("Content-type:text/html;charset=gbk"); $global = "这是全局变量!"; //定义变量 function chuhe(){ $inner = __FILE__;//局部变量 //echo $global; //肯定是报错的,函数内部肯定是访问不了全局变量滴 }; chuhe();//调用函数 echo $inner;//访问局部变量,也是报错的
3. 超全局变量
超全局变量:系统定义的变量(预定义变量:$_SERVER、$_POST等)
所属超全局空间:没有访问限制(函数内外都可以访问)
超全局变量会将全局变量自动纳入到$GLOBALS里面,而$GLOBALS没有作用域限制,所以能够帮助局部去访问全局变量:但是必须使用数组方式。
(1)内部调用外部
<h3>超全局变量</h3> <?php header("Content-type:text/html;charset=gbk"); $global = "这是全局变量!"; //定义变量 function chuhe(){ $inner = __FILE__;//局部变量 echo $GLOBALS['global'];//讲全局变量纳入$GLOBALS里面 }; chuhe();//调用函数
(2)外部调用内部
<h3>超全局变量</h3> <?php header("Content-type:text/html;charset=gbk"); $global = "这是全局变量!"; //定义变量 function chuhe(){ global $inner; //定义变量,使用全局变量。 $inner = __FILE__;//局部变量 }; chuhe();echo $inner;//调用函数,并访问局部变量
4.静态变量
静态变量:static,是在函数内部定义的变量,使用static关键字修饰,用来实现跨函数共享数据的变量:函数运行结束所有局部变量都会清空,如果重新运行一下函数,所有的局部变量又会重新初始化。
基本语法:
Function 函数名(){
//定义变量
Static $变量名 = 值; //通常会在定义的时候就直接赋值
}
<h3>静态变量</h3> <?php header("Content-type:text/html;charset=gbk"); function xiao(){ $a = 2;//定义变量 static $b = 3;//定义静态变量 echo $a++;echo "<hr>"; echo $b++;echo "<hr>"; }; xiao();//调用函数 xiao();//再调一次 xiao();//再调一次
静态变量的作用是为了跨函数共享数据(同一个函数被多次调用) 。
九、可变函数
当前有一个变量所保存到值,刚好是一个函数的名字,那么就可以使用变量+()来充当函数名使用。
<h3>可变函数</h3> <?php header("Content-type:text/html;charset=gbk"); function chu(){ echo __FILE__;echo __FUNCTION__;echo __LINE__; } $xiao = "chu";//定义变量 $xiao();//调用可用函数
附加思考:
<h3>可变函数</h3> <?php header("Content-type:text/html;charset=gbk"); function xiao($a,$b){ //假设定义系统函数 $b = $b + 6; return $a($b);//chuhe(16) } function chuhe($c){ return $c * $c * $c; //定义一个用户函数,求该函数的3次方 } echo xiao('chuhe',10);//16*16*16 echo "<br>","懵了吧,多想想就懂了!"; //懵了吧,多想想就懂了!!
十、匿名函数
没有名字的函数,变量保存匿名函数,本质得到的是一个对象(Closure)。
<h3>函数</h3> <?php header("Content-type:text/html;charset=gbk"); $xiaofeng = function(){ //定义匿名函数 echo "我是萧风!"; }; $xiaofeng();echo "<hr>";//调用匿名函数 var_dump($xiaofeng);//查案变量类型及内容
十一、闭包函数
闭包:closure, 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)简单理解:函数内部有一些局部变量(要执行的代码块)在函数执行之后没有被释放,是因为在函数内部还有对应的函数在引用(函数的内部函数:匿名函数)
<h3>闭包函数</h3> <?php header("Content-type:text/html;charset=gbk"); function xiaofeng(){ $inner = __FILE__;//定义局部变量 #定义匿名函数 $chuhe = function() use($inner){//用use讲局部变量保留给内部使用闭包 echo $inner; }; $chuhe();//调用函数 } xiaofeng();
思考:函数使用完后局部变量有没有被释放?
<h3>闭包函数</h3> <?php header("Content-type:text/html;charset=gbk"); function xiaofeng(){ $inner = __FILE__;//定义局部变量 #定义匿名函数 $chuhe = function() use($inner){//用use讲局部变量保留给内部使用闭包 echo $inner; }; return $chuhe();//返回内部匿名函数 } $closure = xiaofeng();//理论上局部变量inner已经释放了 $closure();
十二、伪类型
伪类型:假类型,实际上在PHP中不存在的类型。但是通过伪类型可以帮助程序员去更好的查看操作手册从而更方便学习。
伪类型主要有两种:在三大类八小类之外
- Mixed:混合的,可以是多种PHP中的数据类型
- Number:数值的,可以是任意数值类型(整形和浮点型)
十三、常用系统函数
(一)关于输出的函数
- print():类似于echo输出提供的内容,本质是一种结构(不是函数),返回1,可以不需要使用括号
- print_r():类似于var_dump,但是比var_dump简单,不会输出数据的类型,只会输出值(数组打印使用比较多)
(二)关于时间的函数
- date():按照指定格式对对应的时间戳(从1970年格林威治时间开始计算的秒数),如果没有指定特定的时间戳,那么就是默认解释当前时间戳
- time():获取当前时间对应的时间戳
- microtime():获取微秒级别的时间
Strtotime():按照规定格式的字符串转换成时间戳
<h3>时间函数</h3> <?php header("Content-type:text/html;charset=gbk"); echo date('Y 年 m 月 d 日 H:i:s',987654321);echo "<hr>"; echo time();echo "<hr>"; echo microtime();echo "<hr>"; echo strtotime(" 10 hours");
(三)关于数学的函数
- max():指定参数中最大的值
- min():比较两个数中较小的值
- rand():得到一个随机数,指定区间的随机整数
- mt_rand():与rand一样,只是底层结构不一样,效率比rand高(建议使用)
- round():四舍五入
- ceil():向上取整
- floor():向下取整
- pow():求指定数字的指定指数次结果:pow(2,8) == 2^8 == 256
- abs():绝对值
- sqrt():求平方根
(四)关于自定义函数的函数
- function_exists():判断指定的函数名字是否在内存中存在(帮助用户不去使用一个不存在的函数,让代码安全性更高)
- func_get_arg():在自定义函数中去获取指定数值对应的参数
- func_get_args():在自定义函数中获取所有的参数(数组)
- func_num_args():获取当前自定义函数的参数数量
<h3>自定义函数</h3> <?php header("Content-type:text/html;charset=gbk"); echo "<pre class="brush:php;toolbar:false">"; function xiao($a,$b){ print_r(func_get_arg(1));echo "<hr>";//获取指定参数 print_r(func_get_args());echo "<hr>";//获取所有参数 print_r(func_num_args());;echo "<hr>";//获取参数数量 } xiao(1,2);//调用函数 echo "<br>"; function_exists('xiao') && xiao(1,'2');//在调用函数时,判断指定的函数名字是否在内存中存在(帮助用户不去使用一个不存在的函数,让代码安全性更高)
推荐学习:《PHP视频教程》
以上是PHP函數及作用域知識詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7
