| php这里默认有HTML,JavaScript基础咯。 一、基础1、客户端和服务端客户端(用户端):享受服务的【前端,客户端运行代码】 服务端(远程):提供服务的【后端,服务端运行代码】 
 2、什么是phpPHP(全称:以前叫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";
echo "last statement";
 2、指令分隔符PHP需要在每个语句后用分号结束指令;,一段PHP代码中的结束标记隐含表示了一个分号,在一个PHP代码段中的最后一行可以不用分号结束。 3、注释4、变量PHP中变量用一个$后加变量名来表示。变量名区分大小写。(变量、常量、php配置文件php.ini区分大小写,其他不分) $var = 'Bob';
$Var = 'Joe';
$4site = 'not yet';  
$_4site = 'not yet';  
$this = 'Nikon';  
 5、赋值(1)传值赋值(默认)使用“=”将赋值表达式的值赋给另一个变量(单独分配房间),互不干扰。 $name = "tom";
$myname = $name;  
 (2)引用赋值将赋值表达式内存空间的引用赋给另外一个变量,简单地将一个&符号加到将要赋值的变量前(共享一个房间),改变其中一个变量的值会影响另一个变量。 $foo = 'Bob';
$bar = &$foo;  
 6、可变变量变量的名字可以动态改变,用$$符号表示。 $a = 'hello';
$$a = 'world';  
 7、常量常量是一个简单值的标识符(名字),在脚本执行期间该值不能改变。默认大小写敏感,一般来讲常量标识符总是大写的,用define()函数关键词再定义。 常量只能包含标量数据(boolean, integer, float, string),注意没有$符号。 define('NAME', 'Tom');
echo NAME;
  
 注意: 和使用define()定义常量不同的是,使用const关键字定义常量必须处于最顶端的作用域,因为此方法是在编译时定义的。这就意味着不能在函数中,循环内以及if语句中使用const来定义常量。 8、魔术常量(预定义常量)
 9、变量作用域(1)变量法则超全局变量,任何地方都可以访问常数,一般是全局性,函数内外都可以访问全局变量(一般声明在函数外面),函数内不可以访问函数内可以通过global关键词就可以访问全局变量(其实是同一个变量)在函数中创建的静态变量,函数外无法访问,但是这个变量的值一直保留在函数中创建的局部变量,函数外是无法访问的,并且在函数执行结束后失效
 (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>";  
 (3)全局变量全局变量一般声明在函数外的变量,代码间可以访问,函数内不可以访问。 <?php
$a = 100;   
function output() {
  echo "<h1>$a</h1>";   
  
}
output();
 可以在函数中使用global关键字,对全局变量进行访问。 <?php
$a = 100;
function output() {
  global $a;
  echo "<h1>$a</h1>";  
}
output();
 (4)静态变量静态函数只是在函数体内,在函数外无法访问。但是执行后,其值保留,等待下次函数执行。 function add() {
  static $c = 500;  
  $c++;
  echo "<h1>$c</h1>";
}
add();  
add();  
 (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)字符串型(4)布尔型不区分大小写 (5)NULL表示一个变量没有值。以下三种情况,变量可能为NULL: (6)数组型php中的数组实际上是一个有序映射,映射是一种把values关联到keys的类型。  
 array( key => value, …)键key可以是一个整数integer或字符串string
 值value可以是任意类型的数
 $a = array(
  "a" => "abc",
  "b" => "ddd"
);
$b = [
  "a" => "abc",
  "b" => "ddd"
];
var_dump($a);  
var_dump($b);
 key的强制转换: 字符串: 如果包含合法整型值,会被转换为整型。如"8"实际被储存为8,但是"08"则不会强制转换,因为其不是一个合法的十进制数值。浮点数: 会被转换成整型,且转换时直接舍弃小数部分。如8.7实际被存储为8。布尔值: 会被转换成整型,true为1,false为0。Null: 会被转换为空字符串,即""。NaN: 会被转换为空字符串。数组和对象: 不能被用作key,会出现警告:Illegal offset type。
 重复的key会进行覆盖: 如果在数组定义中,多个单元都使用了同一个key,则最后一个出现的单元会将前面的覆盖。 $a = array(
  1 => "abc",
  "b" => "ddd",
  1.5 => "ccc"
);
var_dump($a);  
 key为可选项: 如果未指定key,php将自动使用之前用过的最大integer键名加上1作为新的键名。 $b = ["abc", "ddd", "aaa"];
$d = array(1, 2, 3, 4);
$e = [
  "a",
  "b",
  4 => "c",
  "d"
];
var_dump($e);  
 注意这里的变量$e,其中"d"对应的键名为5,正是因为之前使用过的最大键名为4。 数组的访问: $array[key](大括号{}的访问方法已经不再支持了)
 $a = [1, 2, 3, 4];
echo $a[0];  
$b = [
  "a" => 1,
  "b" => 2,
  3
];
echo $b[0];
 数组元素的修改与新增: 数组单元可以通过array[key]来进行修改或新增;如果想要删除某键值对,对其调用unset()函数。 $arr = array(5 => 1, 12 => 2);
$arr[] = 15;  
unset($arr[5]);  
var_dump($arr);  
 (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;  
 Resource资源类型: 比如打开一个文件,或者链接一个数据库等。 $fp = fopen("test.txt", "r");
var_dump($fp);  
fclose($fp);
 11、类型转换(1)(type)强制转换(int)、(integer):转换为整型(float)、(double)、(real):浮点型(string):字符型(bool)、(boolean):布尔型(array):数组型(object):对象
 $a = "12.2";
var_dump((float)$a);  
 (2)intval()、floatval()、strval()$a = "12.2";
var_dump(floatval($a));  
 (3)setype()函数$a = "12.2";
settype($a, "float");
var_dump(floatval($a));  
 注意,前两种转换方式都不会改变原数据的类型,即$a还是string类型。但第三种方式会改变原数据类型,也就是直接将$a的类型转变为float类型。 (4)Integer整型(类型转换)如果给定的数超出integer范围,将会被解释为float类型。 echo PHP_INT_MAX;  
var_dump(PHP_INT_MAX + 1);  
 将resource转换成integer时,结果会是PHP运行时,给resource分配的唯一资源号。 $fp = fopen("test.txt", "r");
var_dump($fp);  
var_dump((int)$fp);  
 NAN将转换为0。 echo (int)NAN;  
 字符串转换为数值: 如果该字符串没有包含'.','e'或'E'并且其数字值在整型的范围之内,该字符串将被当成integer来取值,其他所有情况下为PHP_INT_MAX。 该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。 $a = "1249857576676879778766767793";
var_dump((int)$a);  
$b = "123aljfeioj";
var_dump((int)$b);  
$c = "5.8";
var_dump((int)$c);  
$d = "jflj320jljk";
var_dump((int)$d);  
$e = 1.5e+10;
var_dump((int)$e);  
 (5)Boolean布尔类型(类型转换)当转换为布尔值时,以下值被认为是FALSE: 布尔值FALSE本身整型值0浮点型值0.0空字符串(字符串里有空格不算空字符串),以及字符串"0"不包含任何元素的数组特殊类型NULL(包括尚未赋值的变量)
 其他所有的值都被认为是TRUE(包括任何资源 和 NAN) $a = NAN;
var_dump((bool)$a);  
$b = "  ";
var_dump((bool)$b);  
$c = "";
var_dump((bool)$c);  
 (6)String字符串(类型转换)转换规则: 布尔值TRUE转换成"1",FALSE转换成""(空字符串)整型和浮点型转换为数字的字面样式的string数组array总是转换成字符串"Array"NULL转换为空字符串资源resource转换为"Resource id #1"这种结构的字符串
 $a = NAN;
var_dump((string)$a);  
$b = true;
var_dump((string)$b);  
$fp = fopen("test.txt", "r");
var_dump((string)$fp);  
fclose($fp);
 (7)Array数组(类型转换)对于任意integer,float,string,boolean和resource类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为0,该元素即为此标量的值。 $a = 12.33;
var_dump((array)$a);  
 如果一个对象object类型转换为array,则结果为一个数组,其单元为该对象的属性,键名将为成员变量名。 class Age
{
    public $age1 = 100;
    private $age2 = 200;
    protected $age3 = 300;
}
$s = new Age();
var_dump((array)$s);  
 注意这里,对象内的属性类型不同,转换为数组时,键名也会有所不同。public、private以及protected有所区别。 (8)Object对象(类型转换)array转换成object将键名成为属性并具有相对应的值。 $obj1 = (object) array(1 => "foo");
var_dump($obj1);  
var_dump($obj1->{1});  
var_dump(isset($obj1->{1}));  
 注意,当键名为数字时,一定要使用大括号包裹键名。 对于其他值,会包含进成员变量名scalar。(scalar是标量的意思) $obj = (object) "hao";
var_dump($obj);  
var_dump($obj->scalar);  
 12、运算符(1)赋值运算符=(2)算术运算符+ - * / % ++ -- **(指数)
 intdiv()整除
 (3)字符串运算符连接运算符.: 返回其左右参数连接后的字符串。 $a = "hello ";
$b = "php";
$c = $a.$b;
echo $c;  
 (4)逻辑运算符与&&(AND)、或||(OR)、非!、异或xor 优先级从高到低:&&、||、=、AND、OR $a = true && false;
var_dump($a);  
$b = true and false;
var_dump($b);  
 一般情况下,AND和&&等价,但是要注意它们的优先级是不同的,and的优先级比较低,低于赋值运算符,所以$b通过赋值运算符,直接等于了true。 平时使用时,建议使用&&来替代AND,否则优先级容易出问题。 短路运算: $a = false && foo();
var_dump($a);  
$b = false and foo();
var_dump($b);  
$c = true || foo();
 (5)比较运算符==和===等于和全等运算符:和JavaScript相同。
 <>和!=不等。
 !==不全等。
 <=>太空船运算符(组合比较符):当$a小于、等于、大于$b时,分别返回一个小于、等于、大于0的integer值。php7开始提供。
 $a = 9 <=> 10;
var_dump($a);  
$b = 10 <=> 9;
var_dump($b);  
$c = 9 <=> 9;
var_dump($c);  
 ??NULL合并操作符:从左往右第一个存在且不为NULL的操作数。如果都没有定义,则返回NULL。php7开始提供。
 $a = $b ?? $c;
var_dump($a);  
$d = $b ?? 10;
var_dump($d);  
 (6)位运算位运算符允许对整型数中指定的位进行求值和操作。 var_dump(3 & 1);  
var_dump(3 | 1);  
var_dump(3 ^ 1);  
var_dump(~3);  
var_dump(3 << 1);  
var_dump(3 >> 1);  
 (7)错误处理$php_errormsg = "error";
$my_file = @file('non_existent_file') or
  die("Failed opening file: error wa '$php_errormsg'"); 
 (8)数组运算符合并运算符+: $arr = [
  "a" => "apple",
  "b" => "banana"
];
$arr1 = [
  "a1" => "apple1",
  "b1" => "banana1",
  "a" => "apple",  
  "c" => "apple"  
];
$a = $arr + $arr1;
var_dump($a);
 相等运算符==和===: $arr = [
  "a" => "apple",
  "b" => "banana"
];
$arr1 = [
  "b" => "banana",
  "a" => "apple"
];
var_dump($arr == $arr1);  
var_dump($arr === $arr1);  
 双等运算符主要看键值对是否一致,不管顺序。三等运算符需要考虑键值对的顺序。 $arr = ["apple", "banana"];
$arr1 = [
  "1" => "banana",
  "0" => "apple"
];
var_dump($arr == $arr1);  
var_dump($arr === $arr1);  
 (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)forendfor
 (4)foreachforeach语法结构提供了遍历数组的简单方式,foreach仅能用于数组和对象。 $arr = ["a", "b", "c", "d"];
foreach ($arr as $key=>$val) {
    echo "<h1>$key - $val</h1>";
}
 endforeach
 (5)break 和 continuebreak结束当前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差不多,也可以跟参数。 |