
批改狀態(tài):合格
老師批語:
函數(shù): 在php中可分為php內(nèi)置函數(shù)和用戶自定義函數(shù),
// 函數(shù)可以理解為 能夠?qū)崿F(xiàn)某個功能的代碼塊,時代碼重用的一個手段;函數(shù)在定義的時候不會執(zhí)行,在調(diào)用的時候才會執(zhí)行;
// 函數(shù)的申明,通過 function 關(guān)鍵字開頭 ,函數(shù)名通過 下劃線'_' 字母開頭,函數(shù)名對大小寫不敏感;
// 函數(shù)具有返回值,通過 return 返回,函數(shù)只有一個返回值,如果要返回多個值,可以返回 數(shù)組、對象(匿名類方式)、或json 字符串
//函數(shù)具有參數(shù), 在函數(shù)調(diào)用的時候傳入的參數(shù) 叫做實際參數(shù),函數(shù)名后面的產(chǎn)生 稱為形式參數(shù),用于接收實際參數(shù),
// 函數(shù)的參數(shù)默認時通過值傳遞的方式,在函數(shù)內(nèi)部對參數(shù)的改變不會影響函數(shù)外面的參數(shù)的值;
//如果須要改變函數(shù)外面參數(shù)的值,可以通過引用的方式傳參,在形參前面加一個取地址符 & ;function getName(&$name){}
//函數(shù) 的作用域: 函數(shù)
// 閉包: php 官方手冊給出的定義是: 閉包函數(shù)就是匿名函數(shù); 就是沒有函數(shù)名(標(biāo)識符)的函數(shù),它可以賦值給一個變量,通過變量名調(diào)用,
// 閉包最常用的 場景就是,作為函數(shù)的返回值返回,后賦值給一個變量,再進行使用。
// 閉包可以沖父作用域中繼承變量,但是 要 使用 use 關(guān)鍵字傳遞進去,
// use 不能用于一下情形: 超全局變量、$this、 當(dāng)前函數(shù)參數(shù)同名的變量;
// 函數(shù) 的作用域: php函數(shù)內(nèi)定義的變量屬性函數(shù)內(nèi),稱為局部作用域,函數(shù)外申明的變量稱為全局作用域;
// php中作用域不重疊,函數(shù)內(nèi)部不能訪問函數(shù)外部的變量(可通過global關(guān)鍵字或$GLOBALS超全局變量訪問),函數(shù)內(nèi)申明的變量不能在函數(shù)外訪問,預(yù)定義的超全局變量可以在整個腳本使用
$a = 456;
// 函數(shù)申明和函數(shù)作用域
function getName()
{
$a = 789;
echo $a;
}
echo $a; // 輸出456
echo '<hr>';
getName(); //輸出 789
//通過實例我們可以看出函數(shù)內(nèi)部不能直接使用函數(shù)外部的全局變量
function getName1()
{
//通過global 關(guān)鍵字使用函數(shù)外部全局變量
global $a;
$a = 999;
echo $a . '<br>';
}
getName1();
echo $a;
$a = 80;
echo $a;
// globla 關(guān)鍵字是直接引用(引用傳值)函數(shù)外部的全局變量到函數(shù)內(nèi)部使用,如果從新賦值,會改變變量初始
echo '<hr>';
$b = 5678;
function getName2()
{
//通過超全局變量 $GLOBALS 在函數(shù)內(nèi)部訪問函數(shù)外部的全局變量
$c = $GLOBALS['b'];
$c = 5680;
return $c += 2;
}
echo getName2();
echo $b;
//通過超全局變量 $GLOBALS 在函數(shù)內(nèi)部使用全局變量,在函數(shù)內(nèi)對變量進行重新賦值,不會改變原變量數(shù)據(jù)
echo '<hr>';
//函數(shù)內(nèi) 靜態(tài)變量 static 關(guān)鍵字定義:靜態(tài)變量在函數(shù)調(diào)用執(zhí)行后不會立即釋放內(nèi)存,可以保持該變量的值,
function getName3()
{
// static $num = 0;
for ($num = 0; $num <= 100; $num++) {
echo $num . '<br>';
}
}
getName3(); // 輸出0-100 的整數(shù);這個例子沒有舉對;
echo '<hr>';
function getNum($u)
{
static $n = 0; //每調(diào)用一次函數(shù) 就更新一下$n
$n++;
echo "\$n自身的值:$n" . '<br>';
return "\$n和\$u相加后的和:$n + $u =" . ($n + $u) . '<br>';
}
echo getNum(1); // 輸出2
echo getNum(1); // 輸出3
echo getNum(1); // 輸出4
echo getNum(1); // 輸出5
echo '<hr>';
//函數(shù)外部訪問函數(shù)內(nèi)部變量;
//(這個邏輯是錯誤的,因為函數(shù)內(nèi)的代碼塊是在函數(shù)調(diào)用執(zhí)行的時候才創(chuàng)建,函數(shù)執(zhí)行完畢后就沒有了,所以在函數(shù)外部是訪問不到函數(shù)內(nèi)部的變量的,只有在函數(shù)執(zhí)行的時候,把須要的值通過返回值的方式獲得,)
function getColor()
{
static $color = 'red';
}
//調(diào)用函數(shù)
getColor();
echo $color; //沒有任何輸出,因為函數(shù)內(nèi)申明的變量, 是局部變量,不能在函數(shù)外面使用,
var_dump($GLOBALS['color']); //通過$GLOBALS 超全局變量 也不能直接獲取函數(shù)內(nèi)部申明的局部變量
// 上面 輸出 : NULL
global $color;
echo $color . '<br>';
var_dump($color); // 同 $GLOBALS 一樣 輸出NULL
getColor();
echo '<hr>';
function getColor1()
{
$color = 'red';
return $color; //要獲取函數(shù)內(nèi)部申明的局部變量 可以通過 函數(shù)返回值的方式
}
echo getColor1(); // 輸出 red;
echo "<hr>";
// 遞歸 : 函數(shù)自己調(diào)用自己
function myExe()
{
static $a = 0; //申明一個靜態(tài)變量
$a++;
if ($a <= 10) {
echo "\$a等于$a" . '<br>';
myExe();
}
}
myExe();
echo "<hr>";
//函數(shù)的參數(shù)
//可分為: 必填參數(shù)、選填參數(shù)(就是函數(shù)的形參有默認值,)不定參數(shù)(假定在不知道參數(shù)個數(shù)的情況下使用 ... ,可以把多個參數(shù)集合到一個數(shù)組中)
// 必填參數(shù)
function show($a)
{
echo $a;
}
//show();// 如果不傳參數(shù)會報錯
show('hello 如來');
echo '<hr>';
//選填參數(shù)
function show1($a = '我是觀音姐姐')
{
echo $a;
}
show1(); // 由于形參有 默認參數(shù),所以在調(diào)用函數(shù)的時候不傳參數(shù) ,函數(shù)也是可以正常執(zhí)行的,
echo "<hr>";
show1('我是觀音姐姐的粉絲');
echo "<hr>";
//不定參數(shù)
function getSum(...$arr)
{
//php 預(yù)定義函數(shù) array_sum() 函數(shù),專門用于數(shù)組求和
return array_sum($arr);
}
echo getSum(10, 20, 30, 40, 50, 60,);
echo "<br>";
echo getSum(10, 20, 30);
echo "<hr>";
//閉包 :閉包 可以理解為匿名函數(shù)
// 申明一個匿名函數(shù) 并賦值給變量$color,這個匿名函數(shù) 可以理解為$color 的值,{}后面須要寫 分號,不然語法錯誤;調(diào)用的時候也用函數(shù)的方式調(diào)用;
$color = function ($a, $b) {
return $a + $b;
};
echo $color(5, 2);
echo "<hr>";
//閉包(匿名函數(shù)) 可以繼承父作用域的 變量,使用 use 關(guān)鍵字 引入父作用的變量,
// use 關(guān)鍵字不能引入 :$this 、 函數(shù)形參變量名相同的變量 、 php超全局變量
$ab = 10;
$abc = 81;
$summ = function ($a, $b) use ($ab, $abc) {
echo $a + $b + $ab + $abc;
};
$summ(5, 4);
echo "<hr>";
// 閉包中的引用傳值
$col = 'red';
$color = function (&$col) {
$col = $col;
echo $col . '<br>';
$col = 'blue';
echo $col . '<br>';
};
$color($col);
echo '<br>';
echo "在函數(shù)內(nèi)從新賦值后的全局變量:\$col 值等于:$col";
echo '<hr>';
//回調(diào)異步執(zhí)行函數(shù) call_user_func_array(函數(shù),[函數(shù)參數(shù)數(shù)組形式])
function getUser($user)
{
return $user .= '生活在偉大的中華人民共和國,他樂觀、積極并且樂于助人';
}
echo getUser('小明'); //正常調(diào)用
echo '<hr>';
echo call_user_func_array('getUser', ['小紅']);
echo "<hr>";
//函數(shù)返回值
// 函數(shù)只能返回一個值:如果要返回對個值,可以改變返回值的數(shù)據(jù)類型, 改為數(shù)組、對象(通過匿名類)、json 等
// 返回單個值
function getAge($age)
{
return $age; //直接返回
}
echo getAge(66); //返回單個值
echo '<hr>';
// 通過數(shù)組形式 返回多個值
function getAge1(...$age)
{
$ages[] = $age;
// $ages[] = 100;
return $ages; //返回數(shù)組
}
var_dump(getAge1(11, 33, 44));
echo '<hr>';
function getAge2($a, $b, $c)
{
$ages[] = $a;
$ages[] = $b;
$ages[] = $c;
// $ages[] = 100;
return $ages; //返回數(shù)組
}
var_dump(getAge1(11, 33, 44)); // 返回的是一個二維數(shù)組
echo '<hr>';
// 通過對象(匿名類的方式)的形式返回對個值
function getAge3()
{
return new class()
{
public $name = '御弟哥哥';
public $age = 1000;
}; // 匿名類后面的 花括號 要加分號 結(jié)束;
}
//把返回的對象 用一個變量接收
$obj = getAge3();
echo $obj->name;
echo '<br>';
echo $obj->age;
echo '<hr>';
//通過 json 格式 返回多個值
function getUser4(): string
{
$users = ['id' => '1', 'name' => '包租婆', 'age' => '50', 'sex' => '女'];
return json_encode($users, JSON_UNESCAPED_UNICODE);
// return json_encode(['id' => '1', 'name' => '包租婆', 'age' => '50', 'sex' => '女'], JSON_UNESCAPED_UNICODE);
}
$users = getUser4();
var_dump($users);
echo $users;
echo '<hr>';
//通過 json_decode()函數(shù) 把 json數(shù)據(jù) 解析并賦值到變量
//解析之后 默認是對象方式調(diào)用;
$user = json_decode($users);
echo $user->id;
echo $user->name;
echo '<hr>';
//json_decode() 函數(shù) 默認以對象方式返回,如果想以數(shù)組的方式返回數(shù)據(jù),須要使用第二個參數(shù),設(shè)置為true
$user = json_decode($users, true);
var_dump($user);
echo '<br>';
echo $user['id'];
echo $user['name'];
echo $user['sex'];
echo '<hr>';
//通過php內(nèi)置序列化函數(shù)返回多個值
// serialize() 函數(shù) (序列化)產(chǎn)生一個可存儲的值的表示,(不說人話),返回一個脂字符串,可用于儲存在任何地方。
// 這有利于存儲或傳遞php的值,同時不丟失其類型和結(jié)構(gòu)。
//resource 類型不能不序列化,其他類型都可以被序列化
// unserialize() 函數(shù) (反序列化) 將已經(jīng)序列化的字符串變化php的值。
function getRes()
{
$ress = ['id' => '1', 'name' => '黑熊精', 'age' => '10000', 'sex' => '公'];
return serialize($ress); //將數(shù)組通過序列化成字符串的方式返回給函數(shù),
}
$ress = getRes();
var_dump($ress);
echo '<hr>';
//將被序列化為字符串的 php數(shù)據(jù),轉(zhuǎn)為正常的php 數(shù)據(jù)
$res = unserialize($ress);
var_dump($res);//打印反序列化后的數(shù)組
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號