世界上最好的语言——PHP 学习笔记

"PHP是世界上最好的语言"

Posted by Nathaniel on 2016-07-10

世界上最好的语言——PHP 学习笔记

环境搭建

鉴于我使用的是OSX系统,那么只需要把/etc/apache2/httpd.conf下的LoadModule php5_module libexec/apache2/libphp5.so这一行取消注释,即可使用PHP了

可以在自己的\Library\Webserver\Documents\下放一个这样的PHP页面检测是否成功,

<?php
// Show all information, defaults to INFO_ALL
phpinfo();
?>

如果成功出现PHP相关的信息,则说明PHP启用成功

基础语法

本文建立在你已有C/C++/Java 等传统语言基础,并且知道数据库是什么的前提之下

C/C++/Java完全相同的部分被省去,仅讨论不同部分。

首先 PHP 是服务端语言,和Java系的 JSP .NET 系的ASP 对应

主要用作动态页面显示,服务端操作等,由于其完全开源免费,所有得到了广泛的应用

位置

所有的php 语句都要包含在下面这样的 类html 标签里面

<?php
// PHP code goes here
?>

弱类型

和C/C++/Java不同,PHP是弱类型的,它使用$varible_name的方式来定义、使用变量。

变量作用域

  • 普通的全局变量在函数内不可见
  • 只有在函数内使用global关键字(类似extern)后才能使用
  • 另可使用GLOBALS['x']的方式访问全局变量

基础输出

echoprint的区别
  • 均可打印普通文本、变量、html标签
  • echo没有返回值,print返回1
  • echo 可有多个参数(用逗号隔开)
  • echo速度稍微快一点

数据

var_dump()

显示数据类型+值

  • 未初始化的值默认都是NULL
  • 类必须显示声明
  • Resource 类型 用于存 PHP外部资源

命名

  • 变量大小写敏感
  • 函数大小写不敏感
  • 常量可以自定义是否大小写敏感,默认敏感

define(name, value, case-insensitive)

运算符

** 指数运算符 PHP 5.6 以后支持

== != <> 仅看值是否相等 如 100 == "100"

=== !== 值和类型都要相等 100 !== "100"

有显式的 and or xor 运算符

String类有特殊的连接运算符. .=

\$txt1 .= \$txt2 运行后 text2 的内容接到了text1上

if else

elseif 中间不能有空格

for

支持foreach

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

数组

三类数组

  • 下标数组(默认)
  • 关联数组(类似<map>)
  • 多维数组

关联数组语法(含对应foreach 用法)

<?php
$age = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
foreach($age as $x => $x_value) {
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
?>
数组排序
sort() 基础升序
带r 降序
带a 按值排序
带k 按键排序

特殊全局变量

  • $GLOBALS

    • $GLOBALS['z']

      用于直接访问全局变量

  • $_SERVER

    • <?php
      echo $_SERVER['SERVER_NAME'];
      echo $_SERVER['HTTP_USER_AGENT'];
      echo $_SERVER['SCRIPT_NAME'];
      ?>

      用于存储头文件、路径、脚本文件位置

  • $_REQUEST

    • <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
      Name: <input type="text" name="fname">
      <input type="submit">
      </form>
      <?php
      if ($_SERVER["REQUEST_METHOD"] == "POST") {
      // collect value of input field
      $name = $_REQUEST['fname'];
      if (empty($name)) {
      echo "Name is empty";
      } else {
      echo $name;
      }
      }
      ?>

      收集HTML表单提交信息

  • $_POST

    • 收集post中的表单信息
    • $_POST['fname']可以获取<form>中的fname的值
  • $_GET

    • 收集get中的表单信息

    • <a href="test_get.php?subject=PHP&web=W3schools.com">Test $GET</a>

      可以通过$_GET[subject]获取subject 的值

PHP与表单

GET 与 POST的区别

  • GETPOST是两种服务端与客户端通信的方法,分别创建了特殊的关联数组
  • GET使用 URL参数传值,而POST使用HTTP标准POST方法传值
  • GET传递的值对所有人可见,易于加入收藏、二次使用,限长约2000字符
  • POST传递的信息隐蔽,无限长,更安全一些,不可加入收藏

安全性的保障

有时候用户输入可能是恶意的,因此我们需要使用

htmlspecialchars()函数来防止 XSS攻击

总是要记得处理用户输入,主要工作:

  1. 使用 trim() 去除 无用的字符(空格 tab 换行符)
  2. 使用 stripslashes() 去掉转移符 \
  3. 使用htmlspecialchars() 去掉 <> 等会转义为html内容的符号
  4. 使用preg_match()来匹配正则表达式

进阶PHP

多维数组

$cars = array
(
array("Volvo",22,18),
array("BMW",15,13),
array("Saab",5,2),
array("Land Rover",17,15)
);

数组内可有多种不同的类型的数据

Include指令

可以使用includerequire 指令来包含一个文件

Includerequire 区别

  • Include 在找不到文件等错误情况下继续执行php语句
  • require则不会

文件处理

readfile() 函数

读取指定文件的内容,如果成功则返回所读取的字节数

文件处理模式

x 模式,仅创建新文件,且创建后只能写,如果同名文件之前已存在则返回FALSE

文件上传

要进行文件上传,首先需要在/etc/php.ini/中增加一行

file_uploads = On

文件上传只能使用POST模式

可通过内置函数控制上传的文件大小、格式等,在此不详述。

Cookies

setcookie() 函数用法

setcookie(name, value, expire, path, domain, secure, httponly);

可以使用$_COOKIE来在php中操纵cookies

修改 再次使用setcookie();

删除 使用setcookie() 并且把expire 设成过去的某个时间

Session

用于简单的身份认证,直至用户关闭浏览器

可以使用全局比变量$_SESSION来操纵Session

session_start()函数用法

必须在整个文件中最先出现,比任何html 标记都要先出现

所有的session变量都存储在$_SESSION全局变量下

使用 session_unset() session_destroy() 来清除session变量 ,终止session

Filters

主要用于验证、处理外部输入

filter_list() 可列出所有支持的Filter

由于外部输入形式各异,必须使用Filter以保证系统安全性

filter_var() 同时验证和处理数据

整数验证时, 注意0要特殊处理,因为0也可被当成bool看待

同理可验证 邮箱 URL IP 等

错误处理

默认的错误处理很基础,仅仅显示错误的文件名+行数+简单的描述

但如果你的错误处理做的不好,可能会导致安全问题

die() 能显示指定的错误消息,并结束php程序

构建自定义错误处理器,语法如下

error_function(error_level,error_message,
error_file,error_line,error_context)

第二行的参数为非必需的