1)在定义后后还可以多次赋值
2)可以通过unset()销毁
3)变量名区分大小写
4)变量名必须使用 “$“作为开始
5)变量名/标示符 必须使用字母或下划线开始,后面允许使用数字,“_” “[a~z,A~Z]”,”[0~9]”
1) 常量前面面没有$符号
2) 常量只能通过define()函数定义或者是const关键字定义(php5.3后),且值只能是标量,即可以是 整型 浮点型 布尔型 null字符串等。
3) 在定义后,无论在哪定义,都可以直接调用,没有作用域。
4) 定义后不可以再赋值一直存在内存中,不能被销毁。
常量的创建有关键字const和函数创建,
关键字const
const APP_PATH = '/phpstudy_pro';
函数创建
define('APP_NAME','客户管理系统');
常量可以以下两种方式获取
方式1;
echo 'APP_PATH';
方式2;
echo constant('APP_PATH');
推荐使用方式2。
因为当出现以下情况时,
$name = 'APP_PATH';
echo $name;
获取的APP_PATH,会显示APP_PATH字符串,而不会显示APP_PATH = ‘/phpstudy_pro’的值。
而通过constant来获取,便可以。
echo constant($name);
要记住使用常量名的变量化,只能使用函数来获取。
//创建变量
$username = 'admin';
//访问变量
echo $username,'<hr>';
PHP 过滤器用于验证和过滤来自非安全来源的数据。测试、验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。
PHP 的过滤器扩展的设计目的是使数据过滤更轻松快捷。通过使用过滤器,您能够确保应用程序获得正确的输入类型。
外部数据有;
1.来自表单的输入数据
2.Cookies
3.Web services data
4.服务器变量
5.数据库查询结果
接下来写几个常用函数及其实际演示实例
filter_var() :通过一个指定的过滤器来过滤单一的变量
FILTER_VALIDATE_INT:判断值是否为整数
代码如下:
//创建变量age,并赋值
$age = 44;
//创建变量options,做判断语句
$options = ['min_range'=>18,'max_range'=>60];
//过滤
var_dump(filter_var($age,FILTER_VALIDATE_INT, $options));
echo '<hr>';
$email = 'admin@qq.com';
//当邮箱格式不正确时,报错
// $email = 'admin@qq';
var_dump(filter_var($email,FILTER_VALIDATE_EMAIL));
//274也是邮箱验证的变量过滤器,可以查手册
var_dump(filter_var($email,274));
filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
//创建变量a,b,并赋值
$a = 10;
$b = 90;
//判断变量a,b
var_dump(filter_var_array([$a,$b],FILTER_VALIDATE_INT));
echo '<hr>';
//外部变量,不在当前脚本创建的变量,例如,get,post
//filter_input()
// 以这个URL为例,https://192.168.64.3/dashboard/0815/demo15.php?id=30
// ?id=30查询字符串,通过 "GET" 方法传送的输入变量id
echo $_GET['id'];
//filter_input(输入类型get/post,字符串表示的变量名,过滤器,选项参数)
// 当网页网址为192.168.64.3/dashboard/0815/demo15.php?id=30时
$options = ['min_range'=>1];
var_dump(filter_input(INPUT_GET,'id',FILTER_VALIDATE_INT, $options));
$args = [
'username' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EMAIL,
'age' => ['filter' => FILTER_VALIDATE_INT,'options' =>['min_range'=>18,'max_range'=>60]],
'blog' => FILTER_SANITIZE_URL,
];
var_dump(filter_input_array(INPUT_GET,$args));
函数的返回值方式有单值返回和多值返回。
函数必有返回值,且只能有一个返回值,这叫单值返回。
可以通过以下几种方式实现多值返回(间接返回实现)。
//创建函数demo1,并设为字符串类型
function demo1():string
{
//创建变量 status和message,并赋值
$status = 1;
$message = 'success';
//返回
return $status . ',<span style ="color :red;"></span>' . $message . '</span>';
}
//打印函数demo2
echo demo1(),'<hr>';
//创建函数demo2,并设为字符串类型
function demo2(): array
{
//创建变量 status和message,并赋值
$status = 1;
$message = 'success';
//返回
return ['status' => $status,'message' => $message];
}
//打印数组,是将数据拆分成两个字符串
echo implode(', ', demo2()),'<hr>';
//打印函数demo2
echo print_r(demo2(),true),'<hr>';
//创建函数demo3,并设为字符串类型
function demo3(): string
{
//创建变量 status和message,并赋值
$status = 1;
$message = 'success';
// 将数组进行json编码,返回json格式的字符串
return json_encode(['status' => $status,'message' => $message]);
}
echo demo3(),'<hr>';
序列化,是将变量的值转为字符串表示,可以很方便的存储或传输。
function demo4(): string
{
$status = 1;
$message = 'success';
// 将数组进行json编码,返回json格式的字符串
return serialize(['status' => $status,'message' => $message]);
}
$str = demo4();
echo $str;
$arr = unserialize($str);
print_r($arr);
function demo1(float $arg) : float
{ //在函数中对参数的改变,不会映射到外部的参数
return $arg *= 2;
}
$var = 100;
//打印函数demo1内的返回值
echo demo1($var),'<br>';
//打印变量var,因为在函数中对参数的改变,不会映射到外部的参数,依旧打印出100
echo $var,'<hr>';
在参数前添加取地址符 & ,如下的&$arg就是引用参数。
引用参数的情况喜爱,在函数中对参数的改变,会映射到外部的参数
function demo2(float &$arg) : float
{
//在函数中对参数的改变,会映射到外部的参数
return $arg *= 2;
}
$var = 100;
//打印demo2,为200
echo demo2($var),'<br>';
//打印var,为200
echo $var,'<hr>';
//$opt = '+'。设置opt默认参数为 +
function demo3(float $a,float $b,string $opt = '+'):string
{
switch($opt){
case '+':
return sprintf('%d + %d = %d',$a,$b,($a + $b));
break;
case '-':
return sprintf('%d - %d = %d',$a,$b,($a - $b));
break;
case '*':
return sprintf('%d * %d = %d',$a,$b,($a * $b));
break;
case '/':
if($b !== 0)
return sprintf('%d / %d = %f',$a,$b,($a / $b));
else die('0 is bad');
break;
default:
die('非法操作符');
}
}
// 10 + 20 = 30
echo demo3(10,20,'+'),'<br>';
//opt默认参数为 + ,所以依旧 10 + 20 = 30
echo demo3(10,20),'<br>';
// @没有出现在判断语句中,而打印出非法操作符
echo demo3(10,0,'@'),'<br>';
// 10 - 20 = -10
echo demo3(10,20,'-'),'<br>';
在没有学习剩余参数的情况下
我们通常是这样实现数字相加的
//简单用法
//3个数的相加算法
function demo4($a,$b,$c)
{
return $a + $b + $c;
}
echo demo4(39,22,30),'<br>';
echo '<hr>';
//复杂用法
//多个数的相加算法
function demo5()
{
// print_r(func_get_args());
return array_sum(func_get_args());
}
echo demo5(12,31,4134,5325,132);
用复杂用法,来计算可以,但对后期维护不好,而且代码可读性也差
那就用…rest, …spread语法
…rest语法:在变量加上…就成了剩余参数
…spread:用在调用时的参数中,用在有具体值的参数列表,实参
// ..rest用法
//在变量$args加上...就成了剩余参数,...$args
function demo6(...$args)
{
// print_r($args);
return array_sum($args);
}
echo demo6(12,31,4134,5325,132);
//可以进行多个数的运算。
// ...rest ...spread混合一起用
//变量$args为剩余参数
function demo7(...$args)
{
//返回变量$args的相加值
return array_sum($args);
}
//创建数组data,并赋值
$data = [12,33,454,54,34,34];
//...spread用在调用时的参数中,用在有具体值的参数列表,实参
echo demo7(...$data);
//也可以不创建数组,直接输入
echo demo7(...[12,33,454,54,34,34]);
直接调用函数(同步调用),有一个致命缺点,就是他是按照顺序调用的,也就是调用语句不执行完成,后面的语句就不会被执行。
如果出现要引用国外网站的数据,由于网络原因,导致读取数据过慢,或者引用很卡的服务器内的内容,那就卡住了。
为了防止这个情况的发生,我们就可以用回调的方式来请求函数了。
!!!!!回调函数是异步执行的重要工具!!!!!!
function demo1($a,$b,$c)
{
return $a + $b + $c;
}
//直接调用
echo demo1(1,2,3),'<br>';
//以回调的方式来请求函数
echo call_user_func('demo1',1,2,3);
echo call_user_func_array('demo1',[1,2,3]);
//创建变量data数组,并赋值
$data =range(1,100);
//创建变量arr,并通过判断语句,选出0到100之间的偶数。
$arr = array_map(function($item){
// % 取模/取余
if($item % 2 === 0) return $item;
},$data);
//array_filter() 函数用回调函数过滤数组中的元素,
$arr =array_filter($arr,function($item){return $item;});
//简化
$arr =array_filter($arr);
print_r($arr);
在php中不允许在同一个命名空间中声明同名函数的,js可以,
下列代码同一个命名空间中声明了相同函数demo1,
导致报错。
function demo1()
{
return __FUNCTION__;
}
echo demo1();
echo '<br>';
function demo1()
{
return __FUNCTION__;
}
echo demo1();
echo '<br>';
但可以在不同命空间中声明同名函数
//ns1命名空间
namespace ns1;
function demo1()
{
return __FUNCTION__;
}
echo demo1();
echo '<hr>';
//ns2命名空间
namespace ns2;
function demo1()
{
return __FUNCTION__;
}
echo demo1();
打印ns1\demo1<hr>ns2\demo1成功
字符串的四种创建方式分别是
$str = 'string';
//单引号的变量不能被解析出来
echo 'This is a $str hello world';
echo '<br>';
echo '<hr>';
//通过字符串与变量来拼接,后输出
echo 'This is a '.$str.' hello world';
// 单引号的特殊字符不能被解析,原样输出
echo 'hello \n\r world .<br>';
echo '<hr>';
//单引号其实有两重意义:1.本义就是字符。2.字符串的定界符
//单引号中又出现单引号,必须使用转义符:\
echo 'this is a \'test\'.<br>';
echo '<hr>';
// 如果又出现转义符:\,应该连续写两个才可以正常输出,否则就是转义
echo 'this is \'\\test\' world';
echo '<hr>';
// 双引号中的变量能被解析出来
echo "This is a $str hello world";
echo '<hr>';
//为了更加清晰的表示出此为变量,用{$str}或 ${str}这样在变量后加其他东西也不会混淆
echo "This is a {$str} hello world.<hr>";
//${var}与es6中的模版字符串语法相同
echo "This is a ${str} hello world.<hr>";
// 双引号的特殊字符能被解析,多个空格,或回车在页面中视为一个
echo "hello \n\r world.<hr>";
echo "hello \n\n\n\r\r\r world.<hr>";
echo "this is \"demo\" . <hr>";
可以当作双引号的plus+,可以解析变量,双引号不需要转义,非常适合php+html模版
$hello = 'rinki.me';
echo "<p>hello <span style=\"color:red\">$hello</span></p>";
echo <<< HELLO
<p>hello <span style="color:red">$hello</span></p>
HELLO;
// 也可以在heredoc的起始标示符添加双引号
echo <<< "HELLO"
......
HELLO;
可以当作单引号的plus+,适合大段的纯文本,不适合内嵌变量,或者特殊字符的文本
echo 'this is text';
echo <<< 'abc'
this is textthis is textthis is textthis is textthis is text
abc;