中软Day14
模板引擎
数据+模板 ==> 静态页面的片段
为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。
模板引擎可以让将数据和HTML模板更加友好的结合,省去繁琐的字符串拼接,使代码更加易于维护。
为什么使用模板引擎
我们通过ajax获取到数据后,需要把数据渲染到页面,在学习模板引擎前,我们的做法是大量的拼接字符串,对于结构简单的页面,这么做还行
但是如果页面结构很复杂,使用拼串的话代码可阅读性非常的差,而且非常容易出错,后期代码维护也是相当的麻烦。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="user">
<p>姓名: xx</p>
<p>年龄: xx</p>
<p>性别: xx</p>
<p>描述: xx</p>
</div>
<script>
// 找对象
var user = document.getElementById("user");
// 从后台通过 ajax 获取数据
var obj = {
name: "小王",
age: 18,
sex: "男",
desc: "暴躁"
}
// 字符串拼接
var htmlStr = " <p>姓名: " + obj.name + "</p> " +
" <p>年龄: " + obj.age + "</p> " +
" <p>性别: " + obj.sex + "</p> " +
" <p>描述: " + obj.desc + "</p> ";
user.innerHTML = htmlStr;
// 缺点:
// 1. html标签代码 和 js 代码混在一起, 代码冗余
// 2. 字符串拼接非常麻烦, 维护起来不方便
</script>
</body>
</html>
总结来说拼串渲染两大缺点:
- js中大量充斥着 html 结构拼串代码, 很冗余, 可读性差
- 字符串拼接很麻烦, 且维护起来也很麻烦, 容易出错
常见模板引擎
BaiduTemplate:http://tangram.baidu.com/BaiduTemplate/
velocity.js:https://github.com/shepherdwind/velocity.js/
ArtTemplate:https://github.com/aui/artTemplate
artTemplate是使用最广泛,效率最高的模板引擎,使用npm install art-template命令下载。
模板编译
通过调用模板引擎提供的template函数,告知模板引擎将特定模板和特定数据进行拼接,最终返回拼接结果。
// 模板引擎导入
const template = require('art-template');
// 模板编译
// 1.模板位置
// 2.向模板中传递要拼接的数据,对象类型,对象属性可以直接在模板中使用。
// result 拼接结果
const result = template('./views/index.html', {msg: 'Hello, art-template'});
模板语法
<!-- 标准语法 -->
<h2>{{value}}</h2>
<h2>{{a ? b : c}}</h2>
<h2>{{a + b}}</h2>
<!-- 原始语法 -->
<h2><%= value %></h2>
<h2><%= a ? b : c %></h2>
<h2><%= a + b %></h2>
原文输出
如果数据中携带HTML标签,默认不会解析标签,会将其转义后输出。使用以下方式可以解析标签。
{{@ value }}
条件判断
<!-- 标准语法 -->
{{if 条件}} ... {{/if}}
{{if v1}} ... {{else if v2}} ... {{/if}}
<!-- 原始语法 -->
<% if (value) { %> ... <% } %>
<% if (v1) { %> ... <% } else if (v2) { %> ... <% } %>
{{if gender='男'}}
<div class="man">
{{else}}
<div class="woman">
{{/if}}
数据循环
{{each target}}
{{$index}} {{$value}}
{{/each}}
<!-- 原始语法 -->
<% for(var i = 0; i < target.length; i++){ %>
<%= i %> <%= target[i] %>
<% } %>
each语法
<!--
1. {{each data}} 可以通过$value 和 $index获取值和下标
2. {{each data v i}} 自己指定值为v,下标为i
-->
{{each data v i}}
<li>
<a href="{{v.url}}">
<img src="{{v.src}}" alt="">
<p>{{v.content}}</p>
</a>
</li>
{{/each}}
子模版
使用子模板可以将网站公共区块(头部、底部)抽离到单独的文件中。
<!-- 标准语法 -->
{{include './header.art'}}
<!-- 原始语法 -->
<% include('./header.art') %>
模板继承
使用模板继承可以将网站HTML骨架抽离到单独的文件中,其他页面模板可以继承骨架文件。
{{extend './layout.html'}}
{{block 'head'}} ... {{/block}}
计算机网络知识
IP | 地址 |
---|---|
域名 | IP的别名 |
DNS | 地址簿 |
端口 | 区分服务 |
1.浏览器分析url(www.baidu.com)
2.浏览器向DNS服务器 请求解析 url(www.baidu.com)
3.DNS 把url 解析 成IP地址
4.浏览器和主机建立TCP(运输层协议)
5.浏览器发出http请求
6.服务器发送http响应
7.tcp链接释放
8.浏览器解析文件 完成显示界面
接受其他主机访问
查看本机的IP地址 cmd–> ipconfig
- 找到配置文件
- Deny form all 改为 allow form al
配置文件查找错误
1.找到路径 D:\develop\wamp\bin\apache\Apache2.4.4\bin
2.cmd 执行httpd
3.更正错误
4.重启服务
常见的后端编程语言
- php 相对简单 快速构造网站
- JavaScript nodeJS
- java jsp 处理高并发
- .net 微软
- python 蟒蛇
PHP
php 是一种后台编程语言 ,用于浏览器处理ajax请求的后端语言, 使用php可以开发动态网站和后台接口 (所谓接口就是url地址,用于给前端提供数据) 前后端分离 全栈
单引号和双引号区别:单引号将内容解析成字符串,双引号将内容解析成变量。
后端编写的代码都不能直接运行,要在服务器的环境下才能运行。
PHP是世界上最好的语言 ( 简单 )
html构造静态网站,php构造动态网站
php基本结构
<?php ?>
PHP基本数据类型
PHP中有8种变量类型:boolean,integer,float/double,string,array,object,resource和null;
PHP中变量类型不是由程序设定,而是PHP根据程序运行上下文确定;
$s="字符串类型";
$i=100; //整数类型
$f=3.15; //浮点数类型
$lo=true; //逻辑类型
$ar=array("数组","类型");
$n=null; //null值,将变量值清空
字符串操作
-
字符串连接运算符".", 用于把两个字符串值连接起来
$str1 = 'My name is '; $str2 = 'wuhen'; echo $str1.$str2; //结果为My name is wuhen 使用.连接2个字符串
-
获取字符串长度 strlen()
$str3 = 'My name is wuhen'; echo strlen($str3); //结果为16 返回$str4的长度
-
去掉字符串的首尾空格和特殊字符
//去除空格和特殊字符 $str4 = ' abcde '; echo strlen($str4); //结果为7 包含首尾的空格 echo strlen(trim($str4)); //结果为5 去除空格后的长度 echo strlen(ltrim($str4)); //结果为6 去除左边空格后的长度 echo strlen(rtrim($str4)); //结果为6 去除右边空格后的长度
-
大小写转换
- strtoupper() 转为为大写,并返回一个新的字符串
- strtolower() 转换为小写,并返回一个新的字符串
- ucfirst() 整个字符串首字母大写,并返回一个新的字符串
- ucwords() 每个字母大写,并返回一个新的字符串
//大小写转换 $str6 = 'my name is wuhen'; //strtoupper() $strupper = strtoupper($str6); echo $strupper; //结果为 MY NAME IS WUHEN 不改变原数组 //strtolower() $strlower = strtolower($strupper); echo $strlower; //结果为 my name is wuhen //$ucfirst() $strucf = ucfirst($str6); echo $strucf; //结果为 My name is wuhen 字符串首字母大写 //ucwords() $strucw = ucwords($str6); echo $strucw; //结果为 My Name Is Wuhen 每个单词首字母大写
-
substr() 字符串截取,从字符串指定索引位置截取指定长度的字符,返回截取的部分。
//字符串截取 $str7 = 'This is test'; //截取2位 echo substr($str7,5,2); //结果为 is //长度参数不写时,则会截取剩下全部字符, echo substr($str7,5); //结果为 is test
-
strstr()字符串搜索截取 ,搜索一个字符串在另一个字符串中的第一次出现,返回字符串的剩余部分。
//字符串搜索 $str8 = 'This is a test'; echo strstr($str8,'a'); //结果为 a test //在字符串找到a,返回a位置以及后面的字符串
-
strpos() 字符串查找 ,搜索一个字符串在另一个字符串中的第一次出现的位置,返回出现的位置。
//字符串查找 $str9 = 'This is a test'; //返回查找目标第一个的索引,索引从0开始 //没有设置起始位置参数,默认从开头开始查找 echo strpos($str9,'s'); //结果为 3 //从指定位置开始查找 echo strpos($str9,'s',10); //结果为 12
-
str_replace()字符串替换,用一个字符串替换查找的字符串,并返回一个新的字符串。
//字符串替换 $str10 = 'This is a apple'; $newstr =str_replace('apple','cat',$str10); echo $newstr; //结果为 This is a cat //在字符串中查找到apple并将其用cat替换,返回一个新的数组
-
运算符
-
算数运算符
用来执行数学上的算数运算
- 前置自增自减运算符,先运算再赋值
- 后置自增自减运算符,先赋值再运算
//算数运算符 $a = 100; $b = 50; echo $a+$b;//加法,结果为150 echo '<br>'; echo $a-$b;//减法,结果为50 echo '<br>'; echo $a*$b;//乘法,结果为5000 echo '<br>'; echo $a/$b;//除法,结果为2 echo '<br>'; //前置自增自减运算符 $var1 = ++$a;//先进行$a自加1,然后将结果赋值给$var1 echo $var1;//结果为101 echo '<br>'; echo $a;//结果为101 echo '<br>'; $var2 = --$a;//先进行$a自减1,然后将结果赋值给$var2 echo $var2;//结果为100 echo '<br>'; echo $a;//结果为100 echo '<br>'; //后置自增自减运算符 $var3 = $a++;//先将$a赋值给$var3,然后$a自加1 echo $var3;//结果为100 echo '<br>'; echo $a;//结果为101 echo '<br>'; $var4 = $a--;//先将$a赋值给$var4,然后$a自减1 echo $var4;//结果为101 echo '<br>'; echo $a;//结果为100 echo '<br>';
-
赋值运算符
$x1=10; echo $x1; // 输出 10 $y1=20; $y1 += 100; echo $y1; // 输出 120 $z1=50; $z1 -= 25; echo $z1; // 输出 25 $i1=5; $i1 *= 6; echo $i1; // 输出 30 $j1=10; $j1 /= 5; echo $j1; // 输出 2 $k1=15; $k1 %= 4; echo $k1; // 输出 3
-
字符串运算符
- 字符串和数字连接时,使用
.
优先转换成字符串 - 字符串和数字连接时,使用
+
优先转换成数字
$a = "Hello"; $b = $a . " world!"; //串接字符 echo $b; // 输出 Hello world! $x="Hello"; $x .= " world!"; //串接赋值字符 echo $x; // 输出 Hello world!
- 字符串和数字连接时,使用
-
类型运算符
instance of 用于确定一个 PHP 变量是否属于某一类的实例。
class Dog{ } $dog1=new Dog(); if($dog1 instanceof Dog){ echo '$dog是Dog对象的实例'; }else{ echo '$dog不是Dog对象的实例'; }
-
执行运算符
PHP 支持一个执行运算符:反引号(“), PHP 将尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回。使用反引号运算符的效果与函数
shell_exec()
相同。echo '<pre>'; echo `netstat -anb`;
-
比较运算符
比较运算符用于对两个变量或者表达式进行比较
- 如果比较一个整数和字符串,则字符串会被转换为整数
- 如果比较两个数字字符串,则作为整数比较
//比较运算符 $a=10; $b=5; $c='5'; $d='3'; var_dump($a<$b);//结果为bool(false) var_dump($a<=$b);//结果为bool(false) var_dump($a>$b);//结果为bool(true) var_dump($a>=$b);//结果为bool(true) var_dump($a==$b);//结果为bool(false) var_dump($b==$c);//结果为bool(true),==只判断数值是否相等 var_dump($b===$c);//结果为bool(false),===判断数值和类型 var_dump($d<$c);//结果为bool(true),会转成整型来比较
-
逻辑运算符
-
与 &&
两边的表达式都为真,结果为真;有一假,结果返回假 -
或 ||
两边的表达式都为假,结果为假;有一真,结果返回真 -
非 !
返回与表达式相反的结果 -
and or
和上述逻辑运算符功能相同 -
逻辑异或 xor
两边的表达式一真一假 ,结果返回真,反之返回假
//逻辑运算符 $bool1 = true; $bool2 = false; var_dump($bool1 && $bool2);//结果为bool(false) var_dump($bool1 || $bool2);//结果为bool(true) var_dump(!$bool1);//结果为bool(false) var_dump(($bool1 && $bool2) and ($bool1 || $bool2)); //结果为bool(false) var_dump(($bool1 && $bool2) or ($bool1 || $bool2)); //结果为bool(true) var_dump($bool1 xor $bool2); //结果为bool(true)
-
-
错误控制运算符
PHP 支持一个错误控制运算符:
@
。当将其放在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
@
一般可以和die
配合使用,使致命错误不被忽略。<?php $num1=12; $num2=$num1/0;//会输出警告信息 $num3=@($num1/0);//不会输出任何信息 ?>
-
三元运算符
<?php $num1=12; echo $num1%2==0 ? '偶数' : '奇数'; ?>
-
其他运算符
-
=> 数组下标符号
-
-> 对象成员访问符号
-
PHP注释
-
单行注释,注释内容中不可出现?
//php #php
-
多行注释
/*php*/
PHP变量
在php 中 变量必须以$开头 字母/数字/下划线 不能以数字开头 区分大小写
$a=1;
$b=2; //php与其他强类型语言不同,不需要在创建变量的时候为变量赋予固定的数据类型,php可以根据赋予给变量的值而自动确定其数据类型
$c=$a+$b; //php的变量同样与其他语言不同,只要这个量依然是变量,$符号就不能省略,否则会报错
echo $c;
$x=5;
$y=10;
function myTest(){
$y=10; //局部作用域
echo "<p>测试函数内部的变量:</p>";
echo "变量x是:$x"; //编译报错,因为在php中全局变量因为不是在函数内部声明,所以不能用在函数内部,但是可以定义相同的变量
echo "<br>";
echo "变量y是:$y";
}
myTest();
echo "<P>测试函数之外的变量:</P>";
echo "变量x是:$x";
echo "<br>";
echo "<P>变量y是:$y</P>"; //编译报错,函数内部声明的变量同样不能用在函数外
function myTestTwo(){
global $x,$y; //global用于在函数内部访问全局变量,也就是让全局变量变得正在全局!
$y=$x+$y; //global在$GLOBALS[index]中存储了所有的全部变量,下标存有变量名,可以用来在函数内更新全局变量
}
myTestTwo();
echo "<p>$y</p>";
function myTestThree(){
static $x=0; //类似于静态变量,通常当一个函数结束时,会释放掉所有变量的值,此时将不会产生累加效果
echo "<p>$x</p>";
$x++; //但是,当我们加上static关键词之后,变量的值将不会释放,而会一直保存
}
myTestThree(); //0
myTestThree(); //1
myTestThree(); //2
-
变量作用域:
1.全局(Global)作用域,在函数外声明的变量只能在函数外使用
可使用global关键词在函数内访问全局变量
2.局部(LOCAL)作用域,在函数内声明的变量,只能在函数内使用3.超全局作用域
-
变量其他注意事项:
1.变量会在首次为其赋值时被创建
2.PHP 根据变量的值,自动把变量转换为正确的数据类型,无需声明
3.当函数完成后会删除所有的变量,添加static关键字可使某个局部变量不被删除 -
定义变量
<?php $name='i love php!'; echo '$name';//输出$name echo "$name";//输出i love php! echo "hello\nworld";//\n为转义字符 echo 'hello\nword';//\n原样输出 $number1=123;//定义十进制整数 $number2=0123;//定义八进制整数 $number3=0x123;//定义十六进制整数 $number4=0.123;//定义浮点数 $number5=2.3E+3;//$number5=2300 $number6=2.3E-2;//$number6=0.023 $array1=array('武汉','广州','南京');//定义一维数组 $array2=array(0=>'php',1=>'c#',2=>'java');//定义一维数组 echo '<p>';//段楼开始标记 echo $array1[1];//输出广州 echo '<br/>';//换行符 echo $array2[0];//输出php echo '</p>';//段落结束标记 $num1='5.23r*r'; $num2=1; echo $num1+$num2;//输出6.23 ?>
-
引用、静态变量及全局变量
<?php $str1="hello"; $str2=$str1;//变量赋值 $str2=& $str1;//引用赋值 static $name='C#';//静态变量 $score=80; function f(){ $score=100; echo $score.'<br/>';//输出100 global $score;//定义全局变量 echo $score;//输出80 } f();//调用函数 ?>
-
可变变量
//函数名可以用其他变量代替 //注意:只有在调用时才能使用变量,定义时不允许! <?php $name='wit'; $wit='hello,word'; echo $name.'<br/>';//输出wit echo $$name;//输出hello,word ?>
命名规则
常量名 类常量建议全大写,单词间用下划线分隔 // MIN_WIDTH
变量名建议用下划线方式分隔 // $var_name
函数名建议用驼峰命名法 // varName
定界符建议全大写 // <<<DING, <<<'DING'
文件名建议全小写和下划线、数字 // func_name.php
私有属性名、方法名建议加下划线 // private $_name _func
接口名建议加I_ // interface I_Name
声明常量
- unset() 中不能使用常量
- 常量前面没有美元符号($)
- 常量用 define() 函数定义,而不能通过赋值语句
- 常量也可以通过 const 来定义
- 常量的命名规范是“字母大写加下划线”,比如
TAX_RATE
echo strlen("返回字符串的长度函数strlen");
echo strpos("在一组字符中截取相应的片段","相应的片段");
//其他操作通过手册查询
-
定义常量,语法:
define(string constant_name,mixed_value,case_sensitive=true);
说明:第一个参数为常量名,第二个参数为常量值,第三个参数表示是否对大小写敏感(可选)。
-
获取常量的值,语法:
mixed constant(string const_name);
也可以通过常量名直接获取常量的值.
-
判断一个常量是否定义,语法:
bool defined(string const_name);
<?php define("$PI", 3.1415926); if(defined("$PI")) { echo $PI."<br/>"; echo constant("$PI"); } ?> //系统预定义的一些常量 <?php echo constant("__FILE__");//输出PHP文件名 echo constant(_LINE_);//输出PHP程序行数 echo constant(PHP_VERSION);//PHP程序的版本 echo constant(PHP_OS);//P执行PHP解析器的操作系统名 ?>
-
魔术常量
预定义变量
不需要声明就可以使用的变量,又称超全局变量。
$GLOBALS
$_COOKIE
$_ENV
$_FILES
$_GET
$_POST
$_REQUEST
$_SERVER
$_SESSION
-
综述
-
$_GET变量(数组)
Get这个词,常常出现在<formaction=”abc.php” method=”get”>…
这叫做“表单以get方式提交数据”
则$_GET这个预定义数组变量,就是指以这种方式提交的所有数据的集合(数组)
对应来说,也可以以post方式提交数据。
实际上,在网页中,以get方式提交数据有多种形式:
形式一: <form action=”abc.php” method=”get”> 项目一:<inputtype=”text” name=”uName”> 项目二:<inputtype=”password” name=”uPswd”> <inputtype=”submit” value=”提交”> </form> 形式二:<a href=”abc.php?uName=test1&uPswd=123”>文字。。。</a> 形式三: <script> Location.href=” abc.php?uName=test1&uPswd=123”;// 利用location对象的href属性 </script> 形式四: <script> Location.assign(“abc.php?uName=test1&uPswd=123”); // 利用location对象的方法assign() </script> 不管是哪种形式的get提交过来的数据,获取数据是一样的。作用是:用户填写表单数据,并提交后,会将数据发送(提交)给页面abc.php,也可以理解为“打开”该网页。 在abc.php网页中 <?php $v1=$_GET[‘uName’]; //单引号也可以用双引号,本质是一个字符串,其实是数组的键名(下标) $v2=$_GET[‘uPswd’]; //该键名必须跟提交的时候名字完全一致(区分大小写) echo ”v1=$v1,v2=$v2”; echo “<hr />”; echo “<pre>”; var_dump($_GET); //var_dump()用于输出一个变量最完整的信息,输出$_GET这个数组 echo”</pre>” ?>
-
$_POST变量(数组)
类似于 G E T 变 量 ( 数 组 ) , _GET变量(数组), GET变量(数组),_POST代表页面通过post方式提交过来的数据所形成的数组。
-
post提交数据,通常只有一种形式:
<form action=”abc.php” method=”post”> 项目一:<inputtype=”text” name=”uName”> 项目二:<inputtype=”password” name=”uPswd”> <input type=”submit”value=”提交”> </form>
作用是:用户填写表单数据,并提交后,会将数据发送(提交)给页面abc.php,也可以理解为“打开”该网页。
-
接受post数据的形式为(abc.php网页中):
<?php $v1=$_POST[‘uName’]; //单引号也可以用双引号,本质是一个字符串,其实是数组的键名(下标) $v2=$_POST[‘uPswd’]; //该键名必须跟提交的时候名字完全一致(区分大小写) echo ”v1=$v1,v2=$v2”; echo “<hr />”; echo “<pre>”; var_dump($_POST); //var_dump()用于输出一个变量最完整的信息,输出$_GET这个数组 echo”</pre>” ?>
注:网页中的form表单,一般都用post方式,get方式主要体现在其他3中形式。
-
-
$_REQUEST变量(数组)
R E Q U E S T 数 组 , 并 不 是 一 个 独 立 的 数 据 来 源 , 而 是 _REQUEST数组,并不是一个独立的数据来源,而是 REQUEST数组,并不是一个独立的数据来源,而是_GET数据和 P O S T 数 据 的 “ 总 和 ” , 即 _POST数据的“总和”,即 POST数据的“总和”,即_REQUEST数组中包括了所有 G E T 数 据 和 _GET数据和 GET数据和_POST数据——由系统自动存储的。
-
通常 G E T 数 据 和 _GET数据和 GET数据和_POST数据不会“同时出现”,$_REQUEST数组就代表了其中之一。
<form action=”abc.php” method=”post”> 项目一:<inputtype=”text” name=”uName”> 项目二:<inputtype=”password” name=”uPswd”> <input type=”submit” value=”提交”> </form> <form action=”abc.php” method=”get”> 项目一:<input type=”text”name=”uName”> 项目二:<inputtype=”password” name=”uPswd”> <input type=”submit” value=”提交”> </form> //两者接受数据都一样 <?php $v1=$_REQUEST[‘uName’]; //单引号也可以用双引号,本质是一个字符串,其实是数组的键名(下标) $v2=$_REQUEST[‘uPswd’]; //该键名必须跟提交的时候名字完全一致(区分大小写) echo ”v1=$v1,v2=$v2”; ?>
-
当get与post同时提交的情形(一般只有一种html语法形式会出现该情形)
<form action=”abc.php?a=5&b=10”method=”post”> 项目一:<inputtype=”text” name=”uName”> 项目二:<inputtype=”password” name=”uPswd”> <input type=”submit” value=”提交”> </form> //此时,uName和uPswd两个数据以post方式提交给abc.php,并a=5与b=10以get方式提交给abc.php //则在页面中: //这样取得get数据: $v1=$_GET[‘a‘]; $v2=$_GET[‘b’]; //这样取得post数据: $v1=$_POST[‘uName’]; $v2=$_POST[‘uPswd’]; //但也可以这样取 $v1=$_REQUEST[‘a‘]; $v2=$_REQUEST[‘b’]; $v3=$_REQUEST[‘uName’]; $v4=$_REQUEST[‘uPswd’];
-
当get数据和post数据同时提交并其中有重名的时:
-
尽量避免重名
-
如果重名了,此时$_REQUEST只会记录(存储)其中一个数据(要么post数据,要么get数据)
-
至于记录的是哪个,是由php.ini中的一个设置项决定
- request_order=”GP”;//这是默认值,G代表GET,P代表POST
- 含义是:先存储GET数据,再存储POST数据
- 可见如果重名,此时POST就会覆盖GET数据
- 改为:request_order=“PG”,顺序反过来
<form action=”abc.php?a=5&b=10”method=”post”> 项目一:<inputtype=”text” name=”uName”> 项目二:<inputtype=”password” name=”uPswd”> 项目三:<input type=”text”name=”a”> <input type=”submit” value=”提交”> </form> //a的数据为以post方式提交的数据。 //$_GET 、$_POST 、$_REQUEST三种数据是相互独立的
-
-
-
$_SERVER变量(数据)
该变量存储了服务器端或客户端的一些请求信息或设置信息,比较多,而且不同的服务器和不同的请求页面,其数据项都可能不同。
常用的有:
REMOTE_ADDR,用户的IP地址
SERVER_ADDR,服务器端的IP地址
SERVER_NAME,服务器名(主机名)
echo ”<table border=’1’>”; foreach($_SERVER as $key=>$value){ echo “<tr>”; echo “<td>$key</td>”; echo “<td>$value</td>”; echo “</tr>”; } echo “</table>”;
-
$GLOBALS变量(数据)
似乎是一个多余的变量:它只是把我们定义的所有全局变量存储到该数组中:
变量名就是该数组的下标(键名),变量值就是对应的值。
<?php $v1=1; $v2=2; function f1(){ $v3=3; $v4=4; echo ”<br/>函数f1被调用!”; } f1(); echo ”<pre>GLOBALS数组内容为:<br />”; var_dump($GLOBALS); echo “</pre>”; ?> //(全局变量v1,v2存入GLOBALS数组,而局部变量v3、v4没有存入GLOBALS数组) //显示: //函数f1被调用! //GLOBALS数组内容为: array(7) { ["GLOBALS"]=> *RECURSION* ["_POST"]=> array(0) { } ["_GET"]=> array(0) { } ["_COOKIE"]=> array(0) { } ["_FILES"]=> array(0) { } ["v1"]=> int(1) ["v2"]=> int(2) }
-
-
作用域问题
PHP中,自定义的变量的作用域分两种:全局变量(函数外)、局部作用域(函数内)
但预定义变量的作用域称为“超全局作用域”:全局作用域+局部作用域的总和(函数内外全都可用)
-
数据类型问题:超全局变量都是数组
PHP集合
-
数组
不能用数组和对象作为键(key),这样做会导致一个警告:illegal offsettype
php 数组是可以自动增长的
-
数组创建方式
//第一种,对数组的每一个元素赋值: $arr[0]=1; $arr[1]='Hello World'; //第二种: $arr=array('张三','李四','王五'); //第三种: $arr=array('no1'=>'张三','no2'=>'李四','no3'=>'王五');
-
数组的自动增长
$arr=array(); for($i=0; $i<20; $i++){ $arr[]=$i; } var_dump($arr);
-
数组的常用函数
-
删除数组或数组项
$arr = array('a','b','c','d'); unset($arr); // 删除数组 unset($arr[2]); // 删除数组项
-
数组遍历
//var arr = [1,3,5]; //arr[1]; $arr = array(1,3,5); print_r($arr); echo "<br/>"; echo $arr[1];//echo不能取出数组但可以取出数组中的元素 //数组遍历 for($i=0;i<count($arr);$i++){ echo $arr[$i]; echo "<br/>"; }
-
关联数组
$age1=array("Peter"=>"35"); //也可以 $age2=array('peter')="35"; echo "peter age is".$age1['Peter']; echo "peter age is".$age2['peter']; foreach ($age1 as $ag => $ag_value){ echo "age=".$ag."value".$ag_value; } ?>
-
数组的运算符
$arr1 = array(1,6); $arr2 = array(2,8,9); $arr3 = $arr1 + $arr2; print_r($arr3); // 1 6 9
-
数组的空间分配机制
函数名 作用 memory_get_usage() 返回分配给 PHP 的内存量 -
排序
-
冒泡排序
// 代码优化之后,速度有很大提升 $arr = array(12,23,34,1,-12,26,56,234,237,9); function bubble(&$arr){ $flag = 0; $arr_len=count($arr); for($i = 0; $i < $arr_len-1; $i++){ for($j = 0; $j < $arr_len-1-$i; $j++){ if($arr[$j] > $arr[$j + 1]){ $temp=$arr[$j]; $arr[$j]=$arr[$j+1]; $arr[$j+1]=$temp; $flag = 1; } } if($flag == 0){ break; }else{ $flag = 0; } } } date_default_timezone_set('PRC'); echo '<br>' . date('H:i:s'); bubble($arr); echo '<br>' . date('H:i:s'); echo '<pre>'; print_r($arr);
-
选择排序
$arr = array(12,34,99,3,45,103,4); function selectSort(&$arr){ $arr_len=count($arr); for($i = 0; $i < $arr_len; $i++){ $arr_min = $arr[$i]; $arr_index = $i; for($j = $i; $j < $arr_len; $j++){ if($arr_min > $arr[$j]){ $arr_min = $arr[$j]; $arr_index = $j; } } if($arr_index != $i){ $arr[$arr_index] = $arr[$i]; $arr[$i] = $arr_min; } } } selectSort($arr); echo '<pre>'; print_r($arr);
-
插入排序
$arr = array(12,3,436,43,76,10); function insertSort(&$arr){ $arr_len = count($arr); for($i = 1; $i < $arr_len; $i++){ $index = $i - 1; $arrItem = $arr[$i]; while($index >= 0 && $arr[$index] > $arrItem){ $arr[$index+1] = $arr[$index]; $index--; } $arr[$index+1] = $arrItem; } } insertSort($arr); echo '<pre>'; print_r($arr);
-
快速排序
四种排序速度:冒泡排序 < 选择排序 < 插入排序 < 快速排序
-
-
查找
-
顺序查找
$arr = array(12,3,34,45,111,23,5,67,23); function search($arr,$item){ $arr_len = count($arr); $flag = 0; for($i = 0; $i < $arr_len; $i++){ if($item == $arr[$i]){ echo '找到了,索引值为:' . $i . '<br>'; $flag = 1; } } if($flag == 0){ echo '很抱歉,没有找到哦。'; } } search($arr,23);
-
二分法查找
二分法查找适用于查找有序的数组。
$arr = array(1,3,6,12,22,34,45,56,67,99,122,155); function searchNum($left_index,$right_index,$arr,$item){ if($left_index > $right_index){ echo '很抱歉,没有找到。'; return; } $mid_index = round(($left_index + $right_index) / 2); if($arr[$mid_index] == $item){ echo '找到了,索引值为:' . $mid_index; }else if($arr[$mid_index] > $item){ searchNum($left_index,$mid_index-1,$arr,$item); }else if($arr[$mid_index] < $item){ searchNum($mid_index+1,$right_index,$arr,$item); } } searchNum(0,count($arr)-1,$arr,288);
-
-
二维数组
$arr = array(array(12,23,34),array(123,345,333),100); $arr_len = count($arr); for($i = 0; $i < $arr_len; $i++){ $arr2_len = count($arr[$i]); if(is_array($arr[$i])){ for($j = 0; $j < $arr2_len; $j++){ echo $arr[$i][$j] . ' '; } }else{ echo $arr[$i]; } echo '<br>'; }
$arr = array(array(12,23,34),array(123,345,333),100); foreach($arr as $val){ if(is_array($val)){ foreach($val as $v){ echo $v . ' '; } }else{ echo $val . ' '; } echo '<br>'; }
-
-
对象
//var dict = {"name":"lnj","age":"33"}; //dict["name"]; $dict = array("name"->"lnj","age"->"33"); print_r($dict); echo "<br/>"; echo $dict["name"];
流程控制
php分支循环语句
$age = 19;
if($age >= 18){
echo "成年";
}else{
echo "未成年";
}
$res = ($age>=18)?"成年":"未成年";
echo $res;
switch($age){
case 0:
echo "0";
break;
case 18:
echo "成年人";
break;
default:
echo "未成年"
break;
}
$index=0;
while($index < count($arr)){
echo $arr[$index];
echo "<br/>";
$index++;
}
-
如何运行编写好的PHP文件?
因为PHP是服务端编程语言,所以要在服务端运行
- php文件名不能有中文
- php文件必须放到服务器文件夹下
- 通过ip找到服务器文件夹,选中php文件访问
-
服务端返回浏览器的是什么?
-
php程序的执行结果
注意:执行结果中有中文,必须要在php文件顶部设置
-
内容输出
- echo 输出简单数据类型 如字符串 数值等
- print 输出复杂数据类型 数组
- var_dump() 输出详细信息 如数组 对象
echo "这是第一个输出方法,调用echo";
print "这是第二个输出方法,调用print";
$text1="我是一个变量";
$cars=array("我","是","一","个","数","组","字","符","串");
echo $text1 . "$cars[1]"; //echo调用变量时可以用引号,也可以不用引号,推荐使用echo,因为其不返回值效率更高
注意:后端编写的代码不能直接运行,只能放到服务器对应的文件夹下,通过服务器运行
- 如何通过服务器运行:通过ip地址找到服务器对应的文件夹,然后再找到对应的文件运行
常用函数
定义函数
class Oj
{
var $object;
function Oj($object="oj"){
$this->object=$object;
}
function what_object(){
echo "函数调用成功";
}
} //定义
$test=new Oj("oj");
$test->what_object(); //对方法进行引用