Php
PHP是一种通用开源服务端脚本语言,将程序嵌入到HTML文档中去执行,结果以纯HTML 形式返回给浏览器。
PHP: Hypertext Preprocessor “超文本预处理器”,1994年由Rasmus Lerdorf创建,刚刚开始仅仅是为了要维护他本人个人网页而制作的一个简单程序(Perl语言编写),原名Personal Home Page(PHP由此得名),后用C语言重新编写,改名Hypertext Preprocessor。
PHP能做什么
· 生成动态页面内容;
· 创建、打开、读取、写入文件;
· 收集ajax数据;
· 发送和接收cookie;
· 添加、删除、修改您的数据库中的数据;
· 限制用户访问您的网站上的一些页面;
· 加密数据。
1安装
1.1配置环境
· 安装 Web 服务器Apache;
· 安装 PHP;
· 安装MySQL数据库。
对于初学者建议使用集成的服务器组件(如:WampServer),它已经包含了PHP、Apache、Mysql等服务,免去了开发人员将时间花费在繁琐的配置环境过程。
WampServer下载地址:http://www.wampserver.com/
1.2 IDE安装
IDE: Integrated Development Environment (集成开发环境),推荐使用PhpStorm。
PhpStorm官方下载地址:http://www.jetbrains.com/phpstorm/download/
2语法
· 默认文件扩展名是 “.php”。
· 通常包含 HTML 标签和一些 PHP 脚本代码。
2.1分界标识符
<?php //开始
//...php代码
?> //结束
2.2注释
与js一样,分单行和多行注释。
· 单行注释://
· 多行注释:/**/
2.3输出语句
2.3.1 echo
可以输出一个或多个字符串(字符串可以包含HTML标签),速度较快,一般用于向前端返回数据。
<?php
//输出一个字符
echo "Hello world!<br>";
//输出多个字符
echo "This", " string", " was", " made", " with multiple parameters.";
?>
2.3.2 print_r
打印关于变量的信息,适用于数组、对象的打印,一般用于测试。
2.3.3 var_dump
判断一个变量的类型与长度,并输出变量的数据类型和数值,一般用于测试。
2.4 变量
2.4.1命名规则
· 以 $ 符号开始,后面跟着变量的名称($称为标识符,不属于变量组成部分);
· 只能包含字母数字字符以及下划线(A-z、0-9和 _);
· 必须以字母或者下划线字符开始;
· 不能包含空格;
· 区分大小写。
//PHP 没有声明变量的命令。
//变量在第一次赋值时被创建:
<?php
$txt="Hello world!";
$x=5;
$y=10.5;
?>
2.4.2全局变量
在函数外部定义的变量,称为全局变量,全局变量可以在任意位置访问。但php中变量的访问规则默认为不向上级查找变量,所以函数内部的变量无法直接获取全局变量。
如何访问全局变量:
2.4.2.1 $GLOBALS
格式:$GLOBALS[变量名],其中变量名不带$。
<?php
$x='global x';
function myTest(){
//echo $x;//报错
//正确写法
echo $GLOBALS['x'];
//在函数中创建全局变量
$GLOBALS['y'] = $GLOBALS['x'] + $GLOBALS['y'];
}
myTest();
echo $y;
?>
2.4.2.2 global关键字
<?php
$x=5;
$y=10;
function myTest(){
global $x,$y;
$y=$x+$y;
}
myTest();
echo $y; // 输出 15
?>
2.4.3局部变量
函数内部声明的变量是局部变量,仅能在函数内部访问。
2.4.4超级全局变量
2.4.4.1 $GLOBALS
$GLOBALS是PHP的一个包含所有全局变量的数组,可以在任意位置使用。
2.4.4.2 $_SERVER
$_SERVER是一个包含了头信息(header)、路径(path)等信息的数组。
2.4.4.3 $_POST / $_GET
$_POST / $_GET被广泛应用于收集表单数据,常用于ajax请求等操作。
2.4.4.4 $_COOKIE
用于收集前端发送过来的cookie数据。
2.4.4.5 $_REQUEST
变量包含了 $_GET、$_POST和 $_COOKIE 的内容。
服务器版cookie。
2.4.4.7 $_FILES
2.5常量
2.5.1规范
· 命名规则与变量一致,但常量名不需要加 $ 修饰符。
· 常量值被定义后,在脚本的其他任何地方都不能被改变。
· 默认是全局作用域,可以在整个运行的脚本的任何地方使用。
· 常量名建议全部大写。
2.5.2格式
define(name,value);
name:必选参数,常量名称,即标志符。
value:必选参数,常量的值。
define("EN_NAME", "laoxie"); 。
2.6运算符
· 算术运算符:
+, -, *, /, %;
取反- 。
· 赋值运算符:
· 递增/递减运算符
· 比较运算符:
等于:x == y;
恒等于:x === y;
不等于:x != y ,x <> y;
不恒等于:x !== y;
大于:x > y;
小于:x < y;
大于等于:x >= y;
小于等于:x <= y 。
· 逻辑运算符:
与:x and y,x && y;
或:x or y,x || y;
异或:x xor y;
非:!x;
· 三元运算符:
格式:expr1 ? expr2 : expr3。
2.7条件语句
与javascript一致。
· if语句
· switch语句
2.8循环语句
与javascript一致。
· while
· do…while
· for
3数据类型
· String(字符串);
· Integer(整型);
· Float(浮点型);
· Boolean(布尔型);
· Array(数组);
· Object(对象);
· NULL(空值)。
3.1 String
3.1.1 并置运算符‘.’
<?php
$txt1="你是我的小呀小苹果";
$txt2="怎么爱你都不嫌多";
echo $txt1 . ", " . $txt2;
?>
3.1.2 strlen()
获取字符串长度,得到的字符的字节数。
3.1.3 strpos()
查找某个字符在字符串中的索引,如果未找到匹配,则返回 false。
strpos("Hello world!","world");//=>6
3.2 Array
数组是一个能在单个变量中存储多个值的特殊变量。
3.2.1类型
· 数值数组 - 带有数字索引值的数组。
· 关联数组 - 带有指定的键的数组,每个键关联一个值。
· 多维数组 - 包含一个或多个数组的数组。
3.2.2创建数组
使用array()函数创建
//数值数组
$cars=array("Volvo","BMW","Toyota");
//关联数组
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
3.2.3数组方法
1. count() 获取数组长度。
2. in_array() 判断某个值是否存在数组中。
3. array_slice() 从数组中取出一段。
3.2.4遍历数组
3.2.4.1 for
一般用于遍历数值数组。
3.2.4.2 foreach
一般用于遍历关联数组。
<?php
//遍历数值数组:for循环
$cars=array("Volvo","BMW","Toyota");
$arrlength=count($cars);
for($x=0;$x<$arrlength;$x++){
echo $cars[$x] . "<br>";
}
//遍历关联数组:foreach..as
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
foreach($age as $x=>$x_value){
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
?>
3.2.5数组排序
· sort() 对数组进行升序排列。
· rsort() 对数组进行降序排列。
· asort() 根据关联数组的值,对数组进行升序排列。
· ksort() 根据关联数组的键,对数组进行升序排列。
· arsort() 根据关联数组的值,对数组进行降序排列。
· krsort() 根据关联数组的键,对数组进行降序排列。
4函数
4.1内建函数
PHP 的真正威力源自于它的函数。在 PHP中,提供了超过 1000个内建的函数,请参考文档。
4.2自定义函数
· 参数:
参数默认值。
· return返回值:
function add($x,$y){
$total=$x+$y;
return $total;
}
5面向对象
5.1类
5.1.1定义一个类
· 类使用 class 关键字后加上类名定义。
· 类名后的一对大括号{}内可以定义变量和方法。
· 类的变量使用 var 来声明, 变量也可以初始化值。
· 函数定义类似 PHP 函数的定义,但函数只能通过该类及其实例化的对象访问。
<?php
class Person{
// 成员属性
var $name;
var $age = 18;
//成员方法
function setName($name){
$this->name = $name;
}
function getAge(){
return $this->age;
}
}
?>
5.1.2实例化对象
$p = new Person();
5.1.3调用成员属性/方法
在实例化对象后,我们可以使用‘->’操作该对象调用成员属性/方法。
$p->setName('老谢');
$p->name;
5.1.4构造函数
__construct构造函数是一种特殊的方法。主要用来在创建对象时初始化对象,写在创建对象的语句中。
class Web{
function __construct( $par1, $par2 ) {
$this->url = $par1;
$this->title = $par2;
}
}
5.1.5指针对象
1. $this:this是指向对象实例的一个指针。
2. self:self是对类本身的一个引用。
3. parent:parent是对父类的引用。
5.1.6访问控制
PHP 对属性或方法的访问控制,是通过在属性/方法前面添加关键字来实现。
· public(公有,默认):公有的类成员可以在任何地方被访问。
· private(私有):私有的类成员只能在类本身中访问。
· protected(受保护):受保护的类成员只能在类本身、子类、父类中访问。
· static(静态):声明类属性或方法为静态,就可以不实例化类而直接访问
· 访问方式:类名::方法。
PS:
- 类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。
- 类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。
class Person{
// 成员属性
var $type = '人类';
// 构造函数
function __construct($name,$age){
// 成员属性
$this->name = $name;
$this->age = $age;
}
// 成员方法
// 公有
public function eat(){
echo "我叫{$this->name},今年{$this->age}岁<br>";
}
// 私有
private function coding(){
echo "coding html5<br>";
$this->eat();
}
// 受保护
protected function doo(){
// 在类内部可调用私有方法
$this->coding();
}
}
5.2继承
使用关键字 extends 来继承一个类,继承后子类就拥有父类的属性和方法(私有除外),格式如下:
class Man extends Person {
// 添加成员函数
function setAge($age){
$this->age = $age;
}
//重写方法
function setName($name){
$this->name = $name;
return $name;
}
}
私有属性/方法不能被继承。
6生成动态页面
6.1动态页面传参
· $_GET
· $_POST
· $_REQUREST
6.2 session
· session_start():启动新会话;
· session_destroy():销毁一个会话中的全部数据;
· time():获取当前时间,返回自1970年 1月 1日 0时到当前时间的秒数。
session_start();
if(!isset($_SESSION['last-access'])){
$_SESSION['last-access'] = time();
}
//超过60s为超时
$overtime = (time() - $_SESSION['last-access']) > 60;
用户登录超时自动退出。
7编写后台数据API接口
利用php编写数据接口。
7.1本地数据
7.1.1直接返回数据
1. json_encode();
把数据转成字符串。php5.4+ 使用JSON_UNESCAPED_UNICODE防止中文转义。如:echo json_encode($current,JSON_UNESCAPED_UNICODE);
2. json_decode(json,assoc);
把字符串转成数组/对象。json:待解码的json string 格式的字符串;assoc:默认false返回object,当该参数为true时,将返回array。
7.1.2文件的读取与写入
7.1.2.1 fopen(filename,mode):打开文件
使用fopen函数打开文件时,你首先需要明确:
1.打开文件干什么?是读文件中的数据呢,还是将数据写入文件,亦或者读写文件;
2.另外你需要考虑如果文件中已经存在相关数据,你是覆盖原有文件中的数据呢,还是仅仅将新数据添加至文件末尾。
其中,filename为文件路径,mode为打开文件的模式。
文件模式:
1. r 以只读方式打开文件,从文件头开始读。
2. r+ 以读写方式打开文件,写入时以追加的方式写入文件。
3. w 以写入方式打开文件,从文件头开始写。如果文件不存在则尝试创建,如果文件存在,则先删除文件中的内容。
4. w+ 以读写方式打开文件,从文件头开始读写。如果文件不存在则尝试创建,如果文件存在,则先删除文件中的内容。
5. a 以写入方式打开,从文件末尾开始追加写。如果文件不存在则尝试创建。
6. a+ 以读写方式打开,从文件末尾开始追加写入或者读。如果文件不存在则尝试创建。
7.1.2.2 fread():读取内容
7.1.2.3 fwrite():写入内容
7.1.2.4 fclose():关闭文件,避免资源占用
7.1.2.5 filesize():读取文件字符长度
//以读取模式打开文件
$myfile = fopen('./data/weibo.json', 'r');
//读取文件内容
$content = fread($myfile, filesize('./data/weibo.json'));
//关闭文件,减少资源占用
fclose($myfile);
7.1.3文件上传
通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。
7.1.3.1上传方式
· 传统表单提交:
method: “post”;
enctype: “multipart/form-data”。
· ajax提交:
formData:可以异步上传二进制文件;
Post。
7.1.3.2文件信息
· $_FILES["file"]["name"] 上传文件的名称。
· $_FILES["file"]["type"] 上传文件的类型。
· $_FILES["file"]["size"] 上传文件的大小,以字节计。
· $_FILES["file"]["tmp_name"] 存储在服务器的文件的临时副本的名称。
· $_FILES["file"]["error"] 由文件上传导致的错误代码。
PS:第一个参数是表单的name属性。
7.1.3.3 move_unloaded_file(temp,url)移动临时文件到指定目录
7.1.3.4 iconv(current,out,str)修改文件编码
7.2获取远程JSON数据
爬虫
原理:获取页面所有内容,并利用正则匹配所需内容。
1.file_get_contents($url);
2.preg_match_all($reg,$str,$res);
3.preg_match($reg,$str,$res)。