php入门笔记3


PHP进阶.

  • HTTP协议
  • 会话技术
  • 文件操作
  • 图像处理
  • 函数进阶

一、 HTTP协议.

1、 什么是HTTP协议.

Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本本地浏览器传送协议

HTTP是一种基于请求与响应式的协议,即浏览器发送请求,服务器做出响应。在交互过程中,请求消息与响应消息统称为HTTP消息。

2、HTTP消息.

  • 消息头
    • 保存消息时间、系统信息等内容
  • 实体内容
    • 包存网页或表单数据

请求网址(Request URL)

请求方法(Request Method)

状态码(Status Code)

IP地址(Remote Address)

响应头(Response Headers):是服务器返回的信息

请求头(Request Headers):是发送本次请求时的浏览器的信息

3、 HTTP请求.

3.1、请求方式(常用).

  • GET

    • 数据通过URL地址的参数进行传递,提交的数据是可见的(对于用户)
    • 传输数据量(不超过1KB)受限于URL的长度
  • POST

    • 通常用于表单和文件上传
    • 通过实体内容传递数据
    • 传输数据量大小理论上没有限制,但服务端会进行限制
    • 因为POST内容隐藏在实体中,POST相对GET要安全一些

3.2、获取请求信息(PHP).

PHP接收到浏览器端的请求,会将相关信息保存在$_SERVER超全局变量数组中,我们通过该数组就可以获得请求消息

<pre>
<?php var_dump($_SERVER) ?>
</pre>

4、HTTP响应.

消息头 说明
Location 控制浏览器显示哪个页面
Server 服务器的类型
Content-Type 服务器发送内容的类型和编码类型
Last-Modified 服务器最后一次修改的时间
Date 响应网站的时间
在默认情况下,响应消息头由服务器自动发出。通过PHP的header()函数可以自定义响应消息头。.
//设定编码格式
header('Content-Type:text/html;charset=utf-8');
//响应404消息
header('HTTP/1.1 404 Not Found');
//页面重定向
header('Location: login.php');

4.1、PHP远程请求.

HTTP协议是一种通信协议,除了浏览器,其他软件也可以通过HTTP协议与服务器交换信息。虽然PHP运行于服务器端,但有时服务器也需要向另一台服务器请求数据,这时可以通过PHP来实现。

  • file_get_contents()

    file_get_contents()函数用于从一个文件中读取内容,返回字符串。该函数既可以读取本地文件,也可以读取远程地址文件。

    //请求远程地址
    $html = file_get_contents('http://www.test.com');
    //获取响应消息头
    var_dump($http_response_header);
    //输出返回信息
    echo '<hr>'.htmlspecialchars($html);
    

    $http_response_header变量是PHP的内置变量,用于自动保存响应消息。

  • cURL扩展

    PHP中提供的cURL扩展可以高效地进行远程请求。在使用cURL扩展前应确保php.ini中已经开启了cURL扩展。

    //初始化一个cURL会话
    $ch = curl_init();
    //设置请求选项,包括具体的URL
    curl_setopt($ch, CURLOPT_URL, 'http://www.itcast.cn');
    //设定返回的信息中包含响应消息头
    curl_setopt($ch, CURLOPT_HEADER, 1);
    //设定curl_exec()函数将结果返回,而不是直接输出
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    //执行一个cURL会话
    $html = curl_exec($ch);
    //释放cURL句柄,关闭一个cURL会话
    curl_close($ch);
    //输出返回信息
    echo htmlspecialchars($html);

二、会话技术.

当用户通过浏览器访问网站时,通常情况下,服务器需要对用户的状态进行跟踪。例如,当用户通过用户名和密码进行登录时,如果登录成功,服务器应该记住该用户的登录状态。
在Web开发中,服务器跟踪用户信息的技术称为会话技术。

1、Cookie技术.

Cookie是网站为了辨别用户身份而存储在用户本地终端上的数据。因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。

Cookie就是解决HTTP无状态性的一种技术,服务器可以设置或读取Cookie中包含的信息,借此可以跟踪用户与服务器之间的会话状态,通常应用于保存浏览历史、保存购物车商品和保存用户登录状态等场景。

缺点.
  • Cookie被附加在每个HTTP请求中,无形中增加了数据流量。
  • Cookie在HTTP请求中是明文传输的,所以安全性不高,容易被窃取。
  • Cookie存储于浏览器,可以被篡改,服务器接收后必须先验证数据的合法性。
  • 浏览器限制Cookie的数量和大小(通常限制为50个,每个不超过4KB),对于复杂的存储需求来说是不够用的。

1.1、Cookie的使用.

​ 在PHP中,使用setcookie()函数可以创建或修改Cookie。

bool setcookie ( 
       string $name        //Cookie名称
       string $value = '',     //Cookie值
       int $expire = 0,     //有效期(时间戳)
       string $path = '',     //有效路径(默认为当前目录和子目录有效)
       string $domain = '',     //有效域名(可允许二级域名下访问Cookie)
       bool $secure = false ,     //是否只允许HTTPS安全连接访问
       bool $httponly = false      //是否只允许HTTP访问(可阻止JavaScript访问Cookie)
)

参数$name是必需的,其他参数都是可选的

setcookie('city', '北京市');                    //未指定过期时间,在会话结束时过期
setcookie('city', '北京市', time()+1800);        //半小时后过期
setcookie('city', '北京市', time()+60*60*24); //一天后过期
setcookie('city', '', time()-1);                //立即过期(删除COOKIE)
  • setcookie()函数的第三个参数是时间戳,当省略时,Cookie仅在本次会话有效,当用户关闭浏览器时,会话就会结束。
  • 除了可以通过PHP操作Cookie,使用JavaScript也可以操作Cookie,如果只是保存用户在网页中的偏好设置,可以直接用JavaScript操作Cookie,无需服务器进行处理。

1.2、读取Cookie.

对于浏览器发送的Cookie数据,在PHP中可以使用超全局数组变量$_COOKIE来接收。

//判断Cookie中是否存在city数据
if(isset($_COOKIE['city'])){
      $city = $_COOKIE['city'];  //从COOKIE中获取City数据
}else{
    //Cookie中的city不存在
    //在这可以设置cookie
}

$city=isset($_COOKIE['city'])?$_COOKIE['city']:'';

需要注意的是,当PHP第一次通过setcookie()创建Cookie时,$_COOKIE中没有这个数据;只有当浏览器下次请求并携带Cookie时,才能通过$_COOKIE获取到相关信息。

1.3、查看Cookie.

当服务器端PHP通过setcookie()向浏览器端响应Cookie后,浏览器就会保存Cookie,在下次请求时会自动携带Cookie。

对于普通用户来说,Cookie是不可见的,但Web开发者可以通过“F12”开发者工具查看Cookie。在开发者工具中切换到【Network】-【Cookies】。

  • Cookie在浏览器中是根据域名分开保存的,每个Cookie具有名称(Name)、值(Value)、域名(Domain)、路径(Path)、有效期(Expires)等属性。
  • 在访问Cookie时,不同路径之间是隔离的,路径可以向下继承。例如,路径为“/admin/”的Cookie可以在admin的子目录中访问,但在admin的上级目录中无法访问。

2、Session技术.

Session在网络应用中称为“会话”,指的是用户在浏览某个网站时,从进入网站到关闭网站所经过的这段时间。
Session技术是一种服务器端的技术,它的生命周期从用户访问页面开始,直到断开与网站的连接时结束。Session通常用于保存用户登录状态、保存生成的验证码等。

当PHP启动Session时,服务器会为每个用户的浏览器创建一个供其独享的Session文件。

  • 每一个Session都具有一个唯一的会话ID,用于标识不同的用户。
  • 会话ID分别保存在浏览器端和服务器端两个位置,浏览器端通过Cookie保存,服务器端以文件的形式保存在指定的Session目录中。

2.1、查看SessionID.

Session文件的保存目录是php.ini中的配置项“session.save_path”指定的,其默认路径位于“C:\Windows\Temp”,打开这个目录可以查看Session文件:

2.2、Session的使用.

  • 在使用Session之前,需要通过session_start()函数先启动Session
  • 当启动后,即可通过超全局变量$_SESSION添加、读取或修改Session中的数据。
session_start();                  //开启SESSION
$_SESSION['username'] = '小明';          //向SESSION添加数据(字符串)
$_SESSION['info'] = [1, 2, 3];           //向SESSION添加数据(数组)
if(isset($_SESSION['test'])){          //判断SESSION中是否存在test
      $test = $_SESSION['test'];          //读取SESSION中的test
}
unset($_SESSION['username']);          //删除单个数据
$_SESSION = [];                  //删除所有数据
session_destroy();              //结束当前会话

使用“$_SESSION= []”方式可以删除Session中的所有数据,但是Session文件仍然存在,只不过它是一个空文件。
如果需要将这个空文件删除,可以通过session_destroy()函数来实现。

3、输出缓冲.

在PHP中,输出缓冲(Output Buffer)是一种缓存机制,它通过内存预先保存PHP脚本的输出内容,当缓存的数据量达到设定的大小时,再将数据传输到浏览器。

输出缓冲机制解决了当有实体内容输出后,再使用header()、setcookie()、session_start()等函数无法设置HTTP消息头的问题,因为消息头必须在实体内容之前被发送,通过输出缓冲,可以使实体内容延缓到HTTP消息头的后面被发送。

输出缓冲在PHP中是默认开启的。
在php.ini中,它的配置项为“output_buffering = 4096”,表示输出缓冲的内存空间为4KB。

通过PHP的ob函数可以控制输出缓冲,常用函数如下:

函数名 作用
ob_start() 启动输出缓冲
ob_get_contents() 返回当前输出缓冲区的内容
ob_end_flush() 向浏览器发送输出缓冲区的内容,并禁用输出缓冲
ob_end_clean() 清空输出缓冲区的内容,不进行发送,并禁用输出缓冲
ob_start() 启动输出缓冲

三、文件操作.

1、文件上传.

1.1、文件上传表单.

要想完成文件上传,在设计表单时需要满足以下两个需求:

  • 表单提交方式设置为POST方式。
  • enctype属性的值设置为“multipart/form-data”。
<form method="post" enctype="multipart/form-data">
      <input type="file" name="upload" />
      <input type="submit" value="上传" />
</form>

默认情况下,该元素只能上传一个文件。当需要上传多个文件时,可以编写多个标签,或者为一个标签添加multiple属性。

1.2、处理上传文件.

PHP默认将通过HTTP上传的文件保存到服务器的临时目录下,该临时文件的保存期为脚本的周期,即PHP脚本执行期间。

在处理上传文件时,通过sleep(seconds)函数延迟PHP文件执行的时间,可以在系统临时目录“C:\Windows\Temp”中查看临时文件。

  • 提交表单后,上传的文件会以随机生成的文件名保存在系统临时目录中。
  • PHP执行完毕后,图中方框内的临时文件就会被释放掉。

1.3、获取文件信息.

在PHP释放上传文件之前,在PHP脚本中可以用超全局变量$_FILES来获取上传文件的信息。
该变量的外层数组保存上传文件的“name”属性名,内层数组保存的是该上传文件的具体信息

//假设PHP收到来自<input type="file" name="upload" />上传的文件
echo $_FILES['upload']['name'];         //上传文件名称,如photo.jpg
echo $_FILES['upload']['size'];               //上传文件大小,如879394(单位是Byte)
echo $_FILES['upload']['error'];           //上传是否有误,如0(表示成功)
echo $_FILES['upload']['type'];               //上传文件的MIME类型,如image/jpeg
echo $_FILES['upload']['tmp_name']; //上传后临时文件名,如C:\Windows\Temp\php9BA5.tmp

$_FILES数组中的 error 有 7 个值,分别为 0、1、2、3、4、6、7。

0 表示上传成功
1 表示文件大小超过了php.ini中upload_max_filesize选项限制的值
2 表示文件大小超过了表单中max_file_size选项指定的值
3 表示文件只有部分被上传
4 表示没有文件被上传
6 表示找不到临时文件夹
7 表示文件写入失败

1.4、上传文件的保存.

  • 文件上传成功后会暂时保存在系统的临时文件夹中。
  • 为了保存文件到指定的目录中,需要使用 move_uploaded_file()函数进行操作。
//判断是否有“name=upload”的文件上传,是否上传成功
if(isset($_FILES['upload']) && $_FILES['upload']['error']==0){
      //上传成功,将文件保存到当前目录下的“uploads”目录中
      if(move_uploaded_file($_FILES['upload']['tmp_name'], './uploads')){
            echo '文件上传成功';
      }
}

需要注意的是,移动文件的目标路径“./uploads”必须是已经存在的目录,否则会移动失败。

2、文件基本操作.

2.1、文件类型.

文件类型主要分为文件和目录,PHP可以通过filetype()函数来获取文件类型。

echo filetype('./uploads/1.jpg');     //输出结果:file
echo filetype('./uploads');         //输出结果:dir
  • 在Windows系统中,PHP只能获得“file”、“dir”和“unknown”三种文件类型。
  • 在Linux系统中,还可以获取block(块设备文件)、char(字符设置)、link(符号链接)等文件类型。

在操作一个文件时,如果该文件不存在,会发生错误。为了避免这种情况发生,可以通过file_exits()is_file()is_dir()函数,来检查文件或目录是否存在。

var_dump( file_exists('./uploads/1.jpg') );     //文件存在,输出:bool(true)
var_dump( file_exists('./uploads/2.jpg') );     //文件不存在,输出:bool(false)
var_dump( is_file('./uploads/1.jpg') );     //输出结果:bool(true)
var_dump( is_dir('./uploads') );         //输出结果:bool(true)

2.2、文件属性.

函数 功能
int filesize(string $filename ) 获取文件大小
int filectime(string $filename) 获取文件的创建时间
int filemtime(string $filename) 获取文件的修改时间
int fileatime(string $filename) 获取文件的上次访问时间
bool is_readable(string $filename) 判断给定文件是否可读
bool is_writable(string $filename) 判断给定文件是否可写
bool is_executable(string $filename) 判断给定文件是否可执行
array stat(string $filename) 给出文件的信息

由于PHP中int数据类型表示的数据范围有限,所以filesize()函数对于大于2GB的文件,并不能准确获取其大小,需斟酌使用。

2.3、文件操作.

在程序开发过程中,经常需要对文件进行复制、删除以及重命名等操作。针对这些功能,PHP提供了相应的函数

函数 功能
bool copy(string $source, string $dest) 用于实现拷贝文件的功能
bool unlink(string $filename) 用于删除文件
bool rename(string $old_name, string $new_name) 用于实现文件或目录的重命名功能

2.4、文件读写.

在PHP中,对于文件的读写提供了许多函数。其中,基于文件的句柄的函数可以对大文件进行流式读写操作;而对于小文件,直接进行读写效率更高。

函数 功能
resource fopen(string $filename, string $mode) 打开文件,获取文件句柄
bool fclose(resource $handle) 关闭文件句柄
string fread(resource $handle, int $length) 通过句柄读取文件,获取指定长度字符串
int fwrite(resource $handle, string $string [,int $length]) 通过句柄写入文件
string fgetc(resource $handle) 通过句柄读取文件,每次读取一个字节。
string fgets(resource $handle [,int $length]) 通过句柄读取文件,每次读取一行内容
array file(string $filename) 将文件读取到按行分割的数组中
string file_get_contents(string $filename) 读取文件
int file_put_contents(string $filename, mixed $data) 写入文件
//定义下载文件名
$name = 'download.zip';
//获取文件大小
$size = filesize('./data.zip');
//设置HTTP响应消息为文件下载
header('content-type:octet-stream');
header('content-length:'.$size);
header('content-disposition:attachment;filename="'.$name.'"');
$fp = fopen('./data.zip', 'r'); //以只读方式打开文件
//读取文件并输出
$buffer = 1024;        //读取缓冲
$count = 0;        //已读取的大小
while(!feof($fp) && ($size - $count > 0)){//判断文件是否全部读取
      echo fread($fp, $buffer);
      $count += $buffer;
}
//关闭文件,停止脚本
fclose($fp);exit;

3、目录基本操作.

3.1、创建目录.

在进行文件操作时,经常需要创建目录。通过mkdir()函数可以实现目录的创建。

mkdir('./path');            //在当前目录下创建一个path目录
mkdir('./path1/path2', 0777, true);     //在当前目录下递归创建path1/path2目录

3.2、解析路径.

在程序中经常需要对文件路径进行解析操作,如路径中的文件名和目录等。PHP提供了一些函数实现目录的解析操作。

函数 功能
string basename(string $path [, string $suffix ]) 返回路径中的文件名
string dirname(string $path) 返回路径中的目录部分
mixed pathinfo(string $path [, int $options ]) 以数组的形式返回路径信息,包括目录名、文件名等

需要注意的是,在处理带有中文的路径时,应注意操作系统对于文件路径的编码问题。只有PHP程序设置的编码与操作系统的编码统一,才能正确处理中文路径。

3.3、遍历目录.

在程序中经常需要对某个目录下的子目录或文件进行遍历。为此,PHP中内置了相应的函数用于实现目录或文件的遍历。

函数 功能
resource opendir(string $path) 打开一个目录句柄
string readdir(resource $dir_handle) 从目录句柄中读取条目
void closedir(resource $dir_handle) 关闭目录句柄
void rewinddir(resource $dir_handle) 倒回目录句柄
array glob(string $pattern [, int $flags = 0 ]) 寻找与模式匹配的文件路径
function getDirSize($path){
      $size = 0;              //保存文件大小
      $handle = opendir($path);      //打开目录句柄
      while($name = readdir($handle)){
            if($name!='.' && $name !='..'){
                  $file = "$path/$name";
                  $size += is_dir($file) ? getDirSize($file) : filesize($file);
            }
      }
      closedir($handle);
      return $size;
}
echo '当前目录大小:'.getDirSize('./').'B';

四、图像处理.

1、GD库简介.

GD库是PHP处理图像的扩展库,它提供了一系列用来处理图像的函数,可以实现缩略图、验证码和图片水印等操作。
但由于不同的GD库版本支持的图像格式不完全一样,因此,从PHP的4.3版本开始,PHP捆绑了其开发团队实现的GD2库。它不仅支持GIF、JPEG、PNG等格式的图像文件,还支持FreeType、Type1等字体库。

  • 打开PHP的配置文件php.ini
  • 找到“;extension=php_gd2.dll”配置项,去掉前面的分号“;”注释
  • 保存PHP的配置文件php.ini,并重启Apache使配置生效
  • 通过phpinfo()函数可以查看GD库是否开启成功

2、图像的创建与输出.

2.1、创建图像资源.

在处理图像前,需要先创建图像资源。PHP有多种创建图像的方式,可以基于一个已有的文件创建,也可以直接创建一个空白画布。

函数 功能
resource imagecreate(int $width, int $height) 创建指定宽高的空白画布图像
resource imagecreatetruecolor (int $width, int $height ) 创建指定宽高的真彩色空白画布图像
resource imagecreatefromgif(string $filename) 从给定的文件路径创建GIF格式的图像
resource imagecreatefromjpeg(string $filename) 从给定的文件路径创建JPEG格式的图像
resource imagecreatefrompng(string $filename) 从给定的文件路径创建PNG格式的图像

2.2、填充颜色.

在使用PHP创建空白画布的时候,并不能直接给画布指定颜色。为画布填充颜色时,可以通过imagecolorallocate()函数来完成。

//创建空白画布资源
$im = imagecreate(200,100);
//填充颜色(参数依次为:图像资源、红色数值、绿色数值,蓝色数值)
imagecolorallocate($im, 100, 110, 204);

imagecolorallocate()函数用于为画布填充颜色,该函数的第2~4个参数分别表示RGB中的三种颜色。

2.3、图像输出.

在完成图像资源的处理后,可以将图像输出到网页中,或者保存到文件中。

//创建空白画布并填充颜色
$im = imagecreate(200, 100);
imagecolorallocate($im, 100, 110, 204);
//设置HTTP响应消息,将文档类型设置为GIF图片
header('Content-Type: image/gif');
//将图像资源以GIF格式输出
imagegif($im); //该函数第2个参数指定图像保存路径,省略时直接输出到网页

在在输出时应通过header()函数告知浏览器接下来发送的数据是一张GIF格式的图片,否则浏览器不会以图片的形式展现内容。

3、绘制文本和图形.

3.1、绘制文本.

在PHP中,绘制文本通常用于开发验证码、文字水印等功能。通过imagettftext()函数可以将文字写入到图像中,该函数的参数说明如下。

array imagettftext(
      resource $image,    //图像资源(通过imagecreate()创建)
      float $size,     //文字大小(字号)
      float $angel,     //文字倾斜角度
      int $x,         //绘制位置的x坐标
      int $y,         //绘制位置的y坐标
      int $color,     //文字颜色(通过imagecolorallocate()创建)
      string $fontfile,     //文字字体文件(即.ttf字体文件的保存路径)
      string $text    //文字内容
);

在使用imagettftext()函数时,需要给定字体文件,可以使用Windows系统中安装的字体文件(在C:\Windows\Fonts目录中),也可以通过网络获取其它字体文件放在项目目录下使用。

3.2、绘制基本图形.

图形的构成无论多么复杂,都离不开最基本的点、线、面。在PHP中,GD库提供很多绘制基本图形的函数,通过这些函数可以绘制像素点、线条、矩形、图形等。

函数 功能
imagesetpixel(resource $image, int $x, int ​$y, int $color) 绘制一个点,其中参数$x和​$y用于指定该点的坐标,$color用于指定颜色
imageline(resource $image, int ​$x1, int ​$y1, int ​$x2, int $y2, int $color) 用$color颜色在图像$image中从坐标(x1,y1)到(x2,y2)绘制一条线条
imagerectangle(resource $image, int ​$x1, int ​$y1, int $x2, int ​$y2, int $color) 用$color颜色在$image图像中绘制一个矩形,其左上角坐标为(x1,y1),右下角坐标为(x2,y2)
imageellipse(resource $image, int ​$cx, int ​$cy, int ​$w, int ​$h, int $color) 在$image图像中绘制一个以坐标(cx,cy)为中心的椭圆。其中,​$w和​$h分别指定了椭圆的宽度和高度,如果​$w和$h相等,则为正圆。成功时返回true,失败则返回false。
imagesetpixel(resource $image, int ​$x, int ​$y, int $color) 绘制一个点,其中参数$x和​$y用于指定该点的坐标,$color用于指定颜色
//创建画布、填充颜色、创建颜色
$im = imagecreate(200, 100);         //创建200*100大小的画布
imagecolorallocate($im, 255, 255, 255);     //为画布填充白色
$color = imagecolorallocate($im, 50, 50, 50);     //创建黑色
//绘制矩形
imagerectangle($im, 10, 10, 180, 90, $color);
//绘制文本(使用Windows自带的黑体字体)
imagettftext($im, 20, 0, 65, 60, $color, 'C:/Windows/Fonts/simhei.ttf', '矩形'); 
//输出图像
header('Content-Type: image/png'); 
imagepng($im); 

4、图像缩放与叠加.

在创建图像资源时,除了创建空白画布,还可以基于图片文件进行创建。当需要对图片进行缩放、叠加时,可以通过imagecopyresampled()函数来完成。

bool imagecopyresampled(
      resource $dst_image,     //目标图像资源
      resource $src_image,     //原图像资源
      int $dst_x,         //目标的x坐标
      int $dst_y,         //目标的y坐标
      int $src_x,         //原图的x坐标
      int $src_y,         //原图的y坐标
      int $dst_w,         //目标图像的宽
      int $dst_h,         //目标图像的高
      int $src_w,         //原图像的宽
      int $src_h         //原图像的高
)
//定义基本变量
$source = './1.jpg';    //原图路径
$dst_w = 200;    //目标宽度
$dst_h = 100;    目标高度
list($src_w, $src_h) = getimagesize($source);         //获取原图宽高
$src_im = imagecreatefromjpeg($source);         //创建原图资源
$dst_im = imagecreatetruecolor($dst_w, $dst_h);     //创建目标图像画布资源
//将原图缩放到目标图像中
imagecopyresampled($dst_im, $src_im, 0, 0, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
//保存到文件中(参数依次为图像资源、保存路径、JPEG压缩质量0~100)
imagejpeg($dst_im, './thumb_1.jpg', 100); 





//定义基本变量
$source = './1.jpg';    //原图路径
$target = './2.jpg';    //目标图路径
list($src_w, $src_h) = getimagesize($source); //获取原图的宽高
//创建图像资源
$src_image = imagecreatefromjpeg($source);
$dst_image = imagecreatefromjpeg($target);
//将原图叠加到目标图中
imagecopyresampled($dst_image, $src_image, 0, 0, 0, 0, $src_w, $src_h, $src_w, $src_h);
header('Content-Type: image/jpeg');
imagejpeg($dst_image);

五、函数进阶.

1、静态变量.

在函数中定义的局部变量,在函数执行完成后,就会被自动释放。当不希望函数中的局部变量被释放时,可以使用静态变量。
在实际开发中,函数执行完成后自动释放局部变量有利于节省内存空间,而静态变量会一直占用内存空间,因此在使用静态变量时一定要酌情考虑

function test(){
      static $a = 1; /    /声明静态变量,并赋值1
      return ++$a;     //静态变量$a自增1,然后返回
}
echo test();     //输出结果:2
echo test();     //输出结果:3

2、引用参数.

在变量赋值的时候,有传值赋值和引用赋值两种形式。同样,在函数进行参数传递时,也可以进行引用传参。
在编写函数时,在参数的前面加上“&”引用符号即可。

function test(&$a){
      ++$a;
}
$num = 1;
test($num);       //调用函数,引用传参
echo $num;       //输出结果:2
  • 当test()函数第1次调用时,函数内的$a引用了函数外部的变量$num。
  • 在函数中对$a进行自增运算时,$num的值也会随之改变。
  • 在实际开发中,通过引用传参可以在函数中直接修改变量的值。

3、可变参数

在PHP中,函数参数的数量可以是不固定的,可以通过func_get_args()获取调用时传递的所有参数,这些参数以数组的形式保存。

function test(){
      $params = func_get_args();    //获取调用时传递的参数,返回数组类型
      return implode('-', $params);
}
echo test(123, 456);     //输出结果:123-456
  • test()函数定义时,没有声明参数
  • 调用函数时传入的123、456两个参数
  • 在test()中通过func_get_args()函数获取到传递的参数

因此,在PHP中,函数的参数数量可以是不固定的

值得一提的是,在调用函数时,还可以使用call_user_func_array()函数以数组的形式传递参数。

function test($a, $b){
      return $a + $b;
}
echo call_user_func_array('test', [123, 456]);     //输出结果:579
  • call_user_func_array()函数的第1个参数表示需要调用的函数
  • call_user_func_array()函数的第2个参数表示传入的参数
  • 在传参时,数组的第1个元素将赋值给$a,数组的第2个元素将赋值给$b。
  • 当被调用的函数执行后,其返回值将作为call_user_func_array()函数的返回值进行返回。

文章作者: liuminkai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liuminkai !
评论
 上一篇
php入门笔记3 php入门笔记3
PHP进阶. HTTP协议 会话技术 文件操作 图像处理 函数进阶 一、 HTTP协议.1、 什么是HTTP协议. Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wi
2020-06-21
下一篇 
CSS入门(表现层) -- B站狂神说java笔记 CSS入门(表现层) -- B站狂神说java笔记
CSS入门(表现层) – B站狂神说java笔记. 1.什么是CSS.Cascading Style Sheets 层叠级联样式表 CSS:表现(美化页面) 字体、颜色、边距、高度、宽度、背景图、网页定位、网页浮动。。。 1.发展史.CSS
2020-06-20
  目录