PHP 入门细说 1
变量数据类型的自动转换
- 自动类型转换
自动类型转换是指,计算机或编程语言解释器,在计算两个或两个以上不同类型的变量时,会自动将两个变量转换为可计算的变量,来达到计算的结果。
PS:自动类型转换,不会改变原变量的变量类型。
常见类型可分为:
① 字符串和整形
② 字符串和浮点型
③null 参与混合运算时的结果
④ 布尔型true
、false
参与混合运算时的结果
// 变量类型的自动转换:
$page = "1000pages";
@$page += 50;
var_dump($page);
echo "<br>";
@$page += 22.66;
var_dump($page);
echo "<br>";
@$num = $page + null; //null = 0
var_dump($num);
echo "<br>";
@$num = $page + true;//true = 1
var_dump($num);
echo "<br>";
@$num = $page + false;
var_dump($num);
echo "<br>"; //false = 0
2. 强制类型转换
强制类型通常是程序员对数据强制进行转换的结果。
语法:$变量 = (想要转换的变量类型)$想要转换的变量
$price = 100;
$goods = (string)$price;
var_dump($goods);
//输出结果为: string(3) "100"
变量的作用域
变量的作用域:其实就是变量的生效范围,作用域就是查找变量的工具。这点类似于常量的空间。但是有有所不同。
变量的作用域通常可以分为: ① 全局变量 【外部变量】 ② 局部变量 【内部变量】
- 局部变量:
// 1.生成一个变量
function name()
{
$username = "GGGG";
$email = "12346789@qq.com";
echo "用户名是:$username,他的邮箱是:$email";
}
// 调用一下变量以输出内部内容
name();
// 在函数外部调用函数内部变量:
echo $username; // 非法访问,在函数外部不能访问到局部变量: Undefined variable: username
有没有什么方法能在函数外部调用函数内部的变量呢? ====> 将函数赋值给一个变量来输出,同时函数内部使用
return
来返回内部函数的执行结果。
- 全局变量
是直接定义在函数外部的变量,可供全局调用。但不能在函数内部调用。
$username = "gggg";
$email = "4546548964563@163.com";
$phone = "12315456464";
$price = 1325456;
$goods = "Iphone 12 pro";
// 是定义在函数外部的变量
function name();
{.......};
如果想在函数内部引用全局变量,就需要使用到一个函数:GLOABALS
GLOBALS
语法:$GLOBALS['新变量'] = $GLOBALS['全局变量']
这里是将全局变量赋值给一个新变量,最后通过引用函数,再输出这个新函数即可完成通过函数输出全局变量。
function user()
{
$GLOBALS['username'] = $GLOBALS['username'].$GLOBALS['email'];
}
user();
echo $username;
常量知识细说
PHP 常量:用于数据计算固定的值。
常量只能是:标量类型【整形、字符串、浮点型、布尔型】
常量 PS:
① 常量必须初始化(初始化:第一次赋值)
② 类常量只能使用const
定义
③ 常量名推荐使用全部大写
④ 多个单词之间使用_
连接
⑤ 常量不受作用域的限制
⑥ 常量不能重新被定义【重复声明定义】或取消定义【unset 弹出等】等
⑦ 常量定义推荐使用const
来定义
const
和define
定义常量的区别:
const
定义常量和define
定义一个常量的区别:const
是一个语言结构,而define
是一个函数,可以通过第三个参数来设置是否大小写敏感的问题。define()
语法:define('常量名', 常量值, true);
true 表示大小写不敏感,默认为 false
它们的区别:
①const 是一个语言结构;而 define 是一个函数
②const 简单易读,编译时要比 define 快很多。
③const 可在类中使用,用于类成员常量定义,定义后不可修改;define 不能在类中使用,可用于全局变量
④const 是在编译时定义,因此必须处于最顶端的作用区域,不能在函数,循环及 if 条件中使用;而 define 是函数,也就是能调用函数的地方都可以使用
⑤const 只能用普通的常量名,define 常量名中可以有表达式
⑥const 定义的常量只能是静态常量,define 可以是任意表达式
// 定义一个常量:
// 常量必须初始化:
const APP_PATH = '/homework/demo3.php';
// 定义一个常量的另外一种方式:使用define函数来定义
// define(`常量名`,`常量值`)
define('PATH','/demo3.php');
// 常量的访问:
echo APP_PATH;
echo '<br>';
// 通过赋值一个常量给一个变量,然后访问变量也可以
$name = APP_PATH;
echo $name;
echo '<br>';
// 在类常量之中,常量只能通过const来定义。
class User
{
const USER_EMAIL = "1245456@163.com";
}
echo '<br>';
// 常量不能被重复定义,或被取消定义
// 重复定义:
// const APP_PATH = "/WWW"; //Constant APP_PATH already defined
// unset(APP_PATH); //syntax error, unexpected ')'
// 常量不受作用域的限制:也就是说常量可以在任何地方使用或被调用
function name()
{
return APP_PATH;
}
echo name();
预定义常量
echo 'PHP版本号:'.PHP_VERSION.'<br>';
echo '您的操作系统是:'.PHP_OS_FAMILY.'<br>';
echo '环境变量的目录列表的分隔符:'.PATH_SEPARATOR.'<br>';
echo '目录分割符:'.DIRECTORY_SEPARATOR.'<br>';
echo '最大整数:'.PHP_INT_MAX.'<br>';
echo '最大浮点数:'.PHP_FLOAT_MAX.'<br>';
and so on…….
PS:根据位置的变化而变化
几个常见的魔术常量:
常量名 | 描述 |
---|---|
__LINE__ |
文件中的当前行号 |
__FILE__ |
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名. |
__DIR__ |
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__) 。除非是根目录,否则目录中名不包括末尾的斜杠。 |
__FUNCTION__ |
当前函数的名称。匿名函数则为 {closure} 。 |
__CLASS__ |
当前类的名称。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 CLASS 对 trait 也起作用。当用在 trait 方法中时,CLASS 是调用 trait 方法的类的名字。 |
__TRAIT__ |
Trait 的名字。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。 |
__METHOD__ |
类的方法名。 |
__NAMESPACE__ |
当前命名空间的名称。 |
ClassName::class |
完整的类名,参见 ::class。 |
// 魔术常量
echo '当前代码所在的行数为:'.__LINE__.'<br>';
echo '当前文件的完整路径和文件名:'.__FILE__.'<br>';
echo '文件所在的目录:'.__DIR__.'<br>';
function demo()
{
echo '当前函数名为:'.__FUNCTION__;
}
demo();
echo '<br>';
常量的命名空间
命名空间的作用是什么:是为了解决常量名复用的问题,常量是全局成员,最大的问题是命名冲突,引入命名空间 针对的是全局成员,在不同的命名空间内,可以重复命名一个常量。
如何创建一个命名空间?
使用namespace 空间名
来创建
PS:
① 全局空间内的成员不允许重复定义
② 命名空间外不允许编写程序代码
那些可以使用命名空间,或被存放在命名空间内:
① 常量
② 函数
③ 类[借口]
// 创建一个命名空间
namespace name{
const APP_PATH = "/WWW";
}
// 创建第二个命名空间
namespace user{
const APP_PATH = "/blog/index.php";
// 输出name命名空间内的APP_PATH
echo \name\APP_PATH;
echo'<br>';
}
// 命名空间外,不能编写代码
// echo'<br>'; // No code may exist outside of namespace {}
// 创建一个全局空间:
namespace {
// 全局空间内的成员不允许重复定义。
// const APP_PATH;
// const APP_PATH; //重复定义一个常量成员,会报错 syntax error, unexpected
// 打印上述两个命名空间内的成员
echo \name\APP_PATH;
echo'<br>';
echo \USER\APP_PATH;
echo'<br>';
}
变量的过滤器
过滤器函数:
filter_var()
、filter_var_array()
filter_var()
:filter_var(var,filter,options[可选])
返回值: 返回过滤后的值,否则返回 false
filter_var_array()
:获取多个变量并过滤它们filter_var_array(array $data, filter)
返回值: 返回过滤后的值,否则返回 false过滤的同时会将字符转换成为我们制定的的过滤方法的类型
// 将过滤方法遍历出来:
foreach (filter_list() as $filter)
{
echo $filter . "=>" . filter_id($filter).'<br>';
}
过滤外部变量:通过 http get/post 请求发送过来数据,过滤表单数据
同时验证多个外部变量filter_input_array(输入类型get/post,args规定了过滤器参数数组,键是变量名,值就是过滤器)
>filter_input()
使用 get 参数来演示外部变量的获取与过滤filter_input
(输入类型 get/post,变量名,filter)
<?php
// 将年龄15-30岁的过滤出来,不符合的淘汰
$age = '25';
$min = 15;
$max = 30;
// 设置可选方法options
$options = array("options"=>array("min_range"=>$min,"max_range"=>$max));
$age = filter_var($age,257,$options); //257 对应的过滤方法是int,可在filter中查看
var_dump($age);//输出结果 int(25);
// 过滤的同时会将字符转换成为我们制定的的过滤方法的类型
$email = '42454654@qq.com';
VAR_DUMP(filter_var($email,FILTER_VALIDATE_EMAIL));
echo"<hr>";
if(!$age) //取反
{
echo 'your age is not up to our requirements';
}else{
echo '年龄符合要求';
}
ECHO '<hr>';
// filter_var_array(array $data, filter)获取多个变量并过滤它们,返回值: 返回过滤后的值,否则返回false
ECHO '<hr>';
$a = 10;
$b = '90';
$arr = [$a,$b];
VAR_DUMP(filter_var_array($arr,FILTER_VALIDATE_INT));
/**
* 过滤外部变量:通过http get/post请求发送过来数据,过滤表单数据
*同时验证多个外部变量 filter_input_array(输入类型get/post,args规定了过滤器参数数组,键是变量名,值就是过滤器)
* filter_input()
*使用get参数来演示外部变量的获取与过滤
*/
// echo 'id = ' . $_GET['id'];
$args = [
"username" => FILTER_SANITIZE_STRING,
"age" =>FILTER_VALIDATE_INT,
"blog_url" =>FILTER_VALIDATE_URL,
"ip"=>FILTER_VALIDATE_IP
];
echo '<hr>';
// var_dump(filter_input_array(INPUT_GET,$args));
// filter_input(输入类型get/post,变量名,filter)
$options = ["options"=>["min_range"=>1]];
var_dump(filter_input(INPUT_GET,'id',FILTER_VALIDATE_INT,$options));//bool(false)