PHP

初识PHP

Posted by Xuan on March 1, 2020

PHP基本语法

php语句以;分号结尾

户定义的函数、类和关键词(例如 if、else、echo 等等)都对大小写不敏感;对变量大小写敏感

PHP 变量规则:

  • 变量以 $ 符号开头,其后是变量的名称
  • 变量名称必须以字母或下划线开头
  • 变量名称不能以数字开头
  • 变量名称只能包含字母数字字符和下划线(A-z、0-9 以及 _)
  • 变量名称对大小写敏感($y 与 $Y 是两个不同的变量)
<?php
$txt="Hello world!";
$x=5;
$y=10.5;
?>

PHP 变量作用域

在 PHP 中,可以在脚本的任意位置对变量进行声明。PHP 有三种不同的变量作用域:

  • local(局部):函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问。

  • global(全局):函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问;

global 关键词用于在函数内访问全局变量。PHP 同时在名为 $GLOBALS[index]

的数组中存储了所有的全局变量。下标存有变量名。这个数组在函数内也可以访问,并能够用于直接更新全局变量。

<?php
$x=5;
$y=10;

function myTest() {
  global $x,$y;
  $y=$x+$y;
}

myTest();
echo $y; // 输出 15
?>
  • static(静态):通常,当函数完成/执行后,会删除所有变量。不过,有时我需要不删除某个局部变量。 ``` <?php

function myTest() { static $x=0; echo $x; $x++; }

myTest(); myTest(); myTest();

?>

每当函数被调用时,这个变量所存储的信息都是函数最后一次被调用时所包含的信息。

注释:该变量仍然是函数的局部变量。

### PHP echo 和 print 语句

- echo - 能够输出一个以上的字符串
- print - 只能输出一个字符串,并始终返回 1

echo 比 print 稍快,因为它不返回任何值。

echo 命令来显示不同的字符串(同时请注意字符串中能包含 HTML 标记) <?php echo “<h2>PHP 很有趣!</h2>”; echo “Hello world!
”; echo “我计划学习 PHP!
”; echo “这段话”, “由”, “多个”, “字符串”, “串接而成。”; ?>

//echo 命令来显示字符串和变量 <?php $txt1=”Learn PHP”; $txt2=”W3School.com.cn”; $cars=array(“Volvo”,”BMW”,”SAAB”);

echo $txt1; echo “
”; echo “Study PHP at $txt2”; echo “My car is a {$cars[0]}”; ?>


### PHP 数据类型

PHP **var_dump()** 会返回变量的数据类型和值

- 字符串 :字符串可以是引号内的任何文本。您可以使用单引号或双引号
- 整数
- 浮点数
- 逻辑 :逻辑是 true 或 false
- 数组 

<?php $cars=array(“Volvo”,”BMW”,”SAAB”); var_dump($cars); ?>


- 对象 :对象是存储数据和有关如何处理数据的信息的数据类型。  在 PHP 中,必须明确地声明对象。  首先我们必须声明对象的类。对此,我们使用 class 关键词。类是包含属性和方法的结构。 然后我们在对象类中定义数据类型,然后在该类的实例中使用此数据类型

<?php class Car { var $color; function Car($color=”green”) { $this->color = $color; } function what_color() { return $this->color; } } ?>


**???**
[对象实例](https://www.w3school.com.cn/tiy/s.asp?f=demo_php_datatypes_object)

- NULL。

### PHP 字符串函数

- strlen(): 函数返回字符串的长度,以字符计 

- str_word_count() : 函数对字符串中的单词进行计数

- strrev() : 反转字符串

- strpos() : 检索字符串内指定的字符或文本, 如果找到匹配,则会返回首个匹配的字符位置。如果未找到匹配,则将返回 FALSE。

- str_replace() :用一些字符串替换字符串中的另一些字符

- [PHP String 参考手册](https://www.w3school.com.cn/php/php_ref_string.asp)

<?php

echo strlen(“Hello world!”); //输出12

echo str_word_count(“Hello world!”); // 输出 2

echo strrev(“Hello world!”); // 输出 !dlrow olleH

echo strpos(“Hello world!”,”world”); //输出6

echo str_replace(“world”, “Kitty”, “Hello world!”); // 输出 Hello Kitty!

?>


### PHP 字符串运算符 & 数组运算符

- .	串接	$txt1 = "Hello" $txt2 = $txt1 . " world!"	现在 $txt2 包含 "Hello world!"	
- .=	串接赋值	$txt1 = "Hello" $txt1 .= " world!"	现在 $txt1 包含 "Hello world!"
- +	联合	$x + $y	$x 和 $y 的联合(但不覆盖重复的键)

### PHP 常量

设置常量,请使用 define() 函数 - 它使用三个参数:[常量名][常量值][是否对大小写敏感,默认false]

与变量不同,常量贯穿整个脚本是自动全局的

<?php define(“GREETING”, “Welcome to W3School.com.cn!”); echo GREETING; ?>


### PHP 条件语句 If else/Switch

- if 语句 - 如果指定条件为真,则执行代码
- if...else 语句 - 如果条件为 true,则执行代码;如果条件为 false,则执行另一端代码
- if...elseif....else 语句 - 根据两个以上的条件执行不同的代码块
- switch 语句 - 选择多个代码块之一来执行

<?php //If … else $t=date(“H”); if ($t<”10”) { echo “Have a good morning!”; } elseif ($t<”20”) { echo “Have a good day!”; } else { echo “Have a good night!”; } ?>

//Switch $favfruit=”orange”; switch ($favfruit) { case “apple”: echo “Your favorite fruit is apple!”; break; case “orange”: echo “Your favorite fruit is orange!”; break; default: echo “Your favorite fruit is neither apple, banana, or orange!”; }


### PHP 循环 while/for

- while - 只要指定条件为真,则循环代码块
- do...while - 先执行一次代码块,然后只要指定条件为真则重复循环
- for - 循环代码块指定次数
- **foreach** - 遍历数组中的每个元素并循环代码块, 循环只适用于数组,并用于遍历数组中的每个键/值对

foreach ($array as $value) { code to be executed; }

<?php $colors = array(“red”,”green”,”blue”,”yellow”);

foreach ($colors as $value) { echo “$value
”; } ?>


### PHP 函数

用户定义的函数声明以单词 "function" 开头

参数只要用逗号隔开即可

如需使函数返回值,请使用 return 语句

<?php function familyName($fname,$year) { echo “$fname Zhang. Born in $year
”; }

familyName(“Li”,”1975”); familyName(“Hong”,”1978”); familyName(“Tao”,”1983”); ?>


### PHP 数组 array();

- 索引数组 - 带有数字索引的数组

count() 函数用于返回数组的长度(元素数)

<?php $cars=array(“porsche”,”BMW”,”Volvo”); $arrlength=count($cars);

for($x=0;$x<$arrlength;$x++) { echo $cars[$x]; echo “
”; } ?>


- 关联数组 - 带有指定键的数组 :关联数组是使用您分配给数组的指定键的数组

//创建方法1 $age=array(“Bill”=>”35”,”Steve”=>”37”,”Elon”=>”43”); //创建方法2 $age[‘Bill’]=”63”; $age[‘Steve’]=”56”; $age[‘Elon’]=”47”;

<?php $age=array(“Bill”=>”63”,”Steve”=>”56”,”Elon”=>”47”); echo “Elon is “ . $age[‘Elon’] . “ years old.”;

//关联数组的遍历 foreach($age as $x=>$x_value) { echo “Key=” . $x . “, Value=” . $x_value; echo “
”; } ?>


- 多维数组 - 包含一个或多个数组的数组


### 数组排序

- sort() - 以升序对数组排序
- rsort() - 以降序对数组排序
- asort() - 根据值,以升序对关联数组进行排序
- ksort() - 根据键,以升序对关联数组进行排序
- arsort() - 根据值,以降序对关联数组进行排序
- krsort() - 根据键,以降序对关联数组进行排序
- [PHP 数组参考手册](https://www.w3school.com.cn/php/php_ref_array.asp)

### 超全局变量

- $GLOBALS,PHP 脚本中的任意位置访问全局变量: GLOBALS[index]的数组中存储了所有全局变量。变量的名字就是数组的键

<?php $x = 75; $y = 25;

function addition() { $GLOBALS[‘z’] = $GLOBALS[‘x’] + $GLOBALS[‘y’]; }

addition(); echo $z; ?>

- $_SERVER,这种超全局变量保存[关于报头、路径和脚本位置的信息](https://www.w3school.com.cn/php/php_superglobals.asp)


- $_REQUEST,用于收集 HTML 表单提交的数据
Name:

<?php $name = $_REQUEST[‘fname’]; echo $name; ?>

- $_POST,收集提交 method="post" 的 HTML 表单后的表单数据。$_POST 也常用于传递变量。
Name:

<?php $name = $_POST[‘fname’]; echo $name; ?>



- $_GET,收集提交 HTML 表单 (method="get") 之后的表单数据,也可以收集 URL 中的发送的数据。
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION


### PHP 表单

- $_GET 是通过 URL 参数传递到当前脚本的变量数组。
> 通过 GET 方法从表单发送的信息对任何人都是可见的(所有变量名和值都显示在 URL 中)。GET 对所发送信息的数量也有限制。限制在大约 2000 个字符。  
GET 可用于发送非敏感的数据。

- $_POST 是通过 HTTP POST 传递到当前脚本的变量数组
> 通过 POST 方法从表单发送的信息对其他人是不可见的(所有名称/值会被嵌入 HTTP 请求的主体中),并且对所发送信息的数量也无限制。

- [表单验证](https://www.w3school.com.cn/php/php_form_validation.asp)

Name: E-mail: Website: Comment: Gender: Female Male ```

Question

1.$_POST[‘fname’] V.S. $_REQUEST[‘fname’];?

2.Post和Get的区别?

HTTP 的底层是 TCP/IP。所以 GET 和 POST 的底层也是 TCP/IP,也就是说,GET/POST 都是 TCP 链接。

TCP 就像汽车,我们用 TCP 来运输数据,但是如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,送急件的汽车可能被前面满载货物的汽车拦堵在路上,整个交通系统一定会瘫痪。

为了避免这种情况发生,交通规则 HTTP 诞生了。HTTP 给汽车运输设定了好几个服务类别,有 GET, POST, PUT, DELETE 等等,HTTP 规定,当执行 GET 请求的时候,要给汽车贴上 GET 的标签(设置 method 为 GET),而且要求把传送的数据放在车顶上(url 中)以方便记录。如果是 POST 请求,就要在车上贴上 POST 的标签,并把货物放在车厢里。当然,你也可以在 GET 的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在 POST 的时候在车顶上也放一些数据,让人觉得傻乎乎的。HTTP 只是个行为准则,而 TCP 才是 GET 和 POST 怎么实现的基本。

GET 和 POST 本质上就是 TCP 链接,并无差别。但是由于 HTTP 的规定和浏览器服务器的限制,导致他们在应用过程中体现出一些不同。

GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。 也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。

参考

HTTP 中 GET 与 POST 的区别