IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 0719 NOTE -> 正文阅读

[PHP知识库]0719 NOTE

0719 NOTE

1.eventLoop

事件循环 的概念非常简单。它是一个在 JavaScript 引擎等待任务,执行任务和进入休眠状态等待更多任务这几个状态之间转换的无限循环。

引擎的一般算法:

  1. 当有任务时:

    从最先进入的任务开始执行。

  2. 休眠直到出现任务,然后转到第 1 步。

当我们浏览一个网页时就是上述这种形式。JavaScript 引擎大多数时候不执行任何操作,它仅在脚本/处理程序/事件激活时执行。

任务示例:

  • 当外部脚本 <script src="..."> 加载完成时,任务就是执行它。
  • 当用户移动鼠标时,任务就是派生出 mousemove 事件和执行处理程序。
  • 当安排的(scheduled)setTimeout 时间到达时,任务就是执行其回调。

设置任务 —— 引擎处理它们 —— 然后等待更多任务(即休眠,几乎不消耗 CPU 资源)。

一个任务到来时,引擎可能正处于繁忙状态,那么这个任务就会被排入队列。

多个任务组成了一个队列,即所谓的“宏任务队列”

在这里插入图片描述

例如,当引擎正在忙于执行一段 script 时,用户可能会移动鼠标而产生 mousemove 事件,setTimeout 或许也刚好到期,以及其他任务,这些任务组成了一个队列,如上图所示。

队列中的任务基于“先进先出”的原则执行。当浏览器引擎执行完 script 后,它会处理 mousemove 事件,然后处理 setTimeout 处理程序,依此类推。

两个细节:

  1. 引擎执行任务时永远不会进行渲染(render)。如果任务执行需要很长一段时间也没关系。仅在任务完成后才会绘制对 DOM 的更改。
  2. 如果一项任务执行花费的时间过长,浏览器将无法执行其他任务,例如处理用户事件。因此,在一定时间后,浏览器会抛出一个如“页面未响应”之类的警报,建议你终止这个任务。这种情况常发生在有大量复杂的计算或导致死循环的程序错误时。

微任务队列(Microtask queue)

异步任务需要适当的管理。为此,ECMA 标准规定了一个内部队列 PromiseJobs,通常被称为“微任务队列(microtask queue)”(ES8 术语)。

规范 中所述:

  • 队列(queue)是先进先出的:首先进入队列的任务会首先运行。
  • 只有在 JavaScript 引擎中没有其它任务在运行时,才开始执行任务队列中的任务。

简单地说,当一个 promise 准备就绪时,它的 .then/catch/finally 处理程序(handler)就会被放入队列中:但是它们不会立即被执行。当 JavaScript 引擎执行完当前的代码,它会从队列中获取任务并执行它。

微任务 Promise async await

每个宏任务之后,引擎会立即执行微任务队列中的所有任务,然后再执行其他的宏任务,或渲染,或进行其他任何操作。

宏任务 setTimeout setInterval requestAnimationFrame

宏任务执行时会将当前任务放在下一个新建任务列的最前面执行

微任务会放在当前任务列的最下面执行

更详细的事件循环算法(尽管与 规范 相比仍然是简化过的):

  1. 宏任务 队列(例如 “script”)中出队(dequeue)并执行最早的任务。
  2. 执行所有微任务
    • 当微任务队列非空时:
      • 出队(dequeue)并执行最早的微任务。
  3. 执行渲染,如果有。
  4. 如果宏任务队列为空,则休眠直到出现宏任务。
  5. 转到步骤 1。

安排(schedule)一个新的 宏任务

  • 使用零延迟的 setTimeout(f)

它可被用于将繁重的计算任务拆分成多个部分,以使浏览器能够对用户事件作出反应,并在任务的各部分之间显示任务进度。

此外,也被用于在事件处理程序中,将一个行为(action)安排(schedule)在事件被完全处理(冒泡完成)后。

安排一个新的 微任务

  • 使用 queueMicrotask(f)
  • promise 处理程序也会通过微任务队列。

在微任务之间没有 UI 或网络事件的处理:它们一个立即接一个地执行。

所以,我们可以使用 queueMicrotask 来在保持环境状态一致的情况下,异步地执行一个函数。

Web Workers

对于不应该阻塞事件循环的耗时长的繁重计算任务,我们可以使用 Web Workers

这是在另一个并行线程中运行代码的方式。

Web Workers 可以与主线程交换消息,但是它们具有自己的变量和事件循环。

Web Workers 没有访问 DOM 的权限,因此,它们对于同时使用多个 CPU 内核的计算非常有用。

 console.log("a");
        setTimeout(function(){
            console.log("b");
        })
        new Promise(function(resolve,reject){
            resolve();
            console.log("d");
        }).then(function(){
            console.log("c");
        })
        console.log("e");
// a d e c b 
//先执行同步,微任务,宏任务
//打印a→将打印b放在新建任务列最前面→打印d→将打印c放在当前任务列最下面→打印e→打印c→打印b
Promise.resolve().then(function(){
            setTimeout(function(){
                console.log("b");
            })
        })
        
        setTimeout(function(){
            Promise.resolve().then(function(){
                console.log("a");
            })
        })
//a b
//微任务宏任务打印b放在当前任务列最下面→宏任务微任务打印a放在新建任务列最前面→宏任务打印b放在新建任务列最前面→微任务打印a放在当前任务列最下面→打印a→打印b
console.log(1); //任务列a,打印第一个
    new Promise(function (res, rej) {
      console.log(2); //任务列a,打印第二个
      res();
    })
      .then(function () { //任务列a尾部,a1
        console.log(3); //任务列a,第五个,打印
        Promise.resolve().then(function () {  //任务列a,a3
          console.log(5); //任务列a,第七个,打印
          setTimeout(function () {  //任务列f
            console.log(6); //任务列f,打印,第一个
            Promise.resolve().then(function () {  
              console.log(7); //任务列f,第二个,打印,任务列f结束
            });
            setTimeout(function () {  //任务列h
              console.log(8); //任务列h,打印,第一个,任务列h结束
            }, 0);
          }, 0);
        });
      })
      .then(function () { //任务列a,a4
          console.log(4);//任务列a,第八个,打印,任务列a结束
        });
    setTimeout(function () {  //任务列b
      console.log(9); //任务列b,第一个,打印
      new Promise(function (res) {
        res();
        console.log(10);  //任务列b,第二个,打印
      }).then(function () { //任务列b,b1
        console.log(11);  //任务列b,第三个,打印,任务列b结束
      });
    });
    Promise.resolve().then(function () {  //任务列a,a2
      setTimeout(function () {  //任务列e
        Promise.resolve().then(function () {
          console.log(12);  //任务列,打印,第二个,任务列e结束
        });
        console.log(13);  //任务列e,第一个,打印
      }, 0);
    });
    setTimeout(function () {  //任务列c
      setTimeout(function () {  //任务列g
        setTimeout(function () {  //任务列i
          Promise.resolve().then(function () {//任务列i,i1
            console.log(14);  //任务列i,打印,第二个,任务列i结束
          });
          console.log(15);//任务列i,打印,第一个
        }, 0);
        console.log(16);//任务列g,打印,第一个,任务列g结束
      }, 0);
      console.log(17);  //任务列c,第一个,打印
    }, 0);
    console.log(18);  //任务列a,第三个,打印
    new Promise(function (res) {
      console.log(19);  //任务列a,第四个,打印
      setTimeout(function () {  //任务列d
        console.log(20);  //任务列d,第一个,打印,任务列d结束
      }, 0);
    });

练习


          console.log(1);//任务列a,打印,第一个
          document.addEventListener("14", function () {
            console.log(14);//任务列a,第七个,任务列a结束
          });
          new Promise(function (resolve) {
            resolve();
            console.log(2);//任务列a,打印,第二个
            setTimeout(function () { //任务列b
              console.log(3);//任务列b,打印,第一个,任务列b结束
            }, 0);
            Promise.resolve().then(function () {//任务列a尾部,a1
              console.log(4);//任务列a,打印,第四个
              setTimeout(function () { //任务列d
                console.log(5); //任务列d,打印,第一个,任务列d结束
              }, 0);
              setTimeout(function () {//任务列e
                (async function () {//返回promise对象,等待三个队列,任务列e尾部,e2
                  console.log(6); //任务列e,打印,第一个
                  return function () {
                    console.log(7);//返回,作为参数fn传入then方法
                  };
                })().then(function (fn) {//任务列e尾部,e1,
                  console.log(8);//任务列e,打印,第二个
                  fn();//任务列e,打印,第三个,任务列e结束
                });
              }, 0);
            });
            new Promise(function (resolve) {
              console.log(9);//任务列a,打印,第三个
              resolve();
            }).then(function () {//任务列a尾部,a2
              new Promise(function (resolve, reject) {
                console.log(10);//任务列a,打印,第五个
                reject();
              })
                .then(function () { //不符合条件,无法打印
                  setTimeout(function () {
                    console.log(11);
                  }, 0);
                  console.log(12);
                })
                .catch(function () {
                  console.log(13); //任务列a,打印,第六个
                  var evt = new Event("14");
                  document.dispatchEvent(evt);
                });
            });
          });
          setTimeout(function () {//任务列c
            console.log(15);//任务列c,打印,第一个
            Promise.resolve().then(function () {
              console.log(16); //任务列c,打印,第二个
            });
          }, 0);

2.Cookie和Web Storage

Cookie

Cookie 是直接存储在浏览器中的一小串数据。它们是 HTTP 协议的一部分,由 RFC 6265 规范定义。

Cookie 通常是由 Web 服务器使用响应 Set-Cookie HTTP-header 设置的。然后浏览器使用 Cookie HTTP-header 将它们自动添加到(几乎)每个对相同域的请求中。

Cookie以文件的形式存储在客户端计算机上。当用户访问了某个网站,可以通过Cookie向访问者电脑上存储数据。

最常见的用处之一就是身份验证:

  1. 登录后,服务器在响应中使用 Set-Cookie HTTP-header 来设置具有唯一“会话标识符(session identifier)”的 cookie。
  2. 下次如果请求是由相同域发起的,浏览器会使用 Cookie HTTP-header 通过网络发送 cookie。
  3. 所以服务器知道是谁发起了请求。

我们还可以使用 document.cookie 属性从浏览器访问 cookie。

 document.cookie="name=zhangsan"
        document.cookie="age=30";
        console.log(document.cookie);//存在本地系统的某个默认文件夹中隐藏加密

// cookie是按照域名来存储的,不同的域名或者端口号,cookie是不共通的

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

MD5算法的原理可简要的叙述为:MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值

总体流程如下图所示,每次的运算都由前一轮的128位结果值和当前的512bit值进行运算

在这里插入图片描述

Cookie特性:

cookie必须运行在服务器的环境下(开启服务器)
cookie的容量: 5kb
cookie存储的数据类型: 字符串
cookie存放以域名形式区分的。
一个域名下存放的cookie的个数是有限制的,不同浏览器存放的个数不一样,cookie能存储的条目数为:50条。
如果想长时间存放一个cookie,同时需要设置一个过期时间
Cookie默认是临时存储的,当浏览器关闭时,自动销毁

Cookie缺点

cookie可能被禁用。当用户非常注重个人隐私保护时,他很可能禁用浏览器的cookie功能;
cookie是与浏览器相关的。这意味着即使访问的是同一个页面,不同浏览器之间所保存的cookie也是不能互相访问的;
cookie可能被删除。因为每个cookie都是硬盘上的一个文件,因此很有可能被用户删除;
cookie安全性不够高。所有的cookie都是以纯文本的形式记录于文件中,因此如果要保存用户名密码等信息时,最好事先经过加密处理。

练习

//重新写一个函数 setCookie(obj,time)  可以完成对于对象中每个数据的cookie存储,递归写
//重新写一个函数,getCookie()  获取Cookie中的所有内容,转换为一个对象,返回
function setCookie(obj, time) {
            let date = new Date();
            date.setHours(time);//Cookie过期时间
            for (let prop in obj) {
                if (obj[prop].constructor === Object && obj[prop]) 
                    return setCookie(obj[prop], time);
                document.cookie = prop + "=" + obj[prop] + ";expires=" +date.toUTCString();
            }
        }
 /*
 function getCookie(str) {
            let obj = {};
           str.split(";").forEach((item)=>{
               let arr = item.split("=");
               obj[arr[0]] = arr[1];
           })
           return obj;
        }
*/
 function getCookie(str) {
            let obj = {};
            let arr = [];
            let arr1 = [];
            let arr2 = [];
            let x;
            arr = str.split("=");
            arr.shift();
            x = arr.pop();
            arr.forEach((item)=>{
               arr1.push(item.match(/.+(?<=[\;])/g))
           });
           arr1.forEach((item)=>{
                arr2.push(item[0].split(";")[0])
           })
           arr2.push(x);
            str.split(";").forEach((item,index)=>{
                obj[(item.match(/.*?(?<=[\=])/g)[0]).slice(0,-1)] = arr2[index];
            })
           return obj;
        }
//代码过于垃圾,暂时能力不足,能力达标再来修改

Web Storage

HTML5 的 Web Storage 可以让 Web 页面在客户端浏览器中以键值对的形式在本地存储数据。
这些数据可以是临时的(浏览器一关就自动删除),或者是长期存在的(无论多少天之后打开网站,仍然可以访问这些数据)

cookie会在访问站点,或者提交表单时,跳转页面时,如果是同域时,会自动携带cookie往返于浏览器与服务器之间

? 浏览器会自动将cookie发送到服务器,而且服务器也可以主动向用户的cookie写入内容

webstorage 不能主动发送内容给服务器

webStorage分类:

? localStorage 本地长期存储 关闭浏览器,仍旧存在,直到销毁

? sessionStorage 本地临时存储 关闭浏览器销毁,并且同源同域的文件在不同窗口中打开,不共享数据

已经有了 cookie。为什么还要其他存储对象呢?

  • 与 cookie 不同,Web 存储对象不会随每个请求被发送到服务器。因此,我们可以保存更多数据。大多数浏览器都允许保存至少 2MB 的数据(或更多),并且具有用于配置数据的设置。
  • 还有一点和 cookie 不同,服务器无法通过 HTTP header 操纵存储对象。一切都是在 JavaScript 中完成的。
  • 存储绑定到源(域/协议/端口三者)。也就是说,不同协议或子域对应不同的存储对象,它们之间无法访问彼此数据。
  • cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递。而sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。cookie数据还有路径(path)的概念,可以限制cookie只属于某个路径下。
  • 存储大小限制也不同,cookie数据不能超过4k,同时因为每次http请求都会携带cookie,所以cookie只适合保存很小的数据,如会话标识。sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。
  • 数据有效期不同,sessionStorage:仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持;localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie只在设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭。
  • 作用域不同,sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;localStorage 在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的。
  • Web Storage 支持事件通知机制,可以将数据更新的通知发送给监听者。
  • Web Storage 的 api 接口使用更方便。

两个存储对象都提供相同的方法和属性:

  • setItem(key, value) —— 存储键/值对。
  • getItem(key) —— 按照键获取值。
  • removeItem(key) —— 删除键及其对应的值。
  • clear() —— 删除所有数据。
  • key(index) —— 获取该索引下的键名。
  • length —— 存储的内容的长度。
localStorage.a=3;
sessionStorage.a=3;

localStorage.name="xietian";
localStorage.setItem("name","xietian");

localStorage.removeItem("name")
localStorage.clear();
console.log(localStorage);
//key: "cc"  localstorage 修改的key
//newValue: "20"  新值
//oldValue: null  旧值
  var ul=document.querySelector("ul");
            var list=JSON.parse(localStorage.list ? localStorage.list : localStorage.list=JSON.stringify([]));
            window.addEventListener("storage",storageHandler);
            function storageHandler(e){
                console.log(e);
                list=JSON.parse(localStorage.list);
                ul.innerHTML=list.reduce((value,item)=>{
                    return value+`<li>${item}</li>`
                },"")
            }
 document.addEventListener("click",clickHandler);
         function clickHandler(e){
            a++;
            var list=JSON.parse(localStorage.list);
            list.push(a);
            localStorage.list=JSON.stringify(list);
         }
//同域下面localstorage可以通过对一个页面的操作来改变另一个页面

3.XSS攻击

XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
能被XSS攻击需要以下两点:
1、需要向web页面注入恶意代码;
2、这些恶意代码能够被浏览器成功的执行。

预防:写入文件时,不要使用innerHTML写入,发送前需要转换正则验证script标签或者JavaScript超链接,替换并且发送服务

点击劫持攻击

4.todoList

/*css*/
body {
            margin: 0;
            padding: 0;
            font-size: 16px;
            background: #CDCDCD;
        }

        header {
            height: 50px;
            background: #333;
            background: rgba(47, 47, 47, 0.98);
        }

        section {
            margin: 0 auto;
        }

        label {
            float: left;
            width: 100px;
            line-height: 50px;
            color: #DDD;
            font-size: 24px;
            cursor: pointer;
            font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        }

        header input {
            float: right;
            width: 60%;
            height: 24px;
            margin-top: 12px;
            text-indent: 10px;
            border-radius: 5px;
            box-shadow: 0 1px 0 rgba(255, 255, 255, 0.24), 0 1px 6px rgba(0, 0, 0, 0.45) inset;
            border: none
        }

        input:focus {
            outline-width: 0
        }

        h2 {
            position: relative;
        }

        span {
            position: absolute;
            top: 2px;
            right: 5px;
            display: inline-block;
            padding: 0 5px;
            height: 20px;
            border-radius: 20px;
            background: #E6E6FA;
            line-height: 22px;
            text-align: center;
            color: #666;
            font-size: 14px;
        }

        ol,
        ul {
            padding: 0;
            list-style: none;
        }

        li input {
            position: absolute;
            top: 2px;
            left: 10px;
            width: 22px;
            height: 22px;
            cursor: pointer;
        }

        p {
            margin: 0;
        }

        li p input {
            top: 3px;
            left: 40px;
            width: 70%;
            height: 20px;
            line-height: 14px;
            text-indent: 5px;
            font-size: 14px;
        }

        li {
            height: 32px;
            line-height: 32px;
            background: #fff;
            position: relative;
            margin-bottom: 10px;
            padding: 0 45px;
            border-radius: 3px;
            border-left: 5px solid #629A9C;
            box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07);
        }

        ol li {
            cursor: move;
        }

        ul li {
            border-left: 5px solid #999;
            opacity: 0.5;
        }

        li a {
            position: absolute;
            top: 2px;
            right: 5px;
            display: inline-block;
            width: 14px;
            height: 12px;
            border-radius: 14px;
            border: 6px double #FFF;
            background: #CCC;
            line-height: 14px;
            text-align: center;
            color: #FFF;
            font-weight: bold;
            font-size: 14px;
            cursor: pointer;
        }

        footer {
            color: #666;
            font-size: 14px;
            text-align: center;
        }

        footer a {
            color: #666;
            text-decoration: none;
            color: #999;
        }

        @media screen and (max-device-width: 620px) {
            section {
                width: 96%;
                padding: 0 2%;
            }
        }

        @media screen and (min-width: 620px) {
            section {
                width: 600px;
                padding: 0 10px;
            }
        }
 <header>
        <section>
            <form id="form">
                <label for="title">ToDoList</label>
                <input type="text" id="title" name="title" placeholder="添加ToDo" required="required"
                    autocomplete="off" />
            </form>
        </section>
    </header>
    <section>
        <h2 class="save">正在进行 <span id="todocount">0</span></h2>
        <ol id="todolist" class="demo-box">
        </ol>
        <h2>已经完成 <span id="donecount">0</span></h2>
        <ul id="donelist">
        </ul>
    </section>
    <footer>
        Copyright &copy; 2014 todolist.cn <a class="clear">clear</a>
    </footer>
  var form,donelist,todolist,todocount,donecount,clear;
        var list={
            todo:[],
            done:[]
        }
        init()
        function init(){
    		 // localStorage.clear();
            form=document.querySelector("form");
            donelist=document.querySelector("#donelist");
            todolist=document.querySelector("#todolist");
            todocount=document.querySelector("#todocount");
            donecount=document.querySelector("#donecount");
            clear=document.querySelector(".clear");
            form.addEventListener("submit",submitHandler);
            donelist.addEventListener("click",clickHandler);
            todolist.addEventListener("click",clickHandler);
            clear.addEventListener("click",clearHandler);
            window.addEventListener("popstate",popHandler);
            if(localStorage.list){
                list=JSON.parse(localStorage.list);
                updateList();
            }
        }

        function submitHandler(e){
            e.preventDefault();
            if(form.lastElementChild.value.trim().length===0) return;
            list.todo.push(form.lastElementChild.value);
            form.lastElementChild.value=""
            updateList();
            history.pushState(list,"list");
        }
        function updateList(){
            todolist.innerHTML=getLiData(list.todo,false);
            donelist.innerHTML=getLiData(list.done,true);
            todocount.textContent=list.todo.length;
            donecount.textContent=list.done.length;
            localStorage.list=JSON.stringify(list);
        }

        function getLiData(arr,bool=false){
            return arr.reduce((value,item)=>{
                return value+`<li><input type='checkbox' ${bool ? "checked" : ""}>${item}</li>`;
            },"")
        }

        function clickHandler(e){
            if(e.target.nodeName!=="INPUT")return;
            var index=Array.from(e.target.parentElement.parentElement.children).indexOf(e.target.parentElement);
            if(e.target.parentElement.parentElement===todolist){
                list.done=list.done.concat(list.todo.splice(index,1))
            }else{
                list.todo=list.todo.concat(list.done.splice(index,1))
            }
            updateList()
            history.pushState(list,"list");
        }

        function clearHandler(e){
            list.todo.length=0;
            list.done.length=0;
            updateList();
            history.pushState(list,"list");
        }

        function popHandler(e){
            if(!history.state){
                history.replaceState({todo:[],done:[]},"list");
            }
            list=history.state;
            updateList();
        }

5.PHP

什么是 PHP

? 是 “PHP Hypertext Preprocessor” 的首字母缩略词
? 是一种被广泛使用的开源弱类型脚本语言
? 脚本在服务器上执行
? 没有成本,可供免费下载和使用

PHP 文件

? 文件能够包含文本、HTML、CSS 以及 PHP 代码
? 代码在服务器上执行,而结果以纯文本返回浏览器
? 文件的后缀是 “.php”

PHP 功能

? 生成动态页面内容
? 创建、打开、读取、写入、删除以及关闭服务器上的文件
? 接收表单数据
? 发送并取回 cookies
? 添加、删除、修改数据库中的数据
? 限制用户访问网站中的某些页面
? 对数据进行加密

基础 PHP 语法

? 脚本以 <?php 开头,以 ?>

? 文件通常包含 HTML 标签以及一些 PHP 脚本代码。

? PHP 中的注释
? // 这是单行注释

? #这也是单行注释

? /**/多行注释块

? PHP 大小写敏感
? 在 PHP 中,所有用户定义的函数、类和关键词(例如 if、else、echo 等等)都对大小写不敏感
? 不过在 PHP 中,所有变量都对大小写敏感。函数名不区分大小写

? header(“content-type:text/html;charset=utf-8”); //响应头

? 变量的定义
? 变量以 $ 符号开头,其后是变量的名称
? 变量名称必须以字母或下划线开头
? 变量名称不能以数字开头
? 变量名称只能包含字母数字字符和下划线(A-z、0-9 以及 _)
? 变量名称对大小写敏感($y 与 $Y 是两个不同的变量)

变量作用域
local(局部)
函数内的变量是局部变量
global(全局)
函数外的变量是全局变量
static(静态)
通常,当函数完成/执行后,会删除所有变量。不过,有时我需要不删除某个局部变量。

	function abc(){
     static $a=5;
     $a++;
     echo $a;
 }
 abc();//6
 abc();//7
 abc();//8

? 变量域的提示
? 在函数内的变量,如果需要声明或者使用函数外的变量可以使用global

$x=3;
  function abc(){
      global $x;
      $x=6;
      echo $x;
  }
  abc();
  echo $x;

? $GLOBALS[index] 的数组中存储了所有的全局变量。

	$x=3;
  function abc(){
     $GLOBALS["x"]=6;
      echo $GLOBALS["x"];
  }
  abc();
  echo $x;

? 超全局变量
? $GLOBALS
? $_SERVER
? $_SERVER 这种超全局变量保存关于报头、路径和脚本位置的信息。
? $_REQUEST
? $_REQUEST 用于收集 HTML 表单提交的数据。

<html>
    <body>
        <form action="<?php echo $_SERVER['PHP_SELF'];?>">
                <!-- 利用$_SERVER获取当前脚本地址  -->
                <input type="text" name="user">
                <input type="submit" value="处理数据">
        </form>
        <?php
            if($_REQUEST){
                $userName = $_REQUEST['user'];
                echo $userName;
            }
         ?>
    </body>
</html>

? $_POST
? $_POST 广泛用于收集提交 method=“post” 的 HTML 表单后的表单数据。

<html>
    <body>
        <form method="POST" action="<?php echo $_SERVER['PHP_SELF'];?>">
                <!-- 利用$_SERVER获取当前脚本地址  -->
                <input type="text" name="user">
                <input type="submit" value="处理数据">
        </form>
        <?php
            if($_POST){
                $userName = $_POST['user'];
                echo $userName;
            }
         ?>
    </body>
</html>

? $_GET
? $_GET 也可用于收集提交 HTML 表单 (method=“get”) 之后的表单数据。
? $_FILES
? $_FILES从客户计算机向远程服务器上传文件。
? $_ENV
? 通过环境方式传递给当前脚本的变量的数组。例如当前计算机名称
? $_COOKIE
? $_COOKIE 变量用于取回 cookie 的值。
? $_SESSION
? 存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量
? 魔术变量
? LINE
? 返回当前代码在php中的行数,用于调试php脚本;
? FILE
? 返回当前文件的完整路径(绝对路径)
? FUNCTION
? 返回当前函数的函数名
? CLASS
? 返回当前的类名

关键字

and  or  xor  __FILE__ extends  __LINE__  array()  as  break  case  class  const  continue  declare  default  die()  do  echo  else  elseif  empty()  enddeclare  endfor  endforeach  endif  endswitch  endwhile  eval()  exit()  extends  for  foreach  function  global  if  include  include_once  isset()  list()  new  print  require  require_once  return  static  switch  unset()  use  var  while  __FUNCTION__  __CLASS__  __METHOD__
   final(PHP 5)  php_user_filter(PHP 5)  interface(PHP 5)  implements(PHP 5)  exception(PHP 5)  public(PHP 5)  private(PHP 5)  protected(PHP 5)  abstract(PHP 5)  clone(PHP 5)  try(PHP 5)  catch(PHP 5)  throw(PHP 5) this(PHP 5 only)

打印输出
echo 或 echo()相同

 $a=5;
 $b=6;
 $arr=array("a"=>10,"b"=>20);
 echo $a+$b;//11;
 echo $a.$b;//56;
 echo "这些数字是{$arr['b']}";
 echo "这些数字是".$arr["b"];

? print 或 print()相同

 $a=5;
 $b=6;
 $arr=array("a"=>10,"b"=>20);
print $a+$b;//11;
print $a.$b;//56;
print "这些数字是{$arr['b']}";
print "这些数字是".$arr["b"];

? echo和print相同,但是也有不同点
? echo - 能够输出一个以上的字符串
? echo a , a, a,b;
? print - 只能输出一个字符串,并始终返回 1
? echo print $a;//51
? 先打印print a , 再 用 e c h o 打 印 p r i n t 返 回 的 值 ? p r i n t r ( a,再用echo打印print返回的值 ? print_r( aechoprint?printr?(arr);
? 只能打印数组
? var_dump()
? 打印变量的类型和值
? $a=5;

 $b=6;
 $arr=array("a"=>10,"b"=>20);
 var_dump($a);
 var_dump($arr);

条件语句
if 语句 - 如果指定条件为真,则执行代码
if…else 语句 - 如果条件为 true,则执行代码;如果条件为 false,则执行另一端代码
if…elseif…else 语句 - 选择若干段代码块之一来执行
注意elseif没有空格
switch 语句 - 语句多个代码块之一来执行

数据类型
字符串
字符串可以是引号内的任何文本。您可以使用单引号或双引号
整数
整数必须有至少一个数字(0-9)
整数不能包含逗号或空格
整数不能有小数点
整数正负均可
可以用三种格式规定整数:十进制、十六进制(前缀是 0x)或八进制(前缀是 0)
PHP整数在定义的时候判断了以上这些情况,如果满足就确认为整数型

var_dump($x);
$x = -345; // 负数
var_dump($x);
$x = 0x8C; // 十六进制数
var_dump($x);
$x = 047; // 八进制数
var_dump($x);

? 浮点数
? 浮点数是有小数点或指数形式的数字。
? 逻辑
? 逻辑是 true 或 false。
? 数组
? 数组在一个变量中存储多个值。
? 数组长度
? count()
? 索引数组 - 带有数字索引的数组

$cars=array("Volvo","BMW","SAAB");
$cars[0]="Volvo";

? 关联数组 - 带有指定键的数组

$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
$age['Peter']="35";

? 多维数组 - 包含一个或多个数组的数组

$arr=array(array(1,2,3),array(4,5,6));
print_r($arr);	//print_r专门用于打印数组

? 数组的遍历

$arr=array(1,2,3,4,5,6);
for($i=0;$i<count($arr);$i++){
    echo $arr[$i]."</br>";
}
$arr=array(1,2,3,4,5,6);
foreach($arr as $value){
    echo $value."</br>";
}
foreach ($arr as $key=>$item){
     echo $key.":".$item;
     echo "<br>";
    }

? 数组的排序
? sort() - 以升序对数组排序
? rsort() - 以降序对数组排序
? asort() - 根据值,以升序对关联数组进行排序
? ksort() - 根据键,以升序对关联数组进行排序
? arsort() - 根据值,以降序对关联数组进行排序
? krsort() - 根据键,以降序对关联数组进行排序
? JSON类型数据
? json_encode()
? json_decode()
? 对象

class Ball{
        var $r=10;
        function Ball($r){
            $this->r=$r;
        }
        function play(){
            return $this->r;
        }
    }
    $ball=new Ball(10);
    echo $ball->play();

? NULL
? 特殊的 NULL 值表示变量无值。NULL 是数据类型 NULL 唯一可能的值。
? NULL 值标示变量是否为空。也用于区分空字符串与空值数据库。
? 可以通过把值设置为 NULL,将变量清空
? gettype()
? 返回数据的数据类型
? 判断类型
? is_int() 是不是整型;
? is_bool()是不是布尔值;
? is_string()是不是字符串;
? is_array()是不是数组类型;
? is_double()是不是浮点数;
? 随机数
? mt_rand(min,max)

$arr=array(1,2,3,4,5,6);
for($i=0;$i<count($arr);$i++){
    echo $arr[$i]."</br>";
}
$arr=array(1,2,3,4,5,6);
foreach($arr as $value){
    echo $value."</br>";
}
foreach ($arr as $key=>$item){
     echo $key.":".$item;
     echo "<br>";
    }

? 数组的排序
? sort() - 以升序对数组排序
? rsort() - 以降序对数组排序
? asort() - 根据值,以升序对关联数组进行排序
? ksort() - 根据键,以升序对关联数组进行排序
? arsort() - 根据值,以降序对关联数组进行排序
? krsort() - 根据键,以降序对关联数组进行排序
? JSON类型数据
? json_encode()
? json_decode()
? 对象

class Ball{
        var $r=10;
        function Ball($r){
            $this->r=$r;
        }
        function play(){
            return $this->r;
        }
    }
    $ball=new Ball(10);
    echo $ball->play();

? NULL
? 特殊的 NULL 值表示变量无值。NULL 是数据类型 NULL 唯一可能的值。
? NULL 值标示变量是否为空。也用于区分空字符串与空值数据库。
? 可以通过把值设置为 NULL,将变量清空
? gettype()
? 返回数据的数据类型
? 判断类型
? is_int() 是不是整型;
? is_bool()是不是布尔值;
? is_string()是不是字符串;
? is_array()是不是数组类型;
? is_double()是不是浮点数;
? 随机数
? mt_rand(min,max)

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 13:54:33  更:2021-07-22 13:56:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 19:24:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码