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版本了,大趋势已到,紧跟时代步伐,欢迎各位与小东交流学习,共同几步!
欢迎大家直接收藏关注我的个人博客,也是原文地址:https://blog.dyboy.cn/program/124.html