PHP 入门细说 1

变量数据类型的自动转换

  1. 自动类型转换

    自动类型转换是指,计算机或编程语言解释器,在计算两个或两个以上不同类型的变量时,会自动将两个变量转换为可计算的变量,来达到计算的结果。
    PS:自动类型转换,不会改变原变量的变量类型。
    常见类型可分为:
    ① 字符串和整形
    ② 字符串和浮点型
    ③null 参与混合运算时的结果
    ④ 布尔型truefalse参与混合运算时的结果

// 变量类型的自动转换:
$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 来定义

constdefine定义常量的区别:

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参数来演示外部变量的获取与过滤
$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)

最后修改:2020 年 11 月 19 日 05 : 19 PM
如果觉得我的文章对你有用,请随意赞赏