0719 NOTE
1.eventLoop
事件循环 的概念非常简单。它是一个在 JavaScript 引擎等待任务,执行任务和进入休眠状态等待更多任务这几个状态之间转换的无限循环。
引擎的一般算法:
-
当有任务时: 从最先进入的任务开始执行。 -
休眠直到出现任务,然后转到第 1 步。
当我们浏览一个网页时就是上述这种形式。JavaScript 引擎大多数时候不执行任何操作,它仅在脚本/处理程序/事件激活时执行。
任务示例:
- 当外部脚本
<script src="..."> 加载完成时,任务就是执行它。 - 当用户移动鼠标时,任务就是派生出
mousemove 事件和执行处理程序。 - 当安排的(scheduled)
setTimeout 时间到达时,任务就是执行其回调。
设置任务 —— 引擎处理它们 —— 然后等待更多任务(即休眠,几乎不消耗 CPU 资源)。
一个任务到来时,引擎可能正处于繁忙状态,那么这个任务就会被排入队列。
多个任务组成了一个队列,即所谓的“宏任务队列”
例如,当引擎正在忙于执行一段 script 时,用户可能会移动鼠标而产生 mousemove 事件,setTimeout 或许也刚好到期,以及其他任务,这些任务组成了一个队列,如上图所示。
队列中的任务基于“先进先出”的原则执行。当浏览器引擎执行完 script 后,它会处理 mousemove 事件,然后处理 setTimeout 处理程序,依此类推。
两个细节:
- 引擎执行任务时永远不会进行渲染(render)。如果任务执行需要很长一段时间也没关系。仅在任务完成后才会绘制对 DOM 的更改。
- 如果一项任务执行花费的时间过长,浏览器将无法执行其他任务,例如处理用户事件。因此,在一定时间后,浏览器会抛出一个如“页面未响应”之类的警报,建议你终止这个任务。这种情况常发生在有大量复杂的计算或导致死循环的程序错误时。
异步任务需要适当的管理。为此,ECMA 标准规定了一个内部队列 PromiseJobs ,通常被称为“微任务队列(microtask queue)”(ES8 术语)。
如 规范 中所述:
- 队列(queue)是先进先出的:首先进入队列的任务会首先运行。
- 只有在 JavaScript 引擎中没有其它任务在运行时,才开始执行任务队列中的任务。
简单地说,当一个 promise 准备就绪时,它的 .then/catch/finally 处理程序(handler)就会被放入队列中:但是它们不会立即被执行。当 JavaScript 引擎执行完当前的代码,它会从队列中获取任务并执行它。
微任务 Promise async await
每个宏任务之后,引擎会立即执行微任务队列中的所有任务,然后再执行其他的宏任务,或渲染,或进行其他任何操作。
宏任务 setTimeout setInterval requestAnimationFrame
宏任务执行时会将当前任务放在下一个新建任务列的最前面执行
微任务会放在当前任务列的最下面执行
更详细的事件循环算法(尽管与 规范 相比仍然是简化过的):
- 从 宏任务 队列(例如 “script”)中出队(dequeue)并执行最早的任务。
- 执行所有微任务
- 执行渲染,如果有。
- 如果宏任务队列为空,则休眠直到出现宏任务。
- 转到步骤 1。
安排(schedule)一个新的 宏任务:
它可被用于将繁重的计算任务拆分成多个部分,以使浏览器能够对用户事件作出反应,并在任务的各部分之间显示任务进度。
此外,也被用于在事件处理程序中,将一个行为(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");
Promise.resolve().then(function(){
setTimeout(function(){
console.log("b");
})
})
setTimeout(function(){
Promise.resolve().then(function(){
console.log("a");
})
})
console.log(1);
new Promise(function (res, rej) {
console.log(2);
res();
})
.then(function () {
console.log(3);
Promise.resolve().then(function () {
console.log(5);
setTimeout(function () {
console.log(6);
Promise.resolve().then(function () {
console.log(7);
});
setTimeout(function () {
console.log(8);
}, 0);
}, 0);
});
})
.then(function () {
console.log(4);
});
setTimeout(function () {
console.log(9);
new Promise(function (res) {
res();
console.log(10);
}).then(function () {
console.log(11);
});
});
Promise.resolve().then(function () {
setTimeout(function () {
Promise.resolve().then(function () {
console.log(12);
});
console.log(13);
}, 0);
});
setTimeout(function () {
setTimeout(function () {
setTimeout(function () {
Promise.resolve().then(function () {
console.log(14);
});
console.log(15);
}, 0);
console.log(16);
}, 0);
console.log(17);
}, 0);
console.log(18);
new Promise(function (res) {
console.log(19);
setTimeout(function () {
console.log(20);
}, 0);
});
练习
console.log(1);
document.addEventListener("14", function () {
console.log(14);
});
new Promise(function (resolve) {
resolve();
console.log(2);
setTimeout(function () {
console.log(3);
}, 0);
Promise.resolve().then(function () {
console.log(4);
setTimeout(function () {
console.log(5);
}, 0);
setTimeout(function () {
(async function () {
console.log(6);
return function () {
console.log(7);
};
})().then(function (fn) {
console.log(8);
fn();
});
}, 0);
});
new Promise(function (resolve) {
console.log(9);
resolve();
}).then(function () {
new Promise(function (resolve, reject) {
console.log(10);
reject();
})
.then(function () {
setTimeout(function () {
console.log(11);
}, 0);
console.log(12);
})
.catch(function () {
console.log(13);
var evt = new Event("14");
document.dispatchEvent(evt);
});
});
});
setTimeout(function () {
console.log(15);
Promise.resolve().then(function () {
console.log(16);
});
}, 0);
2.Cookie和Web Storage
Cookie
Cookie 是直接存储在浏览器中的一小串数据。它们是 HTTP 协议的一部分,由 RFC 6265 规范定义。
Cookie 通常是由 Web 服务器使用响应 Set-Cookie HTTP-header 设置的。然后浏览器使用 Cookie HTTP-header 将它们自动添加到(几乎)每个对相同域的请求中。
Cookie以文件的形式存储在客户端计算机上。当用户访问了某个网站,可以通过Cookie向访问者电脑上存储数据。
最常见的用处之一就是身份验证:
- 登录后,服务器在响应中使用
Set-Cookie HTTP-header 来设置具有唯一“会话标识符(session identifier)”的 cookie。 - 下次如果请求是由相同域发起的,浏览器会使用
Cookie HTTP-header 通过网络发送 cookie。 - 所以服务器知道是谁发起了请求。
我们还可以使用 document.cookie 属性从浏览器访问 cookie。
document.cookie="name=zhangsan"
document.cookie="age=30";
console.log(document.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都是以纯文本的形式记录于文件中,因此如果要保存用户名密码等信息时,最好事先经过加密处理。
练习
function setCookie(obj, time) {
let date = new Date();
date.setHours(time);
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 = {};
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);
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);
}
3.XSS攻击
XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。 能被XSS攻击需要以下两点: 1、需要向web页面注入恶意代码; 2、这些恶意代码能够被浏览器成功的执行。
预防:写入文件时,不要使用innerHTML写入,发送前需要转换正则验证script标签或者JavaScript超链接,替换并且发送服务
点击劫持攻击
4.todoList
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 © 2014 todolist.cn <a class="clear">clear</a>
</footer>
var form,donelist,todolist,todocount,donecount,clear;
var list={
todo:[],
done:[]
}
init()
function init(){
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();
abc();
abc();
? 变量域的提示 ? 在函数内的变量,如果需要声明或者使用函数外的变量可以使用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;
echo $a.$b;
echo "这些数字是{$arr['b']}";
echo "这些数字是".$arr["b"];
? print 或 print()相同
$a=5;
$b=6;
$arr=array("a"=>10,"b"=>20);
print $a+$b;
print $a.$b;
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(
a,再用echo打印print返回的值?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);
? 数组的遍历
$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)
|