IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> PHP基础语法篇 -> 正文阅读

[PHP知识库]PHP基础语法篇

php

这里默认有HTML,JavaScript基础咯。

一、基础

1、客户端和服务端

客户端(用户端):享受服务的【前端,客户端运行代码】

服务端(远程):提供服务的【后端,服务端运行代码】

在这里插入图片描述

2、什么是php

PHP(全称:以前叫Personal Home Page,现在改名为Hypertext Preprocessor,即"PHP:超文本预处理器"),是一种通用开源脚本语言。

PHP是服务器端的语言,对于web开发(html),非常友好,能嵌入在html文档里面;可以跟html,css和JavaScript代码融合在一起,弥补它们做不了的事情。

在这里插入图片描述

3、XAMPP的安装

在这里插入图片描述
xampp官网:https://www.apachefriends.org/index.html

下载自己所需要的版本。安装即可。

开启xampp中的Apache后,在浏览器中打开localhost,即可看到htdocs(html文档)根目录下的index.php对应的页面。
在这里插入图片描述

4、PHP能干什么

几乎能干后端一切能干的事情

  • 独立网站
  • 网络爬虫
  • 开发后台管理系统
  • 机器学习等人工智能相关
  • 提供app、小程序、web等等数据服务
  • ……

php简单、好学、上手快。

5、一个好用的php集成工具——phpStudy

首先在官网(https://www.xp.cn/)下载对应的版本,然后解压,安装。

安装后,启动phpStudy中的服务器,在localhost中,即可以看到WWW根目录下的index.php对应的页面。
在这里插入图片描述

二、PHP基本语法

1、php标记

当解析一个文件时,PHP会寻找起始和结束标记,也就是<?php ?>, 这告诉PHP开始和停止解析二者之间的代码。此种解析方式使得PHP可以被嵌入到各种不同的文档中,而任何起始和结束标记之外的部分都会被PHP解析器忽略。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <!-- 嵌入到html文件中 -->
  <?php echo "hello,php"?>
</body>
</html>

注意,访问的文档如果不是默认的index.php,则需要在访问时,加入路径进行访问。

比如想访问的是basic.php,那么需要访问的URL是localhost/basic.php

如果文件内容是纯PHP代码,最好在文件末尾删除PHP结束标记。这可以避免在PHP结束标记之后,万一意外加入空格或者换行符,会导致PHP开始输出这些空白,而脚本中此时并无输出意图。

<?php
echo "hello,php";
// ... more code
echo "last statement";
// 脚本至此结束,并无PHP结束标记
2、指令分隔符

PHP需要在每个语句后用分号结束指令; ,一段PHP代码中的结束标记隐含表示了一个分号,在一个PHP代码段中的最后一行可以不用分号结束。

3、注释
  • 单行://
  • 多行:/**/
4、变量

PHP中变量用一个$ 后加变量名来表示。变量名区分大小写。(变量、常量、php配置文件php.ini区分大小写,其他不分)

$var = 'Bob';
$Var = 'Joe';

$4site = 'not yet';  //非法变量名,以数字开头了
$_4site = 'not yet';  //合法变量名,以下划线开头

$this = 'Nikon';  //非法赋值,$this是一个特殊的变量,不能被赋值
5、赋值
(1)传值赋值(默认)

使用“=”将赋值表达式的值赋给另一个变量(单独分配房间),互不干扰。

$name = "tom";
$myname = $name;  
(2)引用赋值

将赋值表达式内存空间的引用赋给另外一个变量,简单地将一个&符号加到将要赋值的变量前(共享一个房间),改变其中一个变量的值会影响另一个变量。

$foo = 'Bob';
$bar = &$foo;  //通过$bar引用给$foo
6、可变变量

变量的名字可以动态改变,用$$ 符号表示。

$a = 'hello';
$$a = 'world';  //等价于$hello = 'world'
7、常量

常量是一个简单值的标识符(名字),在脚本执行期间该值不能改变。默认大小写敏感,一般来讲常量标识符总是大写的,用define()函数关键词再定义。

常量只能包含标量数据(boolean, integer, float, string),注意没有$ 符号。

define('NAME', 'Tom');
echo NAME;

注意:

和使用define()定义常量不同的是,使用const关键字定义常量必须处于最顶端的作用域,因为此方法是在编译时定义的。这就意味着不能在函数中,循环内以及if语句中使用const来定义常量。

8、魔术常量(预定义常量)

在这里插入图片描述

9、变量作用域
(1)变量法则
  1. 超全局变量,任何地方都可以访问
  2. 常数,一般是全局性,函数内外都可以访问
  3. 全局变量(一般声明在函数外面),函数内不可以访问
  4. 函数内可以通过global关键词就可以访问全局变量(其实是同一个变量)
  5. 在函数中创建的静态变量,函数外无法访问,但是这个变量的值一直保留
  6. 在函数中创建的局部变量,函数外是无法访问的,并且在函数执行结束后失效
(2)内置超全局变量

在程序的任何地方都可以访问到,由php预先定义好的。

$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
<?php

$a = 100;
$b = 200;
function add() {
  $GLOBALS['c'] = $GLOBALS['a'] + $GLOBALS['b'];
}

add();
echo "<h1>$c</h1>";  //300
(3)全局变量

全局变量一般声明在函数外的变量,代码间可以访问,函数内不可以访问

<?php

$a = 100;   //全局变量
function output() {
  echo "<h1>$a</h1>";   
  //报错:Notice: Undefined variable: a in D:\xampp\htdocs\test.php on line 5
}

output();

可以在函数中使用global关键字,对全局变量进行访问。

<?php

$a = 100;
function output() {
  global $a;
  echo "<h1>$a</h1>";  //100
}

output();
(4)静态变量

静态函数只是在函数体内,在函数外无法访问。但是执行后,其值保留,等待下次函数执行。

function add() {
  static $c = 500;  //静态函数
  $c++;
  echo "<h1>$c</h1>";
}

add();  //501
add();  //502
(5)变量销毁

php一般有自动垃圾回收机制,但是也可以通过收到销毁,用函数unset()。

$a = 100;
$b = $$a;

unset($a);
echo $b;  //报错,无法访问

在这里插入图片描述

10、数据类型
(1)整型
$a = 1234;  //十进制数
$a = -123;
$a = 0123;  //八进制
$a = 0x1A;  //十六进制
$a = 0b11111111;  //二进制
(2)浮点型

NAN属于浮点数

(3)字符串型
  • 一般情况是单引号和双引号

    $c = 100;
    
    echo 'this is {$c}';  //this is {$c}
    echo "this is {$c}";  //this is 100
    

    双引号字符串中可以解析变量;

    如果变量使用大括号{}, 注意变量和左括号之间不可以有空格,否则会把大括号也打印出来。

  • heredoc语法结构

  • nowdoc语法结构(<<<)

(4)布尔型

不区分大小写

(5)NULL

表示一个变量没有值。以下三种情况,变量可能为NULL:

  • 被赋值为NULL
  • 尚未被赋值
  • 被unset()
(6)数组型

php中的数组实际上是一个有序映射,映射是一种把values关联到keys的类型。

array( key => value, …)
键key可以是一个整数integer或字符串string
值value可以是任意类型的数

$a = array(
  "a" => "abc",
  "b" => "ddd"
);

// 自php5.4开始
$b = [
  "a" => "abc",
  "b" => "ddd"
];

var_dump($a);  //该函数可以打印变量以及它的一些类型信息
var_dump($b);

key的强制转换:

  1. 字符串: 如果包含合法整型值,会被转换为整型。如"8" 实际被储存为8,但是"08" 则不会强制转换,因为其不是一个合法的十进制数值。
  2. 浮点数: 会被转换成整型,且转换时直接舍弃小数部分。如8.7 实际被存储为8。
  3. 布尔值: 会被转换成整型,true为1,false为0。
  4. Null: 会被转换为空字符串,即""
  5. NaN: 会被转换为空字符串。
  6. 数组和对象: 不能被用作key,会出现警告:Illegal offset type

重复的key会进行覆盖:

如果在数组定义中,多个单元都使用了同一个key,则最后一个出现的单元会将前面的覆盖。

$a = array(
  1 => "abc",
  "b" => "ddd",
  1.5 => "ccc"
);

var_dump($a);  //array(2) { [1]=> string(3) "ccc" ["b"]=> string(3) "ddd" }

key为可选项:

如果未指定key,php将自动使用之前用过的最大integer键名加上1作为新的键名。

$b = ["abc", "ddd", "aaa"];
$d = array(1, 2, 3, 4);

$e = [
  "a",
  "b",
  4 => "c",
  "d"
];
var_dump($e);  // array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [4]=> string(1) "c" [5]=> string(1) "d" }

注意这里的变量$e ,其中"d" 对应的键名为5,正是因为之前使用过的最大键名为4。

数组的访问:

$array[key] (大括号{} 的访问方法已经不再支持了)

$a = [1, 2, 3, 4];
echo $a[0];  //1

$b = [
  "a" => 1,
  "b" => 2,
  3
];
// echo $b{0};
echo $b[0];

数组元素的修改与新增:

数组单元可以通过array[key] 来进行修改或新增;如果想要删除某键值对,对其调用unset() 函数。

$arr = array(5 => 1, 12 => 2);

$arr[] = 15;  //相当于$arr[13] = 56
unset($arr[5]);  //删除该键值对

var_dump($arr);  //array(2) { [12]=> int(2) [13]=> int(15) }
(7)对象型

对象是复合型的数据类型,php中任何对象可以拥有特征(属性)和行为(方法)。

class Stu
{
    public $university = "PeKing";
    public $major;

    public function __construct($m)
    {
        $this->major = $m;
    }

    public function wugong()
    {
        echo "wugong";
    }
}

$zhang = new Stu("CS");
var_dump($zhang);
echo $zhang->major;  //CS

Resource资源类型:

比如打开一个文件,或者链接一个数据库等。

$fp = fopen("test.txt", "r");

var_dump($fp);  //resource(5) of type (stream)
fclose($fp);
11、类型转换
(1)(type) 强制转换
  • (int)、(integer) :转换为整型
  • (float)、(double)、(real) :浮点型
  • (string) :字符型
  • (bool)、(boolean) :布尔型
  • (array) :数组型
  • (object) :对象
$a = "12.2";

var_dump((float)$a);  //float(12.2)
(2)intval()、floatval()、strval()
$a = "12.2";

var_dump(floatval($a));  //float(12.2)
(3)setype()函数
$a = "12.2";

settype($a, "float");
var_dump(floatval($a));  //float(12.2)

注意,前两种转换方式都不会改变原数据的类型,即$a 还是string类型。但第三种方式会改变原数据类型,也就是直接将$a 的类型转变为float类型。

(4)Integer整型(类型转换)

如果给定的数超出integer范围,将会被解释为float类型。

echo PHP_INT_MAX;  //9223372036854775807

var_dump(PHP_INT_MAX + 1);  //float(9.2233720368548E+18)

将resource转换成integer时,结果会是PHP运行时,给resource分配的唯一资源号。

$fp = fopen("test.txt", "r");
var_dump($fp);  //resource(3) of type (stream)
var_dump((int)$fp);  //int(3)

NAN将转换为0。

echo (int)NAN;  //0

字符串转换为数值:

如果该字符串没有包含'.','e'或'E' 并且其数字值在整型的范围之内,该字符串将被当成integer来取值,其他所有情况下为PHP_INT_MAX。

该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。

$a = "1249857576676879778766767793";
var_dump((int)$a);  //int(9223372036854775807) 即PHP_INT_MAX

$b = "123aljfeioj";
var_dump((int)$b);  //int(123)

$c = "5.8";
var_dump((int)$c);  //int(5) 向下取整

$d = "jflj320jljk";
var_dump((int)$d);  //int(0)

$e = 1.5e+10;
var_dump((int)$e);  //int(15000000000)
(5)Boolean布尔类型(类型转换)

当转换为布尔值时,以下值被认为是FALSE:

  • 布尔值FALSE本身
  • 整型值0
  • 浮点型值0.0
  • 空字符串(字符串里有空格不算空字符串),以及字符串"0"
  • 不包含任何元素的数组
  • 特殊类型NULL(包括尚未赋值的变量)

其他所有的值都被认为是TRUE(包括任何资源 和 NAN)

$a = NAN;
var_dump((bool)$a);  //bool(true)

$b = "  ";
var_dump((bool)$b);  //bool(true)

$c = "";
var_dump((bool)$c);  //bool(false)
(6)String字符串(类型转换)

转换规则:

  • 布尔值TRUE转换成"1" ,FALSE转换成"" (空字符串)
  • 整型和浮点型转换为数字的字面样式的string
  • 数组array总是转换成字符串"Array"
  • NULL转换为空字符串
  • 资源resource转换为"Resource id #1" 这种结构的字符串
$a = NAN;
var_dump((string)$a);  //string(3) "NAN"

$b = true;
var_dump((string)$b);  //string(1) "1"

$fp = fopen("test.txt", "r");
var_dump((string)$fp);  //string(14) "Resource id #3"
fclose($fp);
(7)Array数组(类型转换)

对于任意integer,float,string,boolean和resource类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为0,该元素即为此标量的值。

$a = 12.33;
var_dump((array)$a);  //array(1) { [0]=> float(12.33) }

如果一个对象object类型转换为array,则结果为一个数组,其单元为该对象的属性,键名将为成员变量名。

class Age
{
    public $age1 = 100;
    private $age2 = 200;
    protected $age3 = 300;
}

$s = new Age();
var_dump((array)$s);  //array(3) { ["age1"]=> int(100) ["Ageage2"]=> int(200) ["*age3"]=> int(300) }

注意这里,对象内的属性类型不同,转换为数组时,键名也会有所不同。public、private以及protected有所区别。

(8)Object对象(类型转换)

array转换成object将键名成为属性并具有相对应的值。

$obj1 = (object) array(1 => "foo");
var_dump($obj1);  //object(stdClass)#2 (1) { ["1"]=> string(3) "foo" }
var_dump($obj1->{1});  //string(3) "foo"  当键名为数字时,一定要使用大括号包裹键名
var_dump(isset($obj1->{1}));  //bool(true)

注意,当键名为数字时,一定要使用大括号包裹键名。

对于其他值,会包含进成员变量名scalar。(scalar是标量的意思)

$obj = (object) "hao";
var_dump($obj);  //object(stdClass)#1 (1) { ["scalar"]=> string(3) "hao" }
var_dump($obj->scalar);  //string(3) "hao"
12、运算符
(1)赋值运算符=
(2)算术运算符

+ - * / % ++ -- **(指数)

intdiv()整除

(3)字符串运算符

连接运算符.

返回其左右参数连接后的字符串。

$a = "hello ";
$b = "php";

$c = $a.$b;
echo $c;  //hello php
(4)逻辑运算符

与&&(AND)、或||(OR)、非!、异或xor

优先级从高到低:&&、||、=、AND、OR

$a = true && false;
var_dump($a);  //bool(false)

$b = true and false;
var_dump($b);  //bool(true)

一般情况下,AND&& 等价,但是要注意它们的优先级是不同的,and的优先级比较低,低于赋值运算符,所以$b 通过赋值运算符,直接等于了true。

平时使用时,建议使用&&来替代AND ,否则优先级容易出问题。

短路运算:

$a = false && foo();
var_dump($a);  //bool(false)

$b = false and foo();
var_dump($b);  //bool(false)

$c = true || foo();
(5)比较运算符

===== 等于和全等运算符:和JavaScript相同。

<>!=不等。

!==不全等。

<=>太空船运算符(组合比较符):当$a小于、等于、大于$b时,分别返回一个小于、等于、大于0的integer值。php7开始提供

$a = 9 <=> 10;
var_dump($a);  //int(-1)

$b = 10 <=> 9;
var_dump($b);  //int(1)

$c = 9 <=> 9;
var_dump($c);  //int(0)

??NULL合并操作符:从左往右第一个存在且不为NULL的操作数。如果都没有定义,则返回NULL。php7开始提供

$a = $b ?? $c;
var_dump($a);  //NULL

$d = $b ?? 10;
var_dump($d);  //int(10)
(6)位运算

位运算符允许对整型数中指定的位进行求值和操作。

位运算符含义
&按位与
``
^异或
~
<< >>移位
var_dump(3 & 1);  //int(1)
// 0000 0011(3) & 0000 0001(1) = 0000 0001(1)

var_dump(3 | 1);  //int(3)

var_dump(3 ^ 1);  //int(2)

var_dump(~3);  //int(-4)
// ~0000 0011 = 1111 1100

var_dump(3 << 1);  //int(6)
// 0000 0011 << 1 = 0000 0110(6)

var_dump(3 >> 1);  //int(1)
(7)错误处理
$php_errormsg = "error";
$my_file = @file('non_existent_file') or
  die("Failed opening file: error wa '$php_errormsg'"); 
//Failed opening file: error wa 'error'
(8)数组运算符

合并运算符+

$arr = [
  "a" => "apple",
  "b" => "banana"
];
$arr1 = [
  "a1" => "apple1",
  "b1" => "banana1",
  "a" => "apple",  //键名相同,合并时将会被忽略,以首次出现的键值对为准
  "c" => "apple"  //键值相同,会正常合并
];

$a = $arr + $arr1;
var_dump($a);
//array(5) { ["a"]=> string(5) "apple" ["b"]=> string(6) "banana" ["a1"]=> string(6) "apple1" ["b1"]=> string(7) "banana1" ["c"]=> string(5) "apple" }

相等运算符=====

$arr = [
  "a" => "apple",
  "b" => "banana"
];
$arr1 = [
  "b" => "banana",
  "a" => "apple"
];

var_dump($arr == $arr1);  //bool(true)
var_dump($arr === $arr1);  //bool(false)

双等运算符主要看键值对是否一致,不管顺序。三等运算符需要考虑键值对的顺序。

$arr = ["apple", "banana"];
$arr1 = [
  "1" => "banana",
  "0" => "apple"
];

var_dump($arr == $arr1);  //bool(true)
var_dump($arr === $arr1);  //bool(false)
(9)执行运算符

php支持一个执行运算符:反引号(``)。php将尝试将反引号中的内容作为shell命令来执行,并将其输出信息返回。

$output = `ipconfig`;
echo "<pre>$output</pre>";
13、流程控制
(1)if/else
$a = 12;
$b = 13;

if ($a > $b) {
  echo "a > b";
} elseif ($a < $b) {
  echo "a < b";
} else {
  echo "a == b";
}

php还提供了一些替代语法:

使用:替代{ ;使用endif 替代}

if ($a > $b) :
  echo "a > b";
elseif ($a < $b) :
  echo "a < b";
else :
  echo "a == b";
endif;
(2)while/do-while

同样有替代语法,:endwhile

(3)for

endfor

(4)foreach

foreach语法结构提供了遍历数组的简单方式,foreach仅能用于数组和对象。

$arr = ["a", "b", "c", "d"];

foreach ($arr as $key=>$val) {
    echo "<h1>$key - $val</h1>";
}

endforeach

(5)break 和 continue

break结束当前for、foreach、while、do-while或者switch结构的执行,后面可以跟一个参数,表示跳出几层循环,默认为1层。

$arr1 = ["a1", "b1", "c1"];
$arr2 = ["a2", "b2", "c2"];

foreach ($arr1 as $key1=>$val1) {
    foreach ($arr2 as $key2=>$val2) {
        if ($val1 == "b1" && $val2 == "b2") {
            echo "--------";
            break;
        }
        echo "<h1>$val1 - $val2</h1>";
    }
}

此时就是break一层的情况,输出结果为:

在这里插入图片描述

如果改为break 2

$arr1 = ["a1", "b1", "c1"];
$arr2 = ["a2", "b2", "c2"];

foreach ($arr1 as $key1=>$val1) {
    foreach ($arr2 as $key2=>$val2) {
        if ($val1 == "b1" && $val2 == "b2") {
            echo "--------";
            break 2;
        }
        echo "<h1>$val1 - $val2</h1>";
    }
}

在这里插入图片描述

continue在循环中用来跳过本次循环中剩余代码的执行,用法跟break差不多,也可以跟参数。

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:20:14  更:2022-04-18 17:22:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 13:01:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码