Back

PHP learning

Sun, Jul 10 20163 min read
avatar
Nathaniel

环境搭建

鉴于我使用的是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)
第二行的参数为非必需的

Comments(0)

Continue with
to comment