大家好, 我是麻同学.
这是水贴!!!
题目 : 就算php不再流行, 我也依然爱它.
1.PHP
超文本标记是用普通文本描述富文本的一种方式.
富文本 : 有格式的文本
PHP(Hypertext Preprocessor) 是一种被广泛应用的脚本语言, 它可以被嵌入到 HTML 中, 尤其适合做动态网站的开发.
1.1 PHP 语言的特点
a. 开源(open source) 软件, 跨平台, 常用操作系统稳定执行. Windows \ Linux. 做 WEB 开发的经典组合 WAMP, LAMP 基本都是开源软件.
b. 入门简单, 用户只需要关注应用, 开发成本低.
c. 支持的大多数主流数据库. MySQL, oracle, Redis 等
d. 存在大量针对 PHP 开发的框架, 如 Laravel, TinkPHP, Yii, Coderlgniter, Symfony 等, 加快开发速度.
我们使用 PHP 的目的就是能让静态网页变成动态网页, 能称之为动态网页的核心就是让 HTML 上的内容不再被写死, 而是通过在 HTML 中嵌入一段可以在服务端执行的代码(php), 从而达到动态网页的目标.
动态修改日期
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>当前日期</title>
</head>
<body>
<h1><?php echo date('Y-m-d'); ?></h1>
</body>
</html>
1.2 PHP标记
<?php 可以让代码进入 "PHP 模式"
?> 可以让代码退出 "PHP 模式"
1.3 输出内容方式
1. echo :
输出多个字符串
<?php
// echo 是 PHP 中的一个特殊的“指令”,
// 不一定需要像函数那样通过 `()` 去使用
// 注意:echo 后面紧跟着一个空格
echo 'hello php';
echo 'hello', 'world';
// => `helloworld`
2. print :
输出一个字符串值
<?php
// print 与 echo 唯一区别就是只能有一个参数
print 'hello php';
// print 'hello', 'world';
// => Parse error: syntax error ...
3. print_r :
可以输出复杂数据类型, 如数组, 以键值对的形式输出
4. var_dump :
可以输出复杂数据类型, 如数组, 以键值对的形式输出, 还可以输出数据的长度
<?php
// var_dump 是一个函数,必须跟上 () 调用
// 可以将数据以及数据的类型打印为特定格式
var_dump('hello php');
// => 'string(9) "hello php"'
1.4 与 HTML 混编
1. 普通嵌入
<p><?php echo 'hello'; ?></p>
2. 语句混编
a. 在<?php 这个结构中只能写符合 php 语法的代码 ?>
b. 在<?php ?> 结构的代码会原样输出
c. 混编实现方式
<?php if ($age >= 18) { ?>
<p>成年人</p>
<?php } else { ?>
<p>小朋友</p>
<?php } ?>
<?php if ($age > 18): ?>
<p>成年人</p>
<?php else: ?>
<p>小朋友</p>
<?php endif ?>
1.5 注释
1. 单行注释
<?php
// 这是一条单行注释
# 井号也可以做注释(不要用,有点生僻)
$foo = 'hello';
2. 多行注释
<?php
/*
......
这里可以添加任意行数的注释内容
......
*/
$foo = 'hello';
1.6 语法
编程语言常见的语法
a. 变量 --- 用于临时存放数据的容器
b. 顺序结构 --- 先干什么再干什么
c. 分支结构 --- 如果怎样就怎样否则怎样
d. 循环结构 --- 不断的做某件相同的事
e. 函数 --- 提前设计好一件事怎么干, 然后想什么时候干就什么时候干
f. 运算符 --- 数学运算和字符串拼接
g. 字面量 --- 在代码中用某些字符组成, 能够表达一个具体的值, 这些字符之间表示数据的方式叫做字面量.
以下是重点注意的问题 :
a. 变量
b. 双引号字符串和单引号字符串的差异
c. 指令式的语法
d. foreach
e. 函数作用域问题
f. 字符串拼接
1.7 变量
变量是编程语言中临时存放数据的容器.
PHP 中声明一个变量是用一个美元符号后面跟变量名来表示. 变量名同样是区分大小写的.
PHP 中变量无序声明类型, 变量的类型根据值的类型来判断.
PHP 中变量声明却没复制, 那么这个值默认为 null.
<?php
$foo; // 申明一个变量,变量名为 `foo`,未对其进行赋值
$bar = 'baz'; // 申明一个变量,将一个值为 `baz` 的字符串赋值给它
echo $foo; // 输出一个变量名为 `foo` 的变量
fn($bar); // 将一个变量名为 `foo` 的变量作为 `fn` 的实参传递
1.8 常用函数
a. isset() :
判断变量是否定义了, 同时它还可以判断变量的值是否为 null,
如果定义了且值不为null(不是null就行), 则返回 true, 否则返回 false.
b. empty() :
判断变量是否为空值, 为空的值有 : "", 0, "0", null, false, array(), 未定义的变量 ,
如果值为以上中的某一个, 则返回值 true.
c. unset() : 删除变量
1. 如果删除一个变量, 那么变量的值会置为 null
2. 可以同时删除多个变量
3. 如果在函数中删除全局变量, 那么并不会真正的将全局变量删除(以后再说)
1.9 数据类型
PHP 中的 '+' 只表示运算符, 如果不能将参与运算的数据转换为数字, 就将其看成0来运算, 并且报错.
PHP 中的连接符 用 ' . ' .
常见的 PHP 数据类型与 JavaScript 基本一致 :
a. string (字符串)
b. integer (整型) 只能存整数
c. float (浮点型) 可以存带小数位的数字
d. boolean (布尔型)
e. array (数组)
f. object (对象)
g. NULL (空)
数据类型的分类 :
a. 基本数据类型 : string (字符串) , integer (整型) , float (浮点型) , boolean (布尔型)
b. 符合数据类型 : array (数组) , object (对象)
c. 特殊数据类型 : NULL (空) , 资源
判断数据类型 :
a. is_string() : 判断当前变量是否是字符串类型.
a. is_bool() : 判断当前变量是否是布尔类型.
a. is_int() : 判断当前变量是否是整型类型.
a. is_float() : 判断当前变量是否是浮点类型.
a. is_array() : 判断当前变量是否是数组类型.
a. is_object() : 判断当前变量是否是对象类型.
1.10 字符串
PHP 有多种创建字符串的方式 : 单引号, 双引号 等.
1. 单引号字符串
a. 不支持特殊的转义符号, 例如 \n
b.如果要表示一个单引号字符内容, 可以通过 \' 表达
c. 如果要表示一个反斜线字符内容, 可以通过 \\ 表达
2. 双引号字符串
a. 支持转义符号 : \'' , \\ , \$ , \r , \n , \t .
b. 支持变量解析,
如果在变量名后面紧接着其他的合法字符(中文, a-z A-Z 0-9 _) 那么系统会将整个变量及后面的字符串当成一个变量进行解析
如果需要在这种情况下正确的解析变量, 可以将变量包含在 {} 中.
1.11 数组
PHP 中数组大致可以分为两类 :
1. 索引数组
与 JavaScript 中的数组基本一致.
<?php
// 定义一个索引数组
$arr = array(1, 2, 3, 4, 5);
var_dump($arr);
print_r(arr);
// PHP 5.4 以后定义的方式可以用 `[]`
$arr2 = [1, 2, 3, 4, 5];
var_dump($arr2);
print_r(arr2);
// 在 PHP 中需要使用 count(数组对象) 来获取数组的长度
for($i = 0; $i < count($arr); $i++) {
echo $arr[$i].' ';
}
2. 关联数组
有点类似于 JavaScript 中的对象
<?php
// 注意:键只能是`integer`或者`string`
$arr = array('key1' => 'value1', 'key2' => 'value2');
var_dump($arr);
// PHP 5.4 以后定义的方式可以用 `[]`
$arr2 = ['key1' => 'value1', 'key2' => 'value2'];
var_dump($arr2);
// 遍历关联数组 foreach
foreach(数组对象 as 键 => 值) {
echo $key.":".$value.'<br>';
}
//遍历关联数组 简洁写法
foreach($arr as $key) {
echo $key.'<br>'; // 输出数组的值
}
补充 :
1. 混合数组
没有 key 就会默认添加索引, 添加的索引与 key 不会互相影响, 如果没有指定 key, 那么索引会取到之前的最大的索引下.
2. 通过 [] 创建
a. 判断当前数组是否已经存在, 如果不存在则先创建, 再将元素添加到数组第一个元素位置.
b. 如果当前数组已经存在, 那么就将当前元素添加到数组中 --- 追加
$arr[] = 1;
$arr[] = 100;
$arr["name"] = "jack";
print_r($arr);
3. count() :
获取指定数组的长度
2. unset() :
它也可以用来删除数组中的某个成员. 但是删除了数组的元素之后, 并不会对数组元素的索引产生影响, 元素还会保留之前的索引, 意味着它只是删除了索引位置的元素, 并没有动态的改变数组的长度.
3. 深度数组 : 二维数组
// 描述学生对象 : 姓名 + 年龄
$arr = array(
array(
"name" => "jack",
"age" => 20
),
array(
"name" => "rose",
"age" => 18
)
);
print_r($arr);
1.12 数据类型转换
<?php
$str = '132';
// 将一个内容为数字的字符串强制转换为一个整形的数字
$num = (int)$str;
// 将一个数字强制转换为布尔值
$flag = (bool)$num;
?>
强制转换为数组时, 变量将会成为数组的第一个元素.
1.13 运算符
与 JavaScript 基本一致.
注意 :
字符串连接(拼接) 采用的是比较特殊的 ' . ' .
<?php
$name = 'zce';
// 拼接 `hey ` 和 `zce`
$message = 'hey ' . $name;
$foo = $message;
echo $foo; // heyzce
?>
1.14 语句
分号分隔 if \ switch \ while \ for \ foreach \ function ...
流程控制
a. 顺序结构
b. 分支结构
if...else
switch...case
c. 循环结构
for
while
do while
foreach --- 专门用来遍历数组
<?php
// 指令式就是将开始 { 换成 : 结束 } 换成 endif;
if ($i > 0) :
echo 'ok'
endif;
// for foreach while 也是一样
for ($i = 0; $i < 10; $i++) :
echo $i;
endfor;
?>
1.15 函数
定义与使用函数的方式与 JavaScript 相同 :
<?php
// 函数名不区分大小写
function foo ($name, $title) {
echo "$name ($title)";
}
// 调用
foo('zce', 'UFO');
Foo('zgd', 'SBO'); // 大小写不区分
注意 :
函数名不区分大小写 (不要这么做)
建议在 PHP 中采用下划线样式 (snake_case) 做命名规则, 不管是函数还是变量.
特性
变量作用域
关于变量作用域这一点, PHP 于绝大多数语言也都不同 : 默认函数内不能访问父级作用域的成员.
在 JavaScript 中, 我们可以在函数作用域中使用父级作用域.
而在 PHP 中 :
<?php
$top = 'top variable';
function foo () {
$sub = 'sub variable';
echo $top;
// => 无法拿到
function bar () {
echo $top;
// => 无法拿到
echo $sub;
// => 无法拿到
}
bar();
}
foo();
?>
如果需要访问全局变量, 可以通过 global 关键字声明 :
<?php
$top = 'top variable';
function foo () {
// 声明在当前作用域中获取全局作用域中的 `$top`
global $top;
$sub = 'sub variable';
echo $top;
// => `top variable`
function bar () {
// 声明在当前作用域中获取全局作用域中的 `$top` 和 `$bar`
global $top, $bar;
echo $top;
// => `top variable`
echo $sub;
// => 任然无法拿到,因为 `$sub` 不再全局范围,而是在 `foo` 函数中定义
}
bar();
}
foo();
?>
超全局变量
PHP 中的许多预定义变量都是 "超全局的" , 这意味着它们在一个脚本的全部作用域中都可用. 在函数或方法中无序执行 global $variable; 就可以访问它们.
这些超全局变量是(都是数组) :
a. $GLOBALS --- 引用全局作用域中可用的全部变量
b. $_SERVER — 获取服务端相关信息
c. $_REQUEST — 获取提交参数
d. $_POST — 获取 POST 提交参数
e. $_GET — 获取 GET 提交参数
f. $_FILES — 获取上传文件
g. $_ENV — 操作环境变量
h. $_COOKIE — 操作 Cookie
i. $_SESSION — 操作 Session
$GLOBALS
$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可).
PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量.
变量的名字就是数组的键.
<?php
$x = 75;
$y = 25;
function foo () {
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
foo();
echo $z;
// => 100
?>
1.16 常量的定义与使用
常量跟变量一样也是一个数据容器, 但是不同的时一旦声明后就不允许被修改.
define(name, value, insensitive); // 常量名称, 常量值, 是否对大小写敏感,默认为敏感
PHP 中的魔术常量
魔术常量的意思是指这个常量值会根据不同的场合返回不同的值.
魔术常量 :
__LINE__ : 可以获取当前的代码行
__FILE__ : 可以获取当前文件的路径 : 目录 + 文件名
__DIR__ : 可以获取当前文件的目录
__FUNCTION__ : 可以获取当前魔术常量所在的函数
1.17 载入其他文件 : 文件包含
通常情况下, 当一个文件中的代码过长, 自然会想到要拆分到多个文件中.
随着开发经验的积累, 慢慢会发现, 除了文件过长应该拆分文件, 更应该做的事情是根据用途去划分.
载入文件 : 相当于将被载入的文件的代码在当前位置复制一份
PHP 中引入其他 PHP 文件有四种方式 :
a. require
b. require_once
c. include
d. include_once
include '10-constant.php';
四种方式的对比 :
| require
| require_once
| include
| include_once
| 被载入文件如果不存在是否影响继续运行
| Y
| Y
| N | N
| 多次调用是否会重复执行被载入的文件 | Y
| N
| Y
| N
| 使用层面 :
a. include 一般用于载入公共文件, 这个文件的存在与否不能影响程序后面的运行
b. require 用于载入不可缺失的文件
c. 至于是否采用一次载入 (once) 这种方式取决于被载入的文件
1.18 常用 API
API (Application Programming Interface) 接口都是提供某种特定能力的事物,
特点是有输入输出, 而我们在开发时 (写代码) 用到的接口称之为 API (应用程序编程接口)
任何编程语言本身并没有太多的能力, 具体的能力大多数都来源于 API .
PHP 的能力来源于 它有 1000+ 内置函数, 不是每一个函数都默认直接可以使用, 有一些需要安装或者启用额外的"插件"扩展.
1. 字符串与数组处理
字符串与数组操作均使用 PHP 提供的内置函数, 这里仅以几个函数作为示例, 后面会有单独的部分进行讲解.
字符串函数(查看字符串长度) :
a. strlen(无法处理宽字符)
b. mb_strlen (根据当前php编码处理宽字符)
mb_internal_encoding(); 查看 PHP 当前的默认编码
2. 时间处理
时间处理默认采用格林威治时间(与中国所在的时区相差8小时), 需要进行设置, 这里我们要修改 PHP 的配置文件.
a. 时间戳 : time()
从 Unix 纪元 (格林威治时间 1970-01-01 00:00:00) 到当前时间的秒数
b. 格式化日期 : date()
格式化一个本地时间/日期
date('Y-m-d H:i:s'); // 2019-05-20 20:15:55
格式化一个指定的时间戳
可以通过 strtotime() 将将任何字符串的日期时间描述解析为 Unix 时间戳
strtotime("1970-1-2");
3. 文件操作
函数
| 描述
| PHP
| file_get_contents()
| 将文件读入字符串
| 4
| file_put_contents()
| 将字符串写入文件
| 5
|
1. file_get_contents()
需设置当前页面的返回值的类型是什么格式, 意味着后期浏览器接受了返回值后, 会按照图片格式进行解析.
header("Content-Type:text/html"); // 文档
header("Content-Type:image/jpeg"); // 图片
读取文件内容, 如果读取成功就会返回一个字符串类型的值(文件内容), 如果失败, 就会返回 false.
$res = file_get_contents("data.txt");
var_dump($res); // 文档
$res = file_get_contents("./images/monkey.png");
echo $res; // 图片
2. file_put_contents(文件路径, 需要写入的内容, FILE_APPEND)
将指定的内容写入到文件, 同时返回当前成功写入的字符的数量
FILE_APPEND : 设置当前的写入方式为追加
$count = file_put_contents("data.txt","这是我写入的内容",FILE_APPEND);
echo $count;
4. explode()拆分字符串
expolde("分隔符", 目标变量);
拆分后的字符串变成数组的形式存储并返回, 类似于 JavaScript 中的 split("分隔符").
|
|