Blogger Information
Blog 54
fans 6
comment 31
visits 106640
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP入门-变量、常量和过滤器
吾逍遥
Original
999 people have browsed it

一、学习的新认识

相比于前端,接触 PHP 要早点,所以对入门课也没太重视,知道老师会讲变量和常量。不过听了两天课,还是有不少新知识需要总结下:

  • 错误提示和抑制错误 在PHP的配置文件中可设置error_reporting,来指定显示错误级别,默认值为E_ALL & ~E_NOTICE,就是不报NOTICE级别错误,如不同类型数据进行运算就是NOTICE级别错误,作为初学者建议修改主E_ALL,即报告所有错误,提高自己书写规范能力。另一个临时抑制错误符号是@。如$str="100pages";@sum=$str+10;就会不提醒类型相关错误了。
  • 打印输出 以前我基本是var_dump走天下,没想到它在真实维护环境中的不足,还好有老师提醒var_export(),我也发现在我框架中使用print_r(),发现二者有一点互补,当第二个参数为true,都是将结果以字符串形式保存到返回值。另外echo可支持多变量输出,这也是新的学习。
  • 变量相关知识学习 重新学习了变量类型,终于把对象、资源搞明白了。之后变量检测、类型转换、全局变量和局部变量也算是对变量有了较全面认识了,不过发现老师在群里整理更详细,收获颇多。
  • 常量相关知识学习 常量认识了预定义常量和魔术常量,知道了查看方法,并初步了解命名空间的由来,原来是为解决全局变量冲突而引入的,不同命名空间下同名的全局变量互不影响。
  • 过滤器 要说本节课最大收获就是过滤器了,可以过滤变量、返回指定要求的值,若失败则返回false提醒用户。

二、认识 PHP

1、PHP解释、执行流程和文档组成

php 是什么?
PHP: (PHP: Hypertext Preprocessor), 超文本预处理器的缩写,服务端的语言。
PHP 是开源的,免费的,可以嵌入 html 中的语言。
脚本语言,是指不需要编译,直接由解释器/虚拟机执行的编程语言

php 程序执行流程
php 程序是用 php 指令编写并由 php 解析器执行的代码
php 程序必须使用.php做为扩展名
php 程序可以使用标签方式嵌入到 html 文档中
执行流程如下:

  1. 客户端请求服务器端的 php 程序
  2. 服务器端将 php 程序转发给 php 解释器执行
  3. php 解释器执行完毕将生成的 html 或其它内容返回到服务器
  4. 服务器将最终生成的 html 代码做为响应内容返回客户端

php1

php 程序文档

序号 组成 描述
1 <?php...?> PHP代码开始和结束标记,开始标记不要有空格,?>可以省略
2 ; 语句分隔符,不可少,否则报Notice级别错误
2 {} 代码块
3 空白符 合理使用空白符可增强代码可读性
4 注释 // 单行注释, /* 多行注释 */

php 标记之外的内容会原样返回客户端,如 html 代码

  1. <?php
  2. function sum(int $a,int b):int
  3. {
  4. return "{$a}+{$b}=".($a+$b);
  5. }
  6. echo sum(10,20);

2、打印输出

开发者在编程中,为了了解变量的变化或查错误,都需要打印输出功能。原生JS是console.log,而PHP则有如下几种:

指令 返回值 带不带括号 输出多个变量 打印的数据类型
echo 没有 不带 可以,多个用逗号隔开 可输出“字符型,整形,浮点型,布尔型,资源”;输出“数组”则是输出Array,不可以输出“对象”(会报错);不会输出“NULL”(不会报错)
print 有,是1 可带,可不带 不可以 和echo表现一致
print_r() 有,是true,当第二参数是true则返回结果字符串 必须带 不可以 可以输出“字符型,整形,浮点型,布尔型,数组,对象,资源”;不会输出“NULL”(不会报错)
var_dump() 有,是null 必须带 不可以 可以输出“字符型,整形,浮点型,布尔型,数组,对象,资源,NULL”
var_export() 有,是null,当第二个参数为true返回结果字符串 必须带 不可以 可以输出“字符型,整形,浮点型,布尔型,数组,对象,NULL”,”资源”返回NULL

使用建议

  • echo 只想显示 int、float、字符串 或运算结果是前面三者时使用echo,而且支持多变量。
  • var_dump()本地开发最常用的排查手段 ,支持所有数据类型,打印信息包括类型、值、长度和所有行。
  • print_r()和var_export() 不像var_dump()会直接显示结果,可避免所有人都看见打印信息。这二者支持 设置第二个参数为true,会将结果以字符串形式保存到返回值 ,我们可以将它写入日志,只允许指定人员查看。 二者对4种标量类型和2种复合类型都支持,对于特殊类型,print_r()支持资源,而var_export()支持NULL

三、变量

1、命名规范

  1. 变量以 $符号 标记
  2. 变量标识符 只能是下划线、字母开头 ,不能以数字或特殊符号开头
  3. 变量标识符中 不能有空格、点、连接线等特殊的字符
  4. 变量由多个单词组成时,采用 小驼峰命名法 ,即第一个单词全部小写,后面的单词首字母大写
  5. 变量标识符是 大小写敏感的 (函数名大小写不敏感)

2、变量类型

变量类型分成三大类: 标量类型4个、复合类型2个和特殊类型2个

  • 标量类型: 整型int、浮点型float、字符串string和布尔型boolean
  • 复合类型: 数组array和对象object
  • 特殊类型: null和资源resource

标量类型: 比较简单,就不详细说了

  1. <?php
  2. $i=12;
  3. $float=10.12;
  4. $str='Hello';
  5. $gender=true;

数组: 可以存放多个任意类型的数据,形式是key=>value,关键字是array。

  • 索引数组: 下标是int
  • 关联数组: 下标是string
  1. // 索引数组
  2. $arr=[1,2,3,4,5,6];
  3. // 关联数组
  4. $arr2=['name'=>'woxiaoyao','age'=>28,'salary'=>5249.01];

对象: 属性和方法的无序集合,关键字class。PHP内置了类原型stdClass,它是空类

  • 类定义使用关键字class,形式是class 类名{}
  • 类中方法访问属性则是 $this->属性名
  • 类实例化对象要使用 new方法
  • 类对象访问公共属性和方法是通过 单箭头-> 来访问
  1. // PHP内置类原型,是空类
  2. $obj = new stdClass;
  3. class Person{
  4. public $name='woxiaoyao';
  5. public $age;
  6. public function getName(){
  7. // 类中使用内部成员时,要使用$this
  8. return $this->name;
  9. }
  10. }
  11. $obj2=new Person;

null 它和JS中一样,即是类型,又是值 。不表示空格,也不表示0,也不表示空字符串,仅仅表示一个变量值为空。

  • 将变量直接赋值null$num = null;
  • 声明一个变量但未赋值var_dump($password);直接打印未赋值的变量则为空
  • 被unset()函数销毁的变量$a = 55;unset($a);var_dump($a);

资源类型resource: 保存了到外部资源的一个引用。如使用文件系统函数创建资源,创建 成功返回资源引用赋给一个变量 ,失败返回false 。如$fo=fopen('log.txt','w');

3、变量赋值

变量赋值有两种形式:

  1. 传值赋值: 将源变量的 值复制到新变量的数据存储空间,修改两个变量的值 互不影响。
  2. 引用赋值: 使用 &符号 ,将新变量和源变量指向 同一个数据存储空间,互相影响,任何一个变量改变将会改变另一个变量。一般不建议这样使用,这个类似C++中指针。
  1. $i=12
  2. // 传值赋值
  3. $in=$i;
  4. $in=5;
  5. // 下面输出12,5 两者因传值赋值,互不影响
  6. // echo $i.'<br>',$in;
  7. // 引用赋值
  8. $in2=&$i;
  9. $in2=10;
  10. // 下面输出10,10 两者因引用赋值,互相影响
  11. echo $i.'<br>',$in2;

4、变量的检测

  1. isset() 用来检测变量是否被定义 ,若变量存在并且值不为null才返回true,否则是false。
  2. empty() 变量是否为空 ""、0、"0″、NULL、FALSE、array()、$var、未定义以及没有任何属性的对象都将被认为是空的,返回true,否则返回false。
  3. defined() 常量是否已经定义
  4. is_类型() 检查是否对应类型is_bool()、is_int()、is_float()、is_double()、is_real()、is_string()、is_array()、is_object()、is_null():

5、变量类型转换

自动类型转换: 自动转换 只发生在标量类型之间

  • null参与混合运算时,转换成0
  • 布尔值参与数值运算时,true为1,false为0
  • 布尔运算时,整数0、浮点0.0、空字符串、字符串0、空数组将为false。
  • 下面是标量类型之间的转换示意图。

type-auto

强制类型转换: 有三种方式:

  1. 用后面的 三个函数 可以完成类型转换,intval()、floatval()、strval()
  2. 变量前加上()里面写上类型 ,将它转换后赋值给其他变量
  3. settype(变量,类型) 直接改变量本身
  1. // 类型强制转换
  2. // 第一种:使用三个函数intval()、floatval()、strval()
  3. $float = 1.23;
  4. $result = intval($float);
  5. //看看结果是不是变了?
  6. var_dump($result);
  7. //鸭脖子为整型的5
  8. $yabozi = 5;
  9. $re = floatval($yabozi);
  10. var_dump($re);
  11. //定义整型的变量
  12. $yabozi = 23;
  13. $bian = strval($yabozi);
  14. //强制变成字符串试试
  15. var_dump($bian);
  16. // 第二种:变量前加上()里面写上类型,将它转换后赋值给其他变量
  17. $transfer = 12.8;
  18. //把浮点变为整型
  19. $jieguo = (int)$transfer;
  20. var_dump($jieguo);
  21. //把浮点变为布尔
  22. $jieguo = (bool) $transfer;
  23. var_dump($jieguo);
  24. //把布尔变整型
  25. $bool = true;
  26. $jieguo = (int)$bool;
  27. var_dump($jieguo);
  28. //把浮点变数组
  29. $fo = 250;
  30. $jieguo = (array)$fo;
  31. var_dump($jieguo);
  32. // 第三种:settype(变量,类型) 直接改变量本身
  33. //定义浮点变为整型
  34. $fo = 250.18;
  35. //settype第二个参数是int,你实验的时候要记得第二个参数要为字符串类型
  36. settype($fo,'int');
  37. //输出看看结果
  38. var_dump($fo);

6、全局变量和局部变量

变量作用域 :变量的生效范围 作用域是查找变量的工具

  1. 局部变量:内部变量 在函数内部声明的变量 作用域仅作用于函数内部
  2. 全局变量:外部变量,在函数外部声明的变量,作用域从定义处开始一直到程序文件的末尾,在函数内部无法直接使用全局变量,要 通过global关键字或$GLOBAL全局变量数组 来访问

这里要纠正下我的错误认识,认为PHP和JS都是解释型编程语言,所以全局变量也是如JS中一样是相对而言。结果却是PHP中全局变量就如C++中是真正的全局变量了。虽然PHP和JS二者在很多地方相近,但PHP是真正编程语言了。如访问对象是单箭头,而JS中是点或索引。

  1. $age=29;
  2. function getAge(){
  3. // 通过global关键字引用全局变量
  4. // global $age;
  5. // return $age;
  6. // 通过$GLOBALS全局变量数组访问
  7. return $GLOBALS['age'];
  8. }
  9. echo getAge();

四、常量

1、常量特征

php常量是用于数据计算固定的值,只能是 标量类型

序号 特征
1 常量前面没有美元符号$
2 常量创建时必须初始化
3 常量禁止更新和删除
4 常量不受作用域限制
5 推荐使用大写字母加下划线命名

2、常量相关的函数

序号 定义方式 描述
1 get_defined_constants() 查看系统所有常量
2 defined() 检测常量是否存在
3 define() 创建常量
4 const 关键字 创建常量
5 constant() 获取常量值
  1. // 获取系统定义的所有常量
  2. print_r(get_defined_constants(true));
  3. // 仅查看用户自定义的常量
  4. print_r(get_defined_constants(true)['user']);

3、创建常量

序号 定义方式 区别
1 define() 除了不能创建类常量, 可以在程序的任何地方定义
2 const 关键字 必须全局定义,不能用在函数和流程控制中,允许创建类常量
  • 常量值: int, float, string, boolean,null, array(php7+)
  • define($name, true): 允许忽略常量名大小写
  • const在编译阶段处理, define()在运行阶段处理,所以const必须定义在 全局才有效
  • class类声明在编译时处理,且并不会创建作用域,当然也是全局中, 所以const可以用

上面是老师总结的,我再加上几点:

  • define()来定义常量在PHP4加入的,而const则是PHP5.3.0之后加入,不过现在都基本是PHP7了,版本不是二者的差异了。
  • 对值的表达式支持的差异: 关键字const定义常量是在编译时定义的,因此const关键字定义的常量值的表达式中不支持算术运算符、位运算符、比较运算符等多种运算符,而这些运算符在define()函数定义常量时都是可以直接使用的。如define('DEFINE_VAR2', 1 + 1)

4、 获取常量

序号 函数/关键字 区别
1 echo 通常使用已知的常量名
2 constant() 常量名不确定或在变量中

二者区别就是在将常量赋值给某变量时,再打印该变量,echo针对将常量名当成值打印,而constant()会获取到时常量名所代表的常量值。

  1. // 常量名在变量中
  2. $constName = 'EMAIL';
  3. // 只能输出常量名,不能获取到常量值
  4. echo $constName, '<br>';
  5. // constant(): 可以将常量名从变量中解析来正确读到
  6. echo constant($constName), '<br>';

5、 预定义常量

预定义常量非常多,有许多与具体扩展相关,如 PDO, 这里仅列出系统级常用的:

序号 预定义常量 描述
1 PHP_VERSION PHP 版本
2 PHP_MAXPATHLEN PHP 路径最大长度:1024
3 PHP_OS_FAMILY 操作系统:Windows/Darwin/Linux
4 PHP_SAPI web 服务器与 php 之间接口: apache2handler
5 PHP_EOL 行尾结束符
6 PHP_INT_MAX 最大整数: 9223372036854775807
7 PHP_INT_MIN 最小整数: -9223372036854775808
8 PHP_INT_SIZE 整数宽度: 8
9 PHP_FLOAT_MAX 最大浮点数:1.7976931348623E+308
10 PHP_FLOAT_MIN 整小浮点数: 2.2250738585072E-308
11 DEFAULT_INCLUDE_PATH 默认 PHP 命令路径
12 PHP_EXTENSION_DIR 默认 PHP 扩展路径
13 E_ERROR 运行时错误: 致命中断
14 E_PARSE 语法解析错误: 致命中断
15 E_NOTICE 运行时提示: 不中断
16 E_WARNING 运行时警告: 不中断
17 E_ALL 所有级别错误(除E_STRICT)
18 E_STRICT 更加严格的错误处理机制,高于E_ALL
19 TRUE 布尔真
20 FALSE 布尔假
21 NULL
22 DIRECTORY_SEPARATOR 目录分隔符
  1. # 预定义常量
  2. echo '版本号: ' . PHP_VERSION . '<br>';
  3. echo '操作系统: ' . PHP_OS_FAMILY . '<br>';
  4. echo '最大整数: ' . PHP_INT_MAX . '<br>';
  5. echo '最大浮点数: ' . PHP_FLOAT_MAX . '<br>';
  6. echo '目录分隔符: ' . DIRECTORY_SEPARATOR . '<hr>';

6、 魔术常量

  • 魔术常量也属于”预定义常量”, 比较特殊所有单独列出
  • 所谓”魔术”, 是指常量的值, 会随它们在代码中的位置改变而改变
  • 魔术常量不区分大小写, 但是推荐全部大写
  • 魔术常量是 2个下划线开始,最后又以2个下划线结束
  • 魔术常量 常见用途 :如LINE常用于日志中显示错误所在位置,DIR获取文档目录用来定义常量等。
序号 魔术常量 描述
1 __LINE__ 文件中的当前行号
2 __FILE__ 文件的完整路径和文件名
3 __DIR__ 文件所在目录
4 __FUNCTION__ 当前的函数名称
5 __CLASS__ 当前类名称
6 __TRAIT__ 当前Trait名称
7 __METHOD__ 当前类方法名称
8 __NAMESPACE__ 当前命名空间名称
  1. // 魔术常量
  2. echo '当前行号: ' . __LINE__ . '<br>';
  3. echo '当前文件: ' . __FILE__ . '<br>';
  4. echo '当前目录: ' . __DIR__ . '<br>';

7. 常量命名空间

  • 当使用的第三方组件(类库)中存在也当前脚本命名冲突的常量名时,可以用命名空间解决
  • 命名空间允许将同名的标识符,定义在不同的空间中,类似同名文件可存放在不同目录下
  • 命名空间使用关键字namespace声明, 必须放在脚本的首行,且 前面不允许有任何输出
  1. # 常量的命名空间
  2. // 报重复声明错误
  3. // const APP_PATH = __DIR__ . '/public/';
  4. // const APP_PATH = __DIR__ . '/home/';
  5. // 将同名常量定义在不同的空间中, 则不会报错
  6. namespace ns1 {
  7. const APP_PATH = __DIR__ . '/public/';
  8. }
  9. namespace ns2 {
  10. const APP_PATH = __DIR__ . '/home/';
  11. }
  12. // 全局空间,不需要空间名,也称匿名空间。
  13. namespace {
  14. // 访问命名空间中的常量, 必须带上空间名称
  15. echo \ns1\APP_PATH . '<br>';
  16. echo \ns2\APP_PATH . '<br>';
  17. }

五、过滤器

1、什么是 PHP 过滤器?

PHP 过滤器用于 验证和过滤来自非安全来源的数据 。验证和过滤用户输入或自定义数据是任何Web应用程序的重要组成部分。设计PHP的过滤器扩展的目的是使数据过滤更轻松快捷。

查看PHP有哪些filter可用,可通过filter_list()和filter_id()两个内置函数。如:

  1. <?php
  2. $filters = filter_list();
  3. foreach($filters as $filter_name) {
  4. echo $filter_name .": ".filter_id($filter_name) ."<br>";
  5. }

filter

对过滤类型的选择可以是过滤类型名,也可是过滤类型id。

过滤器类别: 有两种Validating 和 Sanitizing

  • Validating验证过滤器
    • 用于验证用户输入
    • 严格的格式规则(比如 URL 或 E-Mail 验证)
    • 如果成功则返回预期的类型,如果失败则返回 FALSE
  • Sanitizing去除过滤器
    • 用于允许或禁止字符串中指定的字符
    • 无数据格式规则
    • 始终返回字符串

2、为什么使用过滤器?

几乎所有 web 应用程序都依赖外部的输入。这些数据通常来自用户或其他应用程序(比如 web 服务)。通过使用过滤器,您能够确保应有程序获得正确的输入类型。您应该始终对外部数据进行过滤!输入过滤是最重要的应用程序安全课题之一。
什么是外部数据?
•来自表单的输入数据
•Cookies
•服务器变量
•数据库查询结果

3、过滤变量filter_var()和filter_var_array()

  • filter_var(var,filter,options);返回值: 返回过滤后的值,否则返回false
  • filter_var_array(array $data, filter);获取多个变量并过滤它们,返回值: 返回过滤后的值,否则返回false。
  1. var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
  2. var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED));
  3. $age = '15';
  4. $min = 18;
  5. $max = 35;
  6. // 使用过滤参数
  7. $options = array("options" => array("min_range" => $min, "max_range" => $max));
  8. var_dump(filter_var($age, 257, $options));
  9. $arr=[123.12,45.21,'woxiaoyao'];
  10. var_dump(filter_var_array($arr,FILTER_VALIDATE_FLOAT));

4、过滤输入filter_input()和filter_input_array()

过滤通过http的get/post请求发送过来数据,过滤表单数据,

  • filter_input(输入类型get/post,变量名,filter)
  • filter_input_array(输入类型get/post,args规定了过滤器参数数组,键是变量名,值就是过滤器)

    1)$type接受的参数是固定的,是INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, 或者INPUT_ENV中的一个
    2)filter_input中,$variable_name是要使用过滤器的变量名,$filter就是我们上面filter_list过的可用filter之一,$filter可以是一个array。也就是,我们对$variable_name进行过滤时,可以用多个filter
    3)filter_input_arrary中,第二个参数是$args是一个array,是$variable-$filter-$options构成的一个组合。看起来就像是,我们对多个filter_input进行了一次性定义,然后一次性的执行。

  1. // 单个值过滤
  2. $options = ["options"=>["min_range"=>1]];
  3. var_dump(filter_input(INPUT_GET,'id',FILTER_VALIDATE_INT,$options));
  4. echo '<hr>';
  5. // 多个值过滤
  6. $args = [
  7. "username" => FILTER_SANITIZE_STRING,
  8. "age" =>FILTER_VALIDATE_INT,
  9. "blog_url" =>FILTER_VALIDATE_URL,
  10. "ip"=>FILTER_VALIDATE_IP
  11. ];
  12. var_dump(filter_input_array(INPUT_GET,$args));

5、过滤回调FilterCallback

通过使用 FILTER_CALLBACK 过滤器,可以调用自定义的函数,把它作为一个过滤器来使用。这样,我们就拥有了数据过滤的完全控制权。您可以创建自己的自定义函数,也可以使用已有的PHP函数。规定您准备用到过滤器函数的方法,与规定选项的方法相同。

  1. // 自定义的函数把所有 "_" 转换为空格
  2. function convertSpace($string)
  3. {
  4. return str_replace("_", " ", $string);
  5. }
  6. $string = "Peter_is_a_great_guy!";
  7. echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace"));

六、学习后的总结

  • 熟悉echo、var_dump()、print_r()和var_export()的打印数据类型范围及应用场景
  • 熟悉变量命名、类型、检测、赋值、转换、局部变量和全局变量
  • 熟悉常量的命名规范、了解常见的预定义常量和魔术常量、命名空间由来和使用
  • 掌握过滤函数,提高数据的合法性,增强可预知性。这里要重点提下,老师在上课中反复提到的: 编程要增强可预测性,这样程序才健壮,出错率就会降低
Correcting teacher:灭绝师太灭绝师太

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
2 comments
吾逍遥 2020-11-20 17:35:19
总结才能不断进步,不过,其中var_dump也支持多个变量,我没测试,网文还是要验证啊
2 floor
灭绝师太 2020-11-20 14:45:30
你的总结每次都很到位~相信你会学好php的,思维比较敏锐,领悟能力强!
1 floor
Author's latest blog post
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!