[PHP]不得不学的PHP7

PHP基础笔记整理,学习巩固PHP7,以前的应用主要是基于PHP5版本,以后的市场也偏向于逐渐成熟的PHP7,所以学习应用PHP7非常有必要,Hello PHP7!

不得不学的PHP7,图片来源百度

0x01 PHP简介

PHPHypertext 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中有requireinclude两种,它俩区别在于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版本了,大趋势已到,紧跟时代步伐,欢迎各位与小东交流学习,共同进步!

发表评论 / Comment

用心评论~

金玉良言 / Appraise
枫城永一LV 1
2019-05-01 21:35
东哥牛逼
头像
DYBOY站长已认证
2019-05-08 00:02
@枫城永一:一起学习进步!
青鸟飞翔LV 1
2019-05-01 00:06
超棒的笔记,mark!
头像
DYBOY站长已认证
2019-05-08 00:01
@青鸟飞翔:Mark!
思源LV 2
2019-04-22 09:53
文章介绍详细(~0~) php7也是大势所趋
头像
DYBOY站长已认证
2019-05-07 10:17
@思源:对啊~

Warning: Cannot modify header information - headers already sent by (output started at /www/wwwroot/blog.dyboy.cn/content/templates/dyblog/footer.php:56) in /www/wwwroot/blog.dyboy.cn/include/lib/view.php on line 23