PHP之基础知识

1. PHP 基础知识

1.1PHP标签

定义:PHP标记是一种不对称的双标记,而且可以根据实际所处的位置变成必要的不完整标记。PHP解释器会将从标记开始,将标记内的所有内容当做PHP的代码来解析。

# PHP各种标记方式
# 1. PHP标准规则
<?php
    // 代码块
?>
# 2. PHP 不完整规则, 通常是独立的PHP文件(全部是PHP代码)
<?php
    // 代码
// 无结束
# 3. 短标记:short_tag
<?
 // 代码块
 // 目前默认不支持,如果要支持需要开启配置php.ini:short_open_tag = On
?>
# 4. ASP标记:asp_tag
<%
//ASP标记:以前ASP语言的方式
//PHP7已经明确不支持
%>
# 5. 脚本标记
<script language="php">
//脚本标记:与JavaScript一样
</script>

1.2 PHP 注释

定义:注释,为了方便程序的迭代开发和管理,使用特定的符号将描述的自然语言进行标记,方便开发人员理解代码并不会给程序本身增加额外效率损失。

  1. 单行注释: 使用的注释符号只会让符号后面的内容被PHP解释器忽略,有#//两种
<?php
# 这是注释
// 这个也是 效果跟# 一样
这里不受影响, 
?>
  1. 注释多行(块注释),从起始符号开始,直到结束符号前都是注释,起始符号为“/*”,结束符号为“*/”
<?php
/*从这里开始注释
依然在注释内容
到此才结束*/
?>

1.3 PHP语句结束符

定义:PHP的代码在写完之后,通常会有一个语句结束符,该符号使用英文输入法状态下的分号:“;”

<?php
    echo "Hello world!";     // 此处 ; 为结束符
?>

2. PHP基础语法

1.1 PHP变量

定义:PHP变量,是一种在PHP脚本运行周期内(从一个脚本的第一行代码执行到最后一行执行完成),系统通过指定的标识符,以“$”符号开始,指向保存在内存中的数据,从而在代码运行过程中,可以通过标识符来获得对数据的使用的一种代码形态。

  1. PHP变量命名规则:
  • 必须以$符号开始
  • 由字母、数字和下划线组成
  • 变量严格区分大小写
  • 其中数字不能在开头(不能直接跟$符号后)
  • 变量命名应尽量与事实需求响应(识别度高),如名字对应$name,年龄对应$age等等
  • 比较复杂的复合命名变量可以使用下划线法(用下划线连接单词,推荐)或者驼峰法(单词首字母大写):下划线法 $family_name;驼峰法 $FamilyName
<?php
//变量规则
$abc = 1;    //有效变量名
$a_3 = 1;    //有效变量名
$3_a = 1;    //无效变量名
?>
  1. PHP变量使用:PHP是一种弱类型语言,即变量的定义可以直接使用,且不用管实际赋值给变量的数据是什么样子
<?php
//定义变量
$abc = 1;    //定义且赋值,表示$abc以后就代表1这个数值
$abc = 'abc';//PHP重新定义,表示$abc以后代表'abc'不再代表1(修改变量)
//访问
echo $abc;   //访问PHP变量,表示输出$abc代表的数据'abc',最终输出abc字符串
//查看变量详情
var_dump($abc); //包括变量名字长度,所保存的数据类型等
//删除
unset($abc); //删除$abc变量,表示将$abc这个符号清理掉,后续就不再刻意访问该变量
echo $abc;   //错误:系统提示没有一个叫做$abc的变量
?>
  1. 变量的生命周期:变量的存在是为了保证程序在运行过程中能够有效的访问数据,所以PHP变量的生命周期是两种:1是人为的删除变量(上例中unset删除变量);2是脚本执行结束(最后一行代码执行完毕)
  2. 预定义变量:系统中为了方便程序员开发,将很多需要用户很麻烦操作的变量制作成了系统变量,用户可以直接调用就能获取相应的数据结果。预定义变量通常都是数组数据
  • $_GET:用户通过get方式提交的数据
  • $_POST:用户通过post方式提交的数据
  • $_REQUEST:用户通过get和post提交的数据
  • $_SERVER:用户和服务器的基本信息数据
  • $_FILES:用户提交的文件数据
  • $_SESSION:session数据
  • $_COOKIE:cookie数据
  • $GLOBALS:所有全局变量,也是唯一一个不是以下划线开始的预定义变量
  • $_ENV:环境数据
  1. 变量传值: 指的是将变量赋值给另外一个变量,在PHP中通常有两种方式来实现变量传值
  • 值传递:将变量的值赋值给另外一个变量,两个变量拥有同样的值,但是两个变量互不影响
  • 引用传递:将变量所指向的数据的内存地址赋值给另外一个变量,两个变量指向同一个值,任何一个的修改都会影响到另外一个变量
<?php
$a = 100;
$b = $a;        //将$a保存的值100赋值给$b
$c = &$a;       //将$a指向的100的地址赋值给$c
echo $a,$b,$c;  //100,100,100
$b = 'b';       //改变$b的结果,但是$a不受影响,依然是100
echo $a,$b,$c;  //100,b,100
$c = 'c';       //改变$c的结果,但是$a与$c公用一个数值空间,所以$a也会变成'c'
echo $a,$b,$c;  //c,b,c
?>
  1. 变量内存分析:计算机中内存大致分为栈、堆、数据段和代码段
  • :效率高,但是少,主要存放变量名字和变量索引(指向数据的内存地址)
  • :效率低,但是大,而且成块(内存连续),主要存放大数据(对象、数组、资源)
  • 数据段:效率比堆高,比栈低,主要存储普通数据
  • 代码段:将要运行的代码加载到内存中,然后开始执行代码
  • 变量的内存机制:变量在定义的过程中,在栈区有一块索引表(PHP自动申请),然后将变量名字存储到表中,然后变量的值(数据)存储在数据段中,并将数据的地址存到索引表中对应变量名的后面。也就是说,变量并不是保存数据,而是保存数据所在的内存地址。访问变量的时候,就是通过变量名找到数据地址,然后取出数据。

php_ncyl

2.2 PHP常量

定义:变量的好处在于可以随时根据数据的需求改变变量所代表的数据,而常量则是一开始定义并赋值后,在整个脚本执行周期中不允许改变的量,其他与变量基本一致

  1. PHP 常量命名规则
  • 常量名通常用大写字母表示
  • 常量名不需要使用“$”符号开始
  • 常量名由字母、数字和下划线组成,其中不能以数字开头
  • 复杂的常量名使用下划线法表示:FAMILY_NAME
  1. 常量定义:常量的定义通常使用define函数或者const关键字,而且必须在定义的时候就对其赋值
<?php
//有效常量名
define('PI',3.1415926);
define('SELF_PI',3);
const FAMILY_NAME = 'Taoy';

//错误常量名
define('3PI',3.14);
const 3_PI = 3;
?> 
  1. 常量使用:常量一旦定义不能改变,只能在后面使用其初始化时给的数据,常量直接通过常量名访问
<?php
//访问常量
echo PI;    //访问前面定义的常量
//所有的常量都可以使用constant函数
echo constant('PI');    //所有常量都可以采用这种方式访问
?>
  1. 系统常量:在系统中,有一些东西是程序员可能用到的,但是又不允许程序员改变,所以系统就定义了一些常量。
  • PHP_VERSION:PHP版本号
  • PHP_INT_SIZE:PHP中int数据所占用的内存字节数
  • PHP_INT_MAX:PHP中int数据所能表示的最大值

5.魔术常量:系统中有一些东西是在变化的,但是又是不允许随意变化,是有规律变化的。这个时候为了保证系统的健壮性,就尽量不让用户来进行控制。魔术常量就是其值会随着实际环境的变化而变化,而这种变化是程序员不能控制的。

  • 魔术常量使用双下划线开始,也使用双下划线结束
  • __DIR__:当前文件所在路径(绝对路径)
  • __FILE__:当前文件所在路径(绝对路径,包含文件名)
  • __FUNCTION__:函数内部使用,表示函数的名字
  • __CLASS__:类内部使用,表示类名
  • __NAMESPACE__:命名空间内部使用,表示当前所属命名空间
  • __METHOD__:类内部方法里使用,表示当前方法名字(所属类)
  • __LINE__:当前所在行数
<?php
echo __DIR__.'<br />';    //获取当前PHP脚本所在路径
echo __FILE__.'<br />';   //获取当前PHP脚本所在路径(包含文件名)
echo __LINE__.'<br />';   //获取当前行号
echo __LINE__.'<br />';   //获取当前行号,比上一行大1
?>

上面程序输出:

D:\phpStudy\PHPTutorial\WWW\phpreview
D:\phpStudy\PHPTutorial\WWW\phpreview\demo.php
4
5

3. PHP数据类型

3.1 数据分类

定义:在PHP中,将数据根据其特定的格式和应用归集成对应的类别,对每一种类别给定一种特定的名称。

  1. PHP中数据类型分为三大类八小类:

    • 基本数据类型(标量数据类型)

      • 整形(int/integer):存储整数数据
      • 浮点型(float):存储小数数据和超过整形范围的整数数据
      • 布尔型(bool/boolean):存储布尔类型数据,只有true和false两个值
      • 字符串型(string):存储字符串数据(最常见)
    • 复合数据类型

      • 数组型(array):存储数组数据(即多个数据存放到一个变量中)
      • 对象型(object):存放对象数据,由类实例化得到(面向对象)
    • 特殊数据类型

      • 资源型(resource):存储外部资源数据(数据库资源文件资源)
      • 空型(null):变量没有存储任何数据

PHP是一种弱类型的编程语言,因此PHP中的变量本身没有数据类型,可以指定存放任何数据,但是对于具体要存储的数据有数据类型之说,主要是为了保证内存的高效利用。

3.2 数值型数据类型

  1. 整型数据类型:在PHP中,整形采用8个字节存储数据,根据数据需求,PHP提供了多种进制的整数存储方式
<?php
//常见整型
$num1 = 123;
$num2 = -50;

//八进制存储:逢8进1,使用0前缀,最大数值不超过7
$num3 = 0123;
var_dump($num3);        //int(83):系统会自动按照十进制输出(用户通常不使用8进制)

//十六进制存储:逢16进1,使用0x前缀,从10开始使用a代替,依次到15使用f
$num4 = 0x123;
var_dump($num4);        //int(291):系统转换成10进制输出

//二进制存储:逢2进1,使用0b前缀(binary)
$num5 = 0b1101;
var_dump($num5);        //int(13)
?>
  1. 进制转换: 二进制bin,八进制oct,十进制dec,十六进制hex
<?php
// 1. 十进制转二进制 decbin()函数
echo "12->十进制转二进制为: ".decbin(12); //输出:1100
echo '<hr>';
// string decbin(int number)返回一字符串,包含有给定 number 参数的二进制表示。所能转换的最大数值为十进制的 

// 2. 十进制转八进制decoct()函数
echo "15->十进制转八进制: ".decoct(15); // 输出: 17
echo '<hr>';
//string decoct ( int number ) 返回一字符串,包含有给定 number 参数的八进制表示

// 3. 十进制转十六进制 dechex() 函数
echo "10->十进制转16进制: ".dechex(10);
echo '<hr>';
// string dechex ( int number ) 返回一字符串,包含有给定 number 参数的十六进制表示


// 1. 二进制转十六进制 bin2hex() 函数
echo "1100->二进制转十六进制为: ".bin2hex('1100');
echo '<hr>';

// 2. 二进制转十进制 bindec()函数
echo "1100->二进制转十六进制为: ".bindec('1100');
echo '<hr>';

// 3. 八进制转十进制 octdec()函数
echo "17->八进制转十进制: ".octdec('17');
echo '<hr>';

// 4. 十六进制转十进制 hexdec()
echo "aaa->十六进制转十进制: ".hexdec('aaa');
echo "<hr>";

// 终极武器.任意进制转换 base_convert(),在此举两个例子
echo "520->十进制转十六进制: ".base_convert('520', 10, 16); // 十进制转16进制
echo "<hr>";
echo "aaa->十六进制转十进制: ".base_convert('aaa', 16, 10);

?>

上述代码输出结果:

12->十进制转二进制为: 1100
15->十进制转八进制: 17
10->十进制转16进制: a
1100->二进制转十六进制为: 31313030
1100->二进制转十六进制为: 12
17->八进制转十进制: 15
aaa->十六进制转十进制: 2730
520->十进制转十六进制: 208
aaa->十六进制转十进制: 2730
  1. 小数型数据类型:在PHP中同样采用8个字节存储数据,浮点数也提供了多种小数存储方式
<?php
$f1 = 1.23;
$f2 = 1.23e3;            //1.23 * 10 ^ 3
var_dump($f1,$f2);       //float(1.23),float(1230)
?>
  1. 浮点数精度问题:浮点数与整形一样使用8个字节存储数据,但是能够表示的数值却会比整形大很多,原因在于浮点数64个字节并非全部用来存数值,而是有一部分存储指数(10的N次方中的N),还有一部分用来存储实际数值。造成的结果就会带来两个:一个是存储的数值比整形大很多;二个是存储的数值的精确度只能保证在13-14位之间,超过该部分就会四舍五入(丢失精度)
<?php
$num = PHP_INT_MAX;        //整形最大值
$f1 = $num + 1;            //超出整形范围
var_dump($f1);             //float(9.2233720368548E+18),14个有效数字
?>

3.3 布尔数据类型

  1. 布尔类型是一种简单的数据类型,专门用于对某些注重结果的数据存储,结果中只会有两个值:TrueFalse
<?php
$a = True;
$b = False;            //在PHP中不区分大小写
var_dump($a,$b);      //bool(true) bool(false)
?>

3.4 字符串数据类型

  1. 在PHP中,凡是用户输入的数据,和程序员使用了引号(单引号和多引号)定义的数据,系统都理解为字符串。PHP7中字符串的长度理论上无限制
<?php
$s1 = '123';              //虽然都是数字组成,但是有引号就是字符串
$s2 = "hello world";
var_dump($s1,$s2);        //string(3) "123" string(11) "hello world"
?>

2.单引号和双引号都可以定义字符串,但是彼此是有区别的:

  • 单引号中只能解析少量的转义符号:\',\
  • 双引号中能解析较多的转义符号:\$,\",,n,t
  • 双引号中能够解析嵌套在字符串中的PHP变量(注意变量要与其他字符串分离,人工使用{})
<?php
$s1 = 'abcdegf\'\n\t\"\$';
$s2 = "abcdegf\'\n\t\"\$";
var_dump($s1);    //string(16) "abcdegf'\n\t\"\$",不见的斜杠代表被转义了
var_dump($s2);    //string(13) "abcdegf\' "$",不见的斜杠代表被转义了

$a = '你好';
$b = '世界 $a !';
$c = "世界 $a !";
echo $b;          //世界 $a !,系统不能解析$a,当做普通字符串解析
echo $c;          //世界 你好 !,系统解析了$c中的$a变量

$d = "$abc";      //错误:系统提示没有定义变量$abc,系统区分不出来
$e = "{$a}bc"     //正确,系统理解$a是一个独立的变量
?>
  1. 在PHP中,考虑到有些特殊情况下,字符串会很长,而且有格式存在。所以PHP针对单引号和双引号还做了一层扩展:nowdoc结构(单引号)和heredoc结构(双引号)

    • nowdoc是类似单引号功能
    • heredoc是类似双引号功能
    • nowdoc和heredoc在内部的所有内容都是属于字符串本身(不能写注释)
    • nowdoc和heredoc开始符号后不能有任何内容
    • nowdoc和heredoc结束符号必须顶格,且后面除了语句结束符不能有任何内容
<?php
$wish = '世界和平';
//nowdoc
$n = <<<'END'
    我的愿望是:$wish
END;
echo $n;            //我的愿望是:$wish

//heredoc:注意,符号END并不是规定的,可以自己取,但是通常不建议改(怕关键字)
$h = <<<END
    我的愿望是:$wish
END;
echo $h;            //我的愿望是:世界和平
?>
  1. 字符串查看:日常字符串通常直接输出操作即可。PHP中字符串其实每个字符都有一个下标,可以通过下标(数组访问方式)来对字符串中的具体位置字符进行访问。PHP中的下标都是从0开始
<?php
$str = 'hello world';
echo $str[0];        //h:第一个字母
echo $str[-1];       //d:倒数第一个字母,负数从后面开始,-1代表倒数第一个
?>

3.5 PHP数组

定义:数组即数据的组合,是指将一系列相关或者相似的数据,组合到一起,使用一个变量代表。在数组中,可以有多个数据,每个数据称之为一个元素,元素与元素之间使用英文逗号“,”分隔。元素的组成有两部分:下标(key)和值(value)

  1. 定义数组:在PHP中可以通过多种方式来定义数组,通用的几种方式如下:

    • 使用array关键字来初始化数组
    • 使用数组括号[]来初始化数组
    • 使用变量跟[]来初始化数组,但是这个时候需要给定一个值,而且一次只能增加一个元素
<?php
//使用array关键字定义数组
$arr1 = array();                //可以不指定元素,也可以在括号中增加元素
$arr2 = array('name','age');

//使用[]定义数组
$arr3 = [];
$arr4 = ['name','age'];

//针对变量增加元素方式定义数组
$arr4[] = 'name';
?>
  1. PHP中数组的使用:PHP中数组的访问其实就是访问数组中的某个元素值,访问方式必须通过数组下标进行访问。默认的数组元素的下标是不可见的,根据元素的顺序从0开始
<?php
$arr = ['name','age'];     //实际上[0 => 'name',1 => 'age']

//访问name值
echo $arr[0];            
?>
  1. PHP中数组的特点
  • PHP数组中的元素没有数量限制,即数组不限定长度
  • PHP中数组可以动态增加元素
  • PHP中数组元素的值可以是任意数据类型
  • PHP中数组下标可以是纯数字(索引数组)、纯字符串(关联数组)和混合数字和字符串(混合数组)
<?php
//索引数组
$arr1 = array(1,2,3,4,5);
//关联数组
$arr2 = array('name' => '张三','age' => 30,'gender' => '男');
//混合数组
$arr3 = array(1,2,'name' => '张三','age' => 30);

//访问:一样,使用下标访问
echo $arr1[1];            //2
echo $arr2['name'];       //张三
?>
  1. 二维数组:普通数组基本都是一维数组,即数组里面的元素全部都是一维的(普通数据),但是有的时候,尤其是在大数据处理的情况下,通常都会存在数组元素本身也是数组的情况。我们把数组元素都是一维数组的数组称之为二维数组。另外,理论上来将,PHP中数组没有限定数组到底可以多少层嵌套(多维数组),但是建议数组的层级不要超过三维
<?php
$user1 = array('name' => '张三',age => 30);
$user2 = array('name' => '李四',age => 23);
$user3 = array('name' => '王五',age => 40);    //一维数组

//二维数组
$users = array($user1,$user2,$user3);

//二维数组访问:先通过一维下标找到对应的数组元素,然后用二维下标读取元素值
//获取张三的年龄
echo $users[0]['age'];    //$users[0]的结果是$user1,然后组合$user1['age'],从而最终获得张三的年龄
?>

3.6 类型判断

定义:类型判定是系统通过指定函数来确定数据的类别,给定判定结果,结果为布尔值,是对应类型返回true,不是返回false。

  1. 通过系统函数判定数据类型:函数的格式很好记,使用is_开头,后面跟对应的数据类型
<?php
/*
is_bool() 判断是否是布尔型
is_int() 判断是否是整型
Is_float() is_real() 判断是否是浮点型
is_string() 判断是否是字符串
is_array() 判断是否是数组
is_object() 判断是否是对象
is_resource() 判断是否是资源
is_null() 判断是否是null
is_scalar() 判断是否是标量
*/


$num = 100;
$str = '100';

//数值
$res = is_numeric($str);
var_dump($res);            //bool(true),is_numeric是用来判定数据是否是数值或者纯数值的字符串
var_dump(is_scalar($num)); //bool(true),is_scalar是用来判定数据是否是标量(基本数据类型)
var_dump(is_null($num));   //bool(false),is_null是用来判定数据是否为NULL
?>

3.7 类型转换

定义:PHP中需要将一些不同的类型转换成某个指定数据类型才能进行相关运算,这种转换操作叫做类型转换。PHP是一种弱类型语言,所以在PHP中有两种类型转换方式:自动转换和强制转换。

  1. 自动转换:就是PHP会自动根据数据要参与的运算场景来将不符合条件的数据类型的数据转换成目标类型数据
<?php
$num = 5;
$str = '1.2a35';

echo $num + $str;    //6.2,当前运算为算术运算,所以系统判定数据要求为数值,自动将字符串转换成数值参与运算

//字符串转换成数值规则
1.第一个字符是字母或者其他特殊符号,结果为0
2.第一个字符是数字,可以依次往后保留,直到不是数字为止
3.如果在数字往后推的情况下,碰到第二个小数点结束(保留一个小数点)
?>
  1. 强制转换: 转换方式是在数据变量前使用(目标数据类型)
<?php
$str = '1.2.3.4.3abc';

//强制转换成数值
echo (float)$str;        //1.2
?>

4. PHP运算符

参看链接:

本文链接:

https://www.betao.cn/archives/phpreview01.html
1 + 3 =
快来做第一个评论的人吧~