• PHP —— 一份前端开发工程师够用的PHP知识点(持续更新)


    PHP —— 一份前端开发工程师够用的PHP知识点(持续更新)

    《工欲善其事,必先利其器》
    本文只是记录本小菜鸡在工作中遇到的知识点,欢迎大家随时补充!

    一、初识 PHP

    首先,PHP 它是什么?PHP 它又能做什么?

    • PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言;
    • PHP 脚本可以高效的在服务器上执行;
    • PHP 可免费下载使用;
    • PHP 文件可包含文本、HTMLJavaScript 代码和 PHP 代码;
    • PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器;
    • PHP 文件的默认文件扩展名是 “.php”;
    • PHP 可以使用渲染模板,生成动态页面内容;
    • PHP 可以创建、打开、读取、写入、关闭服务器上的文件;
    • PHP 可以收集表单数据;
    • PHP 可以发送和接收 cookies
    • PHP 可以添加、删除、修改您的数据库中的数据;
    • PHP 可以限制用户访问您的网站上的一些页面;
    • PHP 可以加密数据。

    二、初识 MVC

    不同于前端所识的 MVVMMVC 全名是 Model View Controller,是模型(model)- 视图(view)- 控制器(controller)的缩写,这是一种使用“模型-视图-控制器”设计创建Web应用程序的模式,同时提供了对HTMLCSSJavaScript的完全控制,它是一种软件设计典范。

    • Model (模型)是应用程序中用于处理应用程序数据逻辑的部分,通常体现在负责对数据库进行操作的部分;
    • View (视图)是应用程序中处理数据显示的部分,通常体现在页面渲染的数据中,视图是依据模型(model)的数据进行渲染的;
    • Controller (控制器)是应用程序中处理用户交互的部分,通常体现在负责从视图读取数据,控制用户输入,并向模型发送数据。

    MVC模型
    那么这种编程模式有什么优点?

    • MVC 使用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间;
    • MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易;
    • MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。

    三、初识内存

    PHP 的内存拥有四个分区。

    1.栈区

    程序可以操作的部分,在这里,PHP 不存储数据,只运行程序代码。所拥有的空间小但运行速度快,避免存在死循环,需要及时释放。

    2.代码段区

    这里不存在任何的操作,只储存你的 PHP 程序代码。所拥有的空间小,避免存在多个程序代码,需要及时释放。

    3.数据段区

    存储一些 PHP 普通数据类型的数据,这里分为全局区和静态区。拥有的空间大且效率高。

    4.堆区

    存储复杂的 PHP 数据类型,空间大但是效率低。

    四、安装和使用

    如果你要在服务端使用 PHP:

    1. 找一台支持 PHP 的主机,你就能愉快的写代码,服务器是自动解析这些 PHP 文件的;
    2. 如果服务器不支持 PHP ,那么需要安装 web 服务器(apache、nginx),再安装 PHP

    如果你要在本地电脑使用 PHP:

    1. 建议安装 phpstudy,它是一个环境集成软件,包含了 apache, mysql, nginx, ftp;
    2. 把你的 PHP 代码挂载到 phpstudy 网站域名对应的文件夹上,开启之后就可以通过浏览器本地浏览调试。

    五、语法

    分两种情况,第一种情况是在原生 PHP 文件里面书写:

    PHP 脚本在服务器上执行,然后将纯 HTML 结果返回给浏览器,所以 PHP 脚本可以放在文档中的任何位置。

    
    	// PHP代码
     ?>
    
    • 1
    • 2
    • 3

    原生的 PHP 文件通常包含了 HTML 标签和一些 PHP 脚本代码,例如我们输出一个 Hello World:

    <!DOCTYPE html>
    <html>
    <body>
    
    <h1>My first PHP page</h1>
    
    <?php
    echo "Hello World!";
    ?>  
    
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    第二种情况是在 PHP 框架的模板文件里面的书写语法:

    由于 PHP 的框架一般都遵循上面提及的 MVC 设计典范(例如 thinkphp 框架),有些时候我们需要在 HTML 文件里面输出 PHP 代码,则需要用下面这种语法书写:

    {php}
    	// PHP代码
    {/php}
    
    • 1
    • 2
    • 3

    例如给一个 HTML 标签输出的文本做判断,这时候我们可以这样写:

    {foreach name="list" item="vo" key="k" }
      <tr >
          <td>
              {switch name="vo.gender" }
    	          {case value="0"}未知{/case}
    	          {case value="1"}男{/case}
    	          {case value="2"}女{/case}
              {/switch}
          td>
      tr>
    {/foreach}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    六、变量

    JavaScript 一样,PHP 是弱类型语言,这意味着某些变量输出时可能会跟首次定义的数据类型不一样,且不会报错:

    
    $a = 8;
    $b = "123";
    $a = $b;
    echo $a; // 输出 “123”
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    JavaScript 一样,PHP 的变量,可以事先声明但不赋值,也可以即时声明,即刻使用。上述例子中,PHP 的变量都需要从一个 $ 符号开始,后面跟着变量的名称,其命名规则与 JavaScript 基本一致。

    • 变量以 $ 符号开始,后面跟着变量的名称;
    • 变量名必须以字母或者下划线字符开始;
    • 变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ );
    • 变量名不能包含空格;
    • 变量名是区分大小写的($y 和 $Y 是两个不同的变量)。

    七、数据类型

    第一种,简单数据类型:

    • 整型(int / integer):系统分配4个字节存储,表示整数类型;
    • 浮点型(float / double):系统分配8个字节存储,表示小数或者整型存储不下的整数;
    • 字符串类型(string):系统根据实际长度分配,表示字符串;
    • 布尔类型(bool / boolean):只有两个值。

    第二种,复合数据类型:

    • 对象类型(object):存放对象;
    • 数组类型(array):存放多个数据,可以是其他类型。

    第三种,特殊数据类型:

    • 资源类型(resource):存放资源数据,例如数据库,文件等数据;
    • 空类型(NULL):只有一个值 NULL,且不可被运算。

    八、作用域

    PHP 有四种不同的变量作用域,分别是:

    • local(局部作用域)
    • global(全局作用域)
    • static(静态作用域)
    • parameter(参数作用域)

    局部作用域和全局作用域互不相干扰,不可互相访问。如果要在局部作用域中访问一个全局变量,则需要 global 关键字:

     
    $a = 123;
    function test() {
    	global $a;
    	echo $a;
    }
    test();
    // 输出 123
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    另外,PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中,index 保存变量的名称,这个数组可以用来更新全局变量:

    
    $a = 123;
    function test() {
    	$GLOBALS['a'] = $GLOBALS['a'] + 1;
    }
    test();
    echo $a;
    // 输出 124
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    为什么叫静态作用域?因为当一个函数完成时,它的所有变量都会被删除。如果你希望某个局部变量不要删除,就用 static 关键字进行声明局部变量,这个功能类似于 JavaScript 的闭包:

    
    function test() {
    	static $a = 0;
    	echo $a;
    	$a++;
    }
    test();
    test();
    test();
    // 依次输出:0,1,2 而不是每次都输出 0
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    需要注意的是,它依然是一个局部变量,外部访问不到。

    九、输出

    • echo(),输出一个或多个字符串;
    • print(),只允许输出一个字符串,返回值总为1;
    • var_dump($a),输出一个变量的数据类型和值;
    • settype($a, 'int'),改变一个变量的数据类型。

    十、类型比较

    JavaScript 一致,弱类型比较包含松散比较和严格比较:

    • 松散比较:使用两个等号比较,只比较值,不比较类型;
    • 严格比较:使用三个等号比较,除了比较值,还比较数据类型。

    十一、常量

    • 全局常量(define(name, value, case_insensitvie)):一般大写,第三个值可选是否对常量的大小写敏感,默认为false敏感;
    • Class常量(const constant = value):constant 为常量名,一般为大写。
    
    Class Person {
    	const NAME = "张三";
    	public function myName() {
    		echo "我是".self::NAME;
    	}
    }
    echo Person::NAME; // 输出张三
    $p1 = new Person();
    $p1 -> myName(); // 输出 我是张三
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    十二、魔术常量

    JavaScript 的 PI 常量一样,PHP 也既定了一些预定义常量。你可以理解为全局常量。

    • LINE

    输出文件中,当前的行号:

    
    echo '这是第' . __LINE__ . '行';
    ?>
    
    • 1
    • 2
    • 3
    • FILE

    输出当前文件所在位置的,完整文件名,如果在被包含文件中使用,则返回被包含的文件名:

    
    echo '该文件位于'. __FILE__ . '文件中';
    ?>
    
    • 1
    • 2
    • 3
    • DIR

    输出当前文件所在的,目录,如果在被包含文件中使用,则返回被包含文件所在的,目录名称:

    
    echo '该文件位于'. __DIR__ . '目录中';
    ?>
    
    • 1
    • 2
    • 3
    • FUNCTION

    输出函数被定义时的,名称:

    
    function test() {
    	echo '函数名为'. __FUNCTION__ ;
    }
    test();
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • CLASS

    输出该类被定义时的,名称:

    
    class test {
        function _print() {
            echo '类名为:'  . __CLASS__ . "
    "
    ; echo '函数名为:' . __FUNCTION__ ; // 如果有这个,则输出该类声明的作用域下对应的,函数名称 } } $t = new test(); // test $t->_print(); // _print ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • TRAIT

    用于声明一个,可以被并入到其他父类的,子类:

    
    class Base {
    	public function sayHello() {
    		echo 'Hello ';
    	}
    }
    trait sayWorld {
    	public function sayHello() {
    		parent::sayHello(); // 调用父类的方法
    		echo 'World';
    	}
    }
    class MyHelloWorld extends Base {
    	use sayWorld;
    }
    $o = new MyHelloWorld();
    $o -> sayHello(); // 输出 Hello World
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    注意:从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。

    • METHOD

    输出一个类中的,方法名称:

    
    function _print() {}
    class test {
        function _print() {
            echo '类名为:'  . __CLASS__ . "
    "
    ; echo '函数名为' . __METHOD__ ; } } $t = new test(); $t->_print(); // 输出 test::_print ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • NAMESPACE

    输出当前命名空间的,名称:

    
    namespace MyProject;
     
    echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MyProject"
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    十三、超级全局变量

    跟上面的常量不同,也与 JavaScript 的 Window 变量类似,PHP 既定了一些全局变量。

    • $GLOBALS

    是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

     
    $x = 75; 
    $y = 25;
     
    function addition() 
    { 
        $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 
    }
     
    addition(); 
    echo $z;  // 输出 100
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • $_SERVER

    是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。

    
    echo $_SERVER['PHP_SELF']; // /try/demo_source/demo_global_server.php
    echo "
    "
    ; echo $_SERVER['SERVER_NAME']; // www.csdn.net echo "
    "
    ; echo $_SERVER['HTTP_HOST']; // www.csdn.net echo "
    "
    ; echo $_SERVER['HTTP_USER_AGENT']; // Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36 echo "
    "
    ; echo $_SERVER['SCRIPT_NAME']; // /try/demo_source/demo_global_server.php ?>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • $_REQUEST

    用于收集HTML表单提交的数据。

    <html>
    <body>
     
    <form method="post" action="$_SERVER['PHP_SELF'];?>">
    Name: <input type="text" name="fname">
    <input type="submit">
    </form>
     
    <?php 
    $name = $_REQUEST['fname']; 
    echo $name; 
    ?>
     
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • $_POST

    被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method=“post”。也可以用来收集 AJAX 的 post 数据。

    <html>
    <body>
     
    <form method="post" action="$_SERVER['PHP_SELF'];?>">
    Name: <input type="text" name="fname">
    <input type="submit">
    </form>
     
    <?php 
    $name = $_POST['fname']; 
    echo $name; 
    ?>
     
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • $_GET

    同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method=“get”。$_GET 也可以收集URL中发送的数据。

    <html>
    <body>
    
    <a href="test_get.php?subject=PHP&web=csdn.net">Test $GET</a>
    
    </body>
    </html>
    
    <?php 
    echo "Study " . $_GET['subject'] . " @ " . $_GET['web'];
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • $_FILES
      待更新…

    • $_ENV
      待更新…

    • $_COOKIE

    cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。

    
    setcookie("user", "csdn", time()+3600);
    ?>
    
    <html>
    .....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    需要注意的是,setcookie 函数必须要置于 HTML 标签之前。

    取回 cookie 和删除 cookie:

    
    // 输出 cookie 值
    echo $_COOKIE["user"];
    
    // 查看所有 cookie
    print_r($_COOKIE);
    ?>
    
    // 设置 cookie 过期时间为过去 1 小时,即可删除
    setcookie("user", "", time()-3600);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • $_SESSION

    PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。它常常被用来做计数器。

    
    session_start();
     
    if(isset($_SESSION['views']))
    {
        $_SESSION['views']=$_SESSION['views']+1;
    }
    else
    {
        $_SESSION['views']=1;
    }
    echo "浏览量:". $_SESSION['views'];
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    关于销毁 session 的方法:

    
    session_start();
    if(isset($_SESSION['views']))
    {
        unset($_SESSION['views']); // unset() 函数用于释放指定的 session 变量
    }
    
    session_destroy(); // 该函数彻底销毁 session
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    十四、数组

    声明方式:

    
    $car = array("Volvo", "Audi", "Benz");
    $cars = ["Volvo", "Bmw", "Posche", "Ferarri"];
    ?>
    
    • 1
    • 2
    • 3
    • 4

    获取数组长度,跟 JavaScript 不一样,不是数组的内置属性,需要手动获取:

    
    $carLength = count($car);
    echo $carLength; // 输出 3
    ?>
    
    • 1
    • 2
    • 3
    • 4

    遍历数组,在确定数组不为空的情况下,可以使用foreach,否则使用for:

    
    for($x=0;$x<$countLength;$x++) {
    	echo $car[$x];
    }
    
    foreach($cars as $k => $v) {
    	echo $cars[$k];
    	// $k 是下标,$v 是每一项
    }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    关联数组,就是为数组的每一个值指定键名:

    
    $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
    echo "Peter is " . $age['Peter'] . " years old.";
    ?>
    
    • 1
    • 2
    • 3
    • 4

    数组的排序,有多种排序方法:

    • sort() - 对数组进行升序排列
    • rsort() - 对数组进行降序排列
    • asort() - 根据关联数组的值,对数组进行升序排列
    • ksort() - 根据关联数组的键,对数组进行升序排列
    • arsort() - 根据关联数组的值,对数组进行降序排列
    • krsort() - 根据关联数组的键,对数组进行降序排列

    十五、JSON

    • json_encode,将 PHP 变量转为 JSON 格式;
    • json_decode,对 JSON 格式的数据进行解码,转为 PHP 变量;
    • json_last_error,返回最后发生的错误。

    十六、命名空间

    命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。语法格式如下;

      
    // 定义代码在 'MyProject' 命名空间中  
    namespace MyProject;  
     
    // ... 代码 ... 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果有多个命名空间存在同一文件下,当然这是极不建议的行为,就使用大括号分隔开:

    
    namespace MyProject {
        const CONNECT_OK = 1;
        class Connection { /* ... */ }
        function connect() { /* ... */  }
    }
    
    namespace AnotherProject {
        const CONNECT_OK = 1;
        class Connection { /* ... */ }
        function connect() { /* ... */  }
    }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    命名空间一般用来解决以下两类问题:

    • 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
    • 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

    十七、面向对象(Class)

    太多了,不想写,看 文档 吧。平时如果用框架经常会用得到,很少有人写原生 PHP 了,所以最好还是看一下。

    十八、表单

    我们要非常清楚的认识到,一旦前端页面提交数据,与后端代码进行交互,这是唯一与后端代码进行互动的点。所以在安全性上我们要多加防范。

    在获取 GET 请求数据时,由于 GET 是明文传输,所以要通过一些手段进行优化:

    由于 PHP 代码的 $_SERVER[‘PHP_SELF’] 这个字段,非常容易被黑客利用,所以,在获取 GET 请求数据的时候,我们可以通过 htmlspecialcharts() ,对代码进行保护:

    ?php
    $q = isset($_GET['q'])? htmlspecialchars($_GET['q']) : '';
    if($q) {
    	......
    }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 利用 trim() 函数去除用户输入数据中不必要的字符,例如空格或者tap换行符等;
    • 利用 stripslasher() 函数去除数据中的反斜杠;
    • 使用 empty() 函数检查数据是否为空;
    • 使用 preg_match() 进行一些正则表达式。

    十九、总结

    至此,原生 PHP,个人认为的,前端需要了解的知识,就这么多了。至于遇见一些没看过的 API ,就通过百度去查询吧。
    很多东西还是跟 JavaScript 很相似的,大家需要多多思考,举一反三。
    感谢你的阅读。

  • 相关阅读:
    Godot 4.0 加载为占位符(InstancePlaceholder)的用法和特点
    leetcode/链表排序
    探索Web3:去中心化的互联网新时代
    Python版本的温湿度+Nokia5110 display(SPI)
    论文研读1——对抗样本(Adversarial Example)综述
    Django建立mysql数据库,和使用navicat连接mysql数据库
    Vue 简单的语法
    TypeScript – Pick,Partial,ReturnType类型操作
    使用MATLAB对语音信号进行采集以及读写的方法
    安装内核切换内核
  • 原文地址:https://blog.csdn.net/LizequaNNN/article/details/126071852