PHP基础笔记整理,学习巩固PHP7,以前的应用主要是基于PHP5版本,以后的市场也偏向于逐渐成熟的PHP7,所以学习应用PHP7非常有必要,Hello PHP7!
0x01 PHP简介
PHP
(Hypertext Preprocessor
),超文本预处理语言,与Python
类似,都是弱类型脚本语言,解释性语言,PHP
可以与HTML
文档混写。
变量的四种作用域:
- local:局部变量
- global: 用于函数内部的变量声明引用全局变量,与此同时,全局变量都在
$GLOBALS
数组变量中 - static:局部变量不删除
- parameter:参数作用域,函数参数列表中声明的变量
0x02 PHP EOF
PHP EOF是一种在命令行
shell
和程序语言里定义一个字符串的方法,其包裹的内容可以解析变量。
<?PHP $a = 'DYBOY'; echo <<<EOF <h1>hello $a</h1> EOF; ?>
运行输出:
hello DYBOY
0x03 变量
变量有数据、字符串、类和数组类型
3.1 定义常量:
<?php // 定义一个基础URL常量,常量默认是全局的,可在任何地方调用 define('BASE_URL', 'https://blog.dyboy.cn/'); ?>
3.2 数组:
使用count($arr)
获取数组的长度,PHP存在关联数组,键值对的形式
<?php // 循环输出关联数组的内容 $arr = ['status' => 1, 'data' => 'OK']; foreach($arr as $key => $val){ echo "键名:".$key.' 值:'.$val; } ?>
3.3 数组排序:
sort()
- 对数组进行升序排列
rsort()
- 对数组进行降序排列
asort()
- 根据关联数组的值,对数组进行升序排列
ksort()
- 根据关联数组的键,对数组进行升序排列
arsort()
- 根据关联数组的值,对数组进行降序排列
krsort()
- 根据关联数组的键,对数组进行降序排列
一些数组的内置函数操作:https://www.runoob.com/php/php-ref-array.html
3.4 $_SERVER:
<?php echo $_SERVER['PHP_SELF']; echo $_SERVER['SERVER_NAME']; echo $_SERVER['HTTP_HOST']; echo $_SERVER['HTTP_REFERER']; echo $_SERVER['HTTP_USER_AGENT']; echo $_SERVER['SCRIPT_NAME']; ?>
0x04 魔术常量
用起来很舒服的一些常量,这些变量大小写不敏感,都是一样的效果
变量 | 说明 |
---|---|
__LINE__ |
返回当前代码行号 |
__FILE__ |
当前文件完整的路径+文件名,若用在被包含文件中,则返回被包含的文件名 |
__DIR__ |
当前文件的路径 |
__FUNCTION__ |
用在函数内部,输出当前函数名,区分函数名大小写 |
__CLASS__ |
用在类当中,返回当前类名,区分类名大小写 |
__METHOD__ |
类的方法名 |
__NAMESPACE__ |
命名空间 |
0x05 类
面向对象(OOP),对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。
<?php // 一个类的基本结构 class People{ // var 定义类成员变量 var name; var age; var sex; // 构造函数,用于初始化 function __construct( $name, $age, $sex ) { $this->name = $name; $this->age = $age; $this->sex = $sex; } // function定义类成员方法,成员方法数量无限 function run($long){ echo $this->name." can run ".$long." Meters"; } // 析构函数 function __destruct() { echo "销毁所有变量"; } } $newObj = new People('DYBOY', '20', 'boy'); // 类实例化 ?>
类的继承,父类与子类,子类继承父类,并可以扩展父类,PHP不支持多继承
<?php // 类的继承 class Chinese extends People { // coding... var position; //家庭住址 // 方法重写,父类的方法无法满足子类需求 function run(){ echo "孩子很6666,可以跑6666666 KM"; } } ?>
访问控制
public(公有):公有的类成员可以在任何地方被访问。
protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
private(私有):私有的类成员则只能被其定义所在的类访问。
static关键字
声明类属性或方法为 static(静态),就可以不实例化类而直接访问。
静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
静态属性不可以由对象通过 -> 操作符来访问。
0x06 文件包含
PHP中有
require
和include
两种,它俩区别在于include
发生错误后继续执行,require
停止,建议使用require
0x07 文件
文件包括读取文件,写入文件,在PHP中有对于form表单传递的文件作处理
<?php if ($_FILES["file"]["error"] > 0) { echo "错误:" . $_FILES["file"]["error"] . "<br>"; } else { echo "上传文件名: " . $_FILES["file"]["name"] . "<br>"; echo "文件类型: " . $_FILES["file"]["type"] . "<br>"; echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>"; echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"]; } ?>
0x08 异常处理
对于一些肯可能存在未知错误的地方,需要抛出异常,执行相应的操作,保证后续的工作依然能够顺利处理完
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("变量值必须小于等于 1"); } return true; } // 在 try 块 触发异常 try { checkNum(2); // 如果抛出异常,以下文本不会输出 echo '如果输出该内容,说明 $number 变量'; } // 捕获异常 catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?>
0x09 过滤器
过滤器其实可以看作是一个内置的参数验证函数,也可以自己实现。
filter_var()
- 通过一个指定的过滤器来过滤单一的变量filter_var_array()
- 通过相同的或不同的过滤器来过滤多个变量filter_input()
- 获取一个输入变量,并对它进行过滤filter_input_array()
- 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤
过滤器:https://www.runoob.com/php/php-ref-filter.html
0x0A JSON
php处理json数据有
string json_encode ( $value [, $options = 0 ] )
和mixed json_decode ($json_string [,$assoc = false [, $depth = 512 [, $options = 0 ]]])
两个函数
0x0B 命名空间
命名空间解决不同文件中可能函数、变量、类名命名重名导致的冲突,取别名
<?php namesapce mySpace; // coding... ?>
子命名空间:分层次定义
<?php namespace MyProject\Sub\Level; //声明分层次的单个命名空间 const CONNECT_OK = 1; class Connection { /* ... */ } function Connect() { /* ... */ } /* 创建: 常量 MyProject\Sub\Level\CONNECT_OK 类 MyProject\Sub\Level\Connection 函数 MyProject\Sub\Level\Connect */ ?>
命名空间的使用:限定、非限定和完全限定三种方式,导入命名空间使用
use
语句,同时可以指定别名as
,比如:use app\index\model\User as UserModel;
// file1.php <?php namespace Foo\Bar\subnamespace; const FOO = 1; //常量 function foo() { //函数 //coding... echo __NAMESPACE__; } class foo { //类 static function staticmethod() {} } ?> //file2.php <?php namespace Foo\Bar; include 'file1.php'; const FOO = 2; function foo() { //coding... echo __NAMESPACE__; } class foo { static function staticmethod() {} } /* 1.非限定名称 */ foo(); // 解析为函数 Foo\Bar\foo,输出:Foo\Bar foo::staticmethod(); // 解析为类 Foo\Bar\foo ,方法为 staticmethod echo FOO; // 解析为常量 Foo\Bar\FOO,输出2 /* 2.限定名称 */ subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo,输出Foo\Bar\subnamespace subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo, // 以及类的方法 staticmethod echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO /* 3.完全限定名称 */ \Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo \Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO // 注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \strlen() 或 \Exception 或 \INI_ALL。 ?>
More:https://www.runoob.com/php/php-namespace.html
0x0C 连接数据库
数据库作为存储信息和数据的重要软件,php连接数据库主要有mysqli和PDO两种方式,mysqli只能连接mysql数据库,pdo支持12种类型的数据库操作,属于php的扩展,默认安装了mysqli。
// mysqli连接数据库 <?php // 建立连接 mysqli_connect(host,username,password,dbname,port,socket); // 面向对象的方式 $conn = new mysqli('127.0.0.1', 'username', 'passwd', 'dbname'); //检测连接 if($conn->connect_error){ die('连接数据库失败:'.$conn->connect_error); } //...连接成功 // 执行sql语句 $result = $conn->query("SELECT * FROM users"); if($result->num_rows > 0){ while($row = $result->fetch_assoc()){ echo $row['uid'].$row['username']; } } else{ echo 'Nothing...'; } // 执行多条语句 $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Mary', 'Moe', 'mary@example.com');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Julie', 'Dooley', 'julie@example.com')"; $conn->multi_query($sql) // 关闭连接 $conn->close(); ?> //PDO方式 <?php try { $conn = new PDO("mysql:host='127.0.0.1';", 'username', 'passwd'); echo "连接成功"; } catch(PDOException $e) { echo $e->getMessage(); } ?> /*mysqli面向过程*/ <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // 创建连接 $conn = mysqli_connect($servername, $username, $password, $dbname); // Check connection if (!$conn) { die("连接失败: " . mysqli_connect_error()); } $sql = "SELECT id, firstname, lastname FROM MyGuests"; $result = mysqli_query($conn, $sql); if (mysqli_num_rows($result) > 0) { // 输出数据 while($row = mysqli_fetch_assoc($result)) { echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>"; } } else { echo "0 结果"; } mysqli_close($conn); ?>
0x0D 其他内容
还有很多的内容,比如Date,正则表达式,FTP,HTTP,XML等等的操作,不过这些内容基本都是翻看手册就好了,推荐国内比较快的网站:https://www.php.net
离线手册下载:《PHP7中文手册2018版》
0x0E 常用函数
整理部分常用函数,字符串的操作
函数 | 说明 |
---|---|
strlen($str) |
返回字符串的长度 |
strpos($str, $parm) |
成功返回匹配到字符串第一个字符的位置下标 |
addslashes($str) |
在字符串中有预定义字符前加上\ |
explode(',', $str) |
把字符串以, 为分隔符,分割为数组 |
implode(',', $arr) |
把一维数组组合成以, 分隔的字符串 |
trim($str) |
去除字符串两端的空格 |
md5($str) |
计算字符串的MD5散列 |
md5_file($file_path) |
计算对应路径文件的MD5散列 |
sha1() ,sha1_file() |
与md5() 类似 |
ord($char) |
返回字符对应的ASCII 码值 |
chr($num) |
返回ASCII 码数值对应的字符 |
printf($str, $param1, $param2) |
格式化输出 |
sprintf() |
与printf() 类似,返回值存储一个变量可赋值 |
htmlspecialchars($str) |
预定义的实体转化为字符 |
htmlspecialchars_decode($str) |
把字符串中预定义的字符转为HTML实体 |
str_rot13($str) |
将字母字符串ROT13编码,偏移13,编码解码函数相同 |
strstr() |
|
strcmp($str1, $str2) |
比较两个字符串,相等返回0 |
str_word_count(string,return,char) |
计算字符串中的单词数 |
strip_tags(string,allow) |
剥去字符串中的 HTML、XML 以及 PHP 的标签 |
strrev($str) |
字符串反转 |
strtolower($str) |
字符串字母转小写 |
strtoupper($str) |
字符串字母转大写 |
substr(string,start,length) |
字符串截取,编码问题可使用mb_substr() |
strtr(string,from,to) ,strtr(string,array) |
转换字符串中特定的字符。数组是key=keyword,val=替换字符 |
var_dump($param) |
调试输出详情 |
array_reverse($arr) |
数组反转 |
array_unique($arr) |
去除数组中重复的值 |
in_array ( $param, $arr[, TRUE ] ) |
数组中是否存在对应值,存在返回TRUE |
file_get_cotents($url) |
读取文件内容为文本字符串 |
file_put_contents($filepath) |
将内容写入文件 |
file_exists($filepath) |
文件存在否,返回bool |
0x0F 总结
学习巩固,不断学习,不断巩固,PHP7已经发布到市场好几年了,所以对于PHP7的应用还是非常成熟的,最近看许多基于PHP的项目大部分都用上PHP7版本了,大趋势已到,紧跟时代步伐,欢迎各位与小东交流学习,共同进步!
版权声明:《 [PHP]不得不学的PHP7 》为DYBOY原创文章,转载请注明出处!
最后编辑:2019-4-16 22:04:13
2019-05-01 21:35
2019-05-08 00:02
2019-05-01 00:06
2019-05-08 00:01
2019-04-22 09:53
2019-05-07 10:17