Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:变量的知识点都在这里了, 任何一种编程语言的变量, 基本上都有这些的
<?php
// # PHP基础:变量与常量
// ## 1.屏幕打印输出类命令
// ## 2.变量的命名规则
// ## 3.变量的值传递与引用传递
// ## 4.变量的检测与删除
// ## 5.变量的数据类型
// ## 6.变量的作用域
// ## 7.静态变量
// ## 8.变量过滤器
// ## 9.常量
// 1.php打印输出类:echo | print | var_dump() | var_export()
// 1.1 echo,直接输出,没有返回值
$myname='Mr.Bao';
echo $myname;
echo '<hr>';
// 1.2 print,不仅输出而且还有返回值,如果执行成功返回1
echo print $myname;
echo '<hr>';
// 1.3 var_dump(),内置函数,既打印输出数组及对象的键值对还输出值类型
$arr=['baoyu','33','man','php'];
$obj=(object)['name'=>'baoyu','age'=>'33','sex'=>'man','study'=>'php'];
var_dump($arr);
echo '<hr>';
var_dump($obj);
// 1.4 var_export(),内置函数,仅打印输出数组及对象的键值对
echo '<hr>';
var_export($arr);
echo '<hr>';
var_export($obj);
echo '<hr>';
//////////////////////////////////////////////
// 2.变量命名规则:变量命名区分大小写,变量必须使用$作为起始符号,不允许用数字开头,不允许使用特殊字符,如@#%!&……*()等
// 2.1 变量名仅能用以下三种字符组成:大小写英文字母,下划线,数字(不能在开头)
// 2.2 变量名应有意义,便于阅读及后期的维护
$myname='纯小写字母的变量名;';
$MyName='大小写字母混用的变量名,更易读;';
$MyName123='大小写字母加数字的变量名;';
$My_Name='大小写字母+下划线的变量名;';
$My_Name_123='大小写字母+下划线+数字的变量名';
echo $myname,$MyName,$MyName123,$My_Name,$My_Name_123;
// 2.3php变量是弱类型,可随时修改变量的值和类型
echo '<hr>';
$var=10;
var_dump($var);
echo '<hr>';
$var='Hello!';
var_dump($var);
echo '<hr>';
$var=['Hello!',100,true];
var_dump($var);
echo '<hr>';
$var=(object)['Hello!',100,true];
var_dump($var);
echo '<hr>';
//////////////////////////////////////////////
// 3.变量的值传递与引用传递
// 3.1 值传递:仅将变量的值赋给另一个变量
$one=10;
$two=$one;
echo $one,'-----',$two,'<br>';
$one=20;
echo $one,'-----',$two,'<br>';
// 3.2 引用传递:另一个变量引用此变量的值,此变量的值更新后,另一个变量也随之更新,也可理解为给此变量起了个别名
$one=10;
$two=&$one;
echo $one,'-----',$two,'<br>';
$one=20;
echo $one,'-----',$two,'<hr>';
// 3.3 可变变量:变量的标识符/变量名可动态改变,变量名可以来自另一个变量的值
$one='two';
$$one='three';
echo $one,'----',$two,'<hr>';
//////////////////////////////////////////////
// 4.变量的检测与删除
// 4.1 用if+isset检测变量是否存在
if (isset($username)) :
echo $username, '<br>';
else:
echo '变量不存在<br>';
endif;
// 4.2 用unset删除变量/销毁变量
$username='Mr.Bao';
unset($username);
if (isset($username)) :
echo $username, '<br>';
else:
echo '变量不存在<hr>';
endif;
// 4.3 变量已定义而未初始化,默认用NULL进行赋值
// 初始化:即第一次赋值
// 更新/修改: 即第二次赋值或第N次赋值
$username;
// 4.4 用is_null()可判断变量是否为null
var_dump(is_null($username));
$username='';
var_dump(is_null($username));
// 4.5 用empty()可判断变量是否为空
var_dump(empty($username));
echo '<hr>';
//////////////////////////////////////////////
// 5.变量的数据类型
// 5.1 基本类型:字符串型、数值型、布尔型
$var='我是字符串string类型';
$int=1000;
$buer=true;
echo '字符串类型:',$var,'<br>数值型:',$int,'<br>布尔类型:',$buer,'<hr>';
// 5.2 复合类型:对象、数组、特殊类型
$obj=(object)['name'=>'Mr.Bao'];//对象类型
$arr=['name',30,'man'];//数组类型
$num=null;//unll类型
$f=fopen('text.txt','r');//读取文件类型
//////////////////////////////////////////////
// 6.变量作用域:函数作用域、全局作用域
// 6.1 根据作用域的不同,可分为:
// (1)私有变量:函数中定义的变量,仅在函数中使用
function fun()
{
$var='函数内的变量,仅在函数内使用';
echo $var,'<br>';
}
fun();
// (2)全局变量:函数之外定义的变量,仅在函数外使用
$var='全局变量,在函数外使用';
echo $var,'<br>';
// (3)超全局变量:也叫预定义变量,不受作用域限制,也不需要声明,在任何地方直接使用即可
echo $GLOBALS['var'],'<hr>';
//////////////////////////////////////////////
// 7.静态变量
// 7.1 静态变量使用“static”前缀+“$”+“变量名”的方式定义
// 7.2 静态变量的特点是多次调用时可将每次调用的结果保存至下一次调用时使用
function fun1(){
static $sum=0;
$sum=$sum+1;
return $sum;
}
echo fun1(),'<br>';
echo fun1(),'<br>';
echo fun1(),'<hr>';
// 总结:变量的本质是数据共享,函数的本质是代码共享
//////////////////////////////////////////////
// 8.变量过滤器:filter_var(),filter_var_array(),filter_has_var(),filter_input(),filter_input_array()
// 8.1 过滤单个变量filter_var()
$age=40;
var_dump(filter_var($age,FILTER_VALIDATE_INT,['options'=>['min_range'=>18,'max_range'=>35]]));
echo '<br>';
$email='mrbao@php.cn';
var_dump(filter_var($email,FILTER_VALIDATE_EMAIL));
echo '<hr>';
// 8.2 过滤数组filter_var_array()
$arr=[100,'name','age',30];
var_dump(filter_var_array($arr, FILTER_VALIDATE_INT));
echo '<hr>';
// 8.3 检测是否存在指定的外部变量, filter_has_var()
// 如url地址中?后面的键值对
// 检测方式有:INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, INPUT_ENV
var_dump(filter_has_var(INPUT_GET,'id'));//GET发送的值
var_dump(filter_has_var(INPUT_POST,'id'));//POST发送的值
var_dump(filter_has_var(INPUT_COOKIE,'id'));//COOKIE的值
var_dump(filter_has_var(INPUT_SERVER,'id'));//SERVER的值
var_dump(filter_has_var(INPUT_ENV,'id'));//ENV的值
echo '<hr>';
// 8.4 访问外部变量的过滤器,filter_input
var_dump(filter_input(INPUT_GET, 'p',FILTER_VALIDATE_INT, ['options'=>['min_range'=>1]]));
echo filter_input(INPUT_GET, 'p',FILTER_VALIDATE_INT, ['options'=>['min_range'=>1]]) ? '页码OK': '页码非法';
// 8.5 同时验证多个外部变量: filter_input_array()
$args = [
'username' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EMAIL,
'age' => ['filter' => FILTER_VALIDATE_INT, 'flags'=>FILTER_REQUIRE_SCALAR, 'options' => ['min_range' => 18]],
'blog' => FILTER_VALIDATE_URL,
];
var_dump(filter_input_array(INPUT_GET, $args));
echo '<hr>';
// 标量:单值变量,字符串,布尔,数值
// 复合:对象,数组
//////////////////////////////////////////////
// 9.常量
// 9.1 常量是代码中不需要更新的数据,有系统自带的常量和自定义的常量
// (1)查看系统自带的常量
print_r(get_defined_constants());//不分组查看
echo '<hr>';
print_r(get_defined_constants(true));//分组查看
echo '<hr>';
// (2)自定义常量,define()函数,const关键字
define('MYNAME', 'BAOYU');
const AGE=30;
echo 'My name is ',MYNAME,' my age is ',AGE,'<br>';
// 常量不受作用域限制,可在函数内直接调用
// 从函数中声明的常量需调用函数后才可访问到,函数中不可用const关键字声明
function myfun1(){
echo 'My name is ',MYNAME,' my age is ',AGE,'<br>';
define('SEX', 'Man');
}
myfun1();
echo 'My name is ',MYNAME,' my sex is ',SEX,'<br>';
// 流程控制中,define能用, const不能用
if (true) {
define('EMAIL', 'baoyu@php.cn');
}
echo EMAIL,'<br>';
// const用在类中,创建类常量,define不能用在类中
class Demo
{
const HELLO = 'php.cn';
}
echo Demo::HELLO.'<br>';
// 常量通常只允许用标量进行初始化
// 标量: 单值变量, 字符串, 数值,布尔, null
// php7.0+支持数组初始化常量
const DB_LINKS = [
'host'=>'localhost',
'username'=>'root',
'password'=>'root',
'charset'=>'utf8',
];
echo '<pre>'.print_r(DB_LINKS,true).'</pre>';
// constant()返回常量的值,可返回由变量或函数保存的常量名的值
echo constant('MYNAME'). '<br>';
echo MYNAME. '<br>';
$constantName = 'EMAIL';
echo constant($constantName);
echo '<hr>';
// 空值也可作为常量名
define('USER_NAME', '其实我也是一个常量');
define('', '其实我也是一个常量');
echo '';
echo constant('');
// (3)查看自定义常量,类常量不能用下面的方法查看到
print_r(get_defined_constants(true)['user']);
echo '<hr>';
// 9.2 魔术常量
echo '当前行号: ' . __LINE__ . '<br>';
echo '当前文件: ' . __FILE__ . '<br>';
echo '当前目录: ' . __DIR__ . '<br>';
function hello123()
{
echo '当前函数名:',__FUNCTION__;
}
hello123();
echo '<hr>';
class D
{
public function index()
{
echo '当前类方法名:',__METHOD__;
}
}
(new D)->index();