Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:写得很全面
echo
: 回显, 无返回值print($var)
: 打印变量, 与echo功能类似 , 但是会有返回值: 1print_r($var, false|true)
: 以更容易理解的方式打印变量(readily易于理解)var_export($var, false|true)
: 输出/返回变量的字符串表示var_dump($var1, $var2...)
: 打印一个或多个变量的结构,包括类型与值
举例:$check_email, $checkEmail, $checkShop1, $checkShop2
$string1;
var_dump($string1); //打印是null值
$var = 'email';
$$var = 'tlilam@163.com';
print($email); //使用$$var将后面的$var转为它的值email 就变成$email
// 字符串
$name = '平板';
// 数值
$price = 6000;
// 布尔
$is5G = true;
// 一维数组
$array = ['手机',4900,false];
var_dump($array);
// 二维数组或多维数组
$array2 = ['电脑',[8888,true]];
var_dump($array2);
// null类型
// 上面创建的$string1就是null特殊类型
$n = null;
// 资源类型
$f = fopen('demo1.php','rw');
$functionName = 'tlilam1';
function test2(){
$functionName = 'tlilam2'; //在函数内的变量与外部不互通
return $functionName;
}
$functionName2 = 'tlilam';
function test3(){
//函数内没有创建$functionName2 声明后能得到全局变量的内容
global $functionName2;
return $functionName2;
}
echo test3();
// global声明过后也可以使用超全局变量$GLOBALS['变量名']进行访问
echo $GLOBALS['functionName2'];
1.const创建
const APP_PATH = '/phpstudy_pro';
2.define创建
define('APP_NAME','管理系统');
class classname
{
const GUOJIA = 'China';
}
// constant访问常量
echo constant('APP_NAME');
echo '<hr>';
echo APP_NAME;
echo '<hr>';
$name = 'APP_NAME';
// 常量名的变量化,只能使用函数来获取
echo constant( $name );
echo '<hr>';
// 特别注意常量名为'' 不是没有,只不过是一个空字符串
define('', 'admin@qq.com');
echo constant('');
// 验证数值
$age = 44;
$options = ['options'=>['min_range'=>18,'max_range'=>60]];
// 使用filter_var函数,参数1被验证的变量, 参数2过滤器名称FILTER_VALIDATE_INT, 参数3过滤器的参数
var_dump( filter_var($age,FILTER_VALIDATE_INT,$options) );
echo '<br>';
// 验证邮箱
$email = 'tlilam@163.com';
var_dump( filter_var($email,FILTER_VALIDATE_EMAIL));
echo '<hr>';
// 验证多个变量类型是否同一个类型可以这么写
$age = 34;
$email = '123';
var_dump(filter_var_array([$age,$email],FILTER_VALIDATE_INT) );
echo '<br>';
// 验证多个变量对应不同类型
$arr = array(
'name' =>'tlilam',
'age' =>'44',
'email' =>'tlilam@163.com',
// 'float' =>'100',
'float' =>19.97,
// 'bool' =>'true',
'bool' =>true,
'ip' =>'255.168.1.1',
// 'ip' =>'555.168.1.1'
);
$filters = array(
'name' => FILTER_SANITIZE_STRING,
"age" => array(
"filter"=>FILTER_VALIDATE_INT,
"options"=>array
(
"min_range"=>20,
"max_range"=>100
)
),
'email' =>FILTER_VALIDATE_EMAIL,
'float' =>FILTER_VALIDATE_FLOAT,
'bool' =>FILTER_VALIDATE_BOOLEAN,
'ip' =>FILTER_VALIDATE_IP
);
// 将变量和验证条件都放在数值中,使用下标名字对应起来
var_dump( filter_var_array($arr,$filters) );
echo '<hr>';
// 验证单个外部变量
// 函数结构 filter_input( 输入类型get/post, 字符串的变量名,过滤器,过滤器参数 )
$options = ['options'=>['max_range'=>60]];
var_dump( filter_input(INPUT_GET,'id',FILTER_VALIDATE_INT,$options) );
echo '<br>';
//创建过滤器数组
$arr = [
'name' =>FILTER_SANITIZE_STRING,
'email'=>FILTER_VALIDATE_EMAIL,
'age' =>['filter'=>FILTER_VALIDATE_INT,'options'=>['min_range'=>20,'max_range'=>60]],
'url' =>FILTER_VALIDATE_URL
];
// 测试地址:http://php.edu/0815/test2.php?name=tlilam&email=tlilam@163.com&age=20&url=http://www.tlilam.cn&dd=20
// 只会验证变量名相同的数据,不存在的不会验证输出
var_dump( filter_input_array(INPUT_GET,$arr) );
if(filter_has_var(INPUT_GET, "name")){
echo'name 存在';
}else{
echo'name 不存在';
}
INPUT_GET
, INPUT_POST
, INPUT_COOKIE
, INPUT_SERVER
, INPUT_ENV
// 得到过滤器的名字
print_r(filter_list());
// 使用filter_list得到名字,再使用filter_id得到过滤器ID 上面的过滤器FILTER_VALIDATE_EMAIL可以使用他们的ID代替
echo(filter_id("email"));
function 函数名(参数类型 参数,参数类型 参数='默认值'...) : 返回值类型
{
// 一条或多条的语句
return 返回值;
}
//函数调用
函数名(参数1,参数2...)
// 系统内置的总和函数,我们自己并没有定义这样一个函数,是系统预定义好的
echo array_sum([5,5.5,7,8.5]);
自己定义一个总计函数,自己创建一个系统没有的函数就是自定义函数
$arr = [7,8,9,10,1];
function sum($arr){
foreach($arr as $value){
$a +=$value;
}
return $a;
}
echo sum($arr);
function test(){
echo 'test';
}
function test2(){
echo 'test2';
}
$a = 'test';
echo $a();
echo '<hr/>';
$a = 'test2';
echo $a();
//因为没有函数名,无法直接使用函数名调用,需赋值的方式给变量,然后使用变量()调用
$getPrice = function (float $money, float $discount) : float {
return $money * $discount;
};
echo '实付金额: ' , $getPrice(2000, 0.6), ' 元<hr>';
// 匿名函数在php中也称之为闭包,闭包也是一个函数,可以访问上一级空间的成员
// 将折扣率变量声明到它的全局空间,是它的父作用域
$discount = 0.8;
// use () 这里使用的全局变量就是函数外的变量
$p = function (float $money) use ($discount) : float {
return $money * $discount;
};
echo '实付金额: ' , $p(10000), ' 元<hr>';
// 闭包更多是指子函数
$f = function ($discount) {
// 返回一个子函数
return function (float $money, int $n) use ($discount) : float {
$total = $money * $n;
return $total * $discount;
};
};
echo '实付金额: ' , $f(0.6)(10000, 2) , ' 元<hr>';
//上面的$f(0.6)(10000,2)等同于下面
// $p = $f(0.6);
// $p 是闭包函数的引用
// echo '实付金额: ' , $p(10000, 2) , ' 元<hr>';
// 闭包是匿名函数最常用的应用场景之一
// 闭包是一个子函数,全局不可见,但是它的父函数可见
// 闭包全局无法调用,可以当成父函数的返回值返回到全局,它可以将函数中的一些内容带给全局使用
// 因为函数一旦调用完成,内部全部释放掉, 外部不再能访问,外部不能访问函数中的私有成员
// 那么函数中的私有成员 , 可以通过它的子函数(闭包)返回到全局供它使用
function null(){
$a = 1;
$b = 2;
$c = $a+$b;
}
var_dump(null());
// 返回字符串
function string():string{
$str = '我是字符串';
return 'string'.$str.'<br/>';
}
echo string();
// 返回数组
function arr(){
$arr = [1,2,3,4,5,6];
return $arr;
}
var_dump(arr());
// 返回json格式字符串
function jsonStr(){
$arr = [1,3,5,7,9];
return json_encode($arr);
}
echo jsonStr();
// 返回序列化字符串
function serializeStr():string{
$string = 'abcdef';
$arr = [2,4,6,8];
return serialize( ['string'=>$string,'array'=>$arr ] );
}
echo serializeStr();
function test1(int $var) :int{
return $var *=4;
}
$var = 20;
echo test1($var).'<br/>';
echo $var;
$var = 20;
// 使用&引用外部参数,函数内变量发生改变,全局变量也改变
function test2(int &$var) :int{
return $var *=4;
}
echo test2($var).'<br/>';
echo $var;
function test3(int $var = 100):int{
return $var *= 4;
}
echo test3().'<br/>';
// ...rest在自定义函数内的参数使用,调用传入的多个参数全部会归纳进$arr成为数组
function test(...$arr){
return $arr[0]*$arr[1];
}
echo test(10,20);
echo '<hr/>';
// ...spread在调用函数时传入的参数是一个数组可以使用这个展开
function test2($a,$b){
return $a*$b;
}
$arr = [20,30];
// ...$arr会展开成一位位的对应函数里面的参数
echo test2(...$arr);
echo '<hr/>';
// 个人认为会很少一起用的,平时应该分开使用,...spread展开整体, ...rest归纳合并成整体
// ...rest 与...spread 混合使用
// ...rest 多个参数全部会归纳进$arr成为数组
function test1(...$arr)
{
// print_r($arr);
return array_sum($arr);
}
$data = [10,20,30,40,50];
// ...spread用在调用函数的参数中,用在有具体值的参数列表,实参
echo test1(...$data), '<hr/>';
//同时使用效果是没变化,传一个数组参数被分散,在函数内又进行合并成数组,和直接传入一个数组无差
function test1($a,$b,$c){
return $a + $b + $c;
}
// 直接调用(同步调用:这条调用语句不执行完成, 后面语句不会被执行)
echo test1(1,2,3), '<hr/>';
// 以回调的方式来执行一个函数
// 1. call_user_func($callback,参数1,参数2,…)的参数个数根据回调函数的参数来确定的。
echo call_user_func('test1', 1,3,5);
echo '<hr>';
// 2. call_user_func_array是以数组的形式接收回调函数的参数
echo call_user_func_array('test1', [2,4,6]);
// 回调函数是异步执行的重要工具
$arr = array(
['age' =>20,'sex' => '男'],
['age' =>21,'sex' => '女'],
['age' =>22,'sex' => '男'],
['age' =>23,'sex' => '女'],
);
function test($v)
{
if($v['sex'] == '男'){
$v['age'] +=2;
}
return $v;
}
print_r(array_map("test",$arr));
// __NAMESPACE__: 返回当前的函数名称字符串
// __FUNCTION__: 返回当前的函数名称字符串
// 命名空间space1
namespace space1;
function test()
{
return '命名空间:'.__NAMESPACE__.',函数名:'.__FUNCTION__;
}
echo test();
echo '<hr>';
// 命名空间space2
namespace space2;
function test()
{
return '命名空间:'.__NAMESPACE__.',函数名:'.__FUNCTION__;
}
echo test();
echo '<hr>';
// 调用另一个空间的函数 反斜杆加 命名空间 反斜杆 函数名 \space1\test();
echo \space1\test();
// 单引号不解析变量,特殊字符等特殊含义的字符,如需输出单引号' 或转义符\ 在前面添加转义符\ 进行转义
$string = 'string';
echo '$string This is a \'test\'. <br> ';
echo '<hr/>';
// 当内容含有多个单引号之类 使用转义符会很累,也可能会漏加就使用nowdoc
// 前面的定义字符一定需要单引号引起
$a = <<< 'abc'
This is 'test'<br>
This is 'test'<br>
This is 'test'<br>
This is 'test'<br>
abc;
echo $a;
echo '<hr/>';
// 双引号会解析变量,特殊字符
echo "This is a $str \n\r hello word. <br>";
// 推荐在双引号内的变量使用大括号包起来,如需输出双引号和转义符使用转义符\进行转义
echo "This is a \n\r {$str}123 \" hello \" word.\\ <br>";
echo '<hr/>';
// 同样内容有很多双引号的时候使用双引号输出会很麻烦需要很多转义符
// 前面的定义字符可以用双引号引起也可以不用
$b = <<< HELLO
<p>Hello <span style="color:red">$hello</span></p>
<p>Hello <span style="color:blue">$hello</span></p>
HELLO;
echo $b;