PHP之MVC项目实战(二)

本文主要包括以下内容

  1. GD库图片操作
  2. 利用GD库实现验证码
  3. 文件上传
  4. 缩略图
  5. 水印

GD库图片操作

<?php$img = imagecreatetruecolor(500, 300);
//var_dumP($img);
//
//分配绿色
$green = imagecolorallocate($img, 0, 0xff, 0x0);
//var_dump($green);//fill
$result = imagefill($img, 0, 0, $green);
//var_dump($result);//导出
imagepng($img, './green.png');//
imagedestroy($img);

创建画布
imagecreatefromXXXX XXX表示格式:
//打开,利用已有的图片创建画布资源!
imagecreatefromjpeg
imagecreatefrompng,从png格式创建画布
imagecreatefromgif

操作画布
利用一个个的工具函数,完成画布的处理的!
选择颜色,分配颜色
如果需要使用某个颜色,在画布上操作,一定要先将颜色分配到画布上!
利用函数:
imagecolorallocate(画布,颜色).向画布上分配颜色
颜色是RGB,红绿蓝,颜色需要三个参数,分别表示R,G,B的值
颜色标识= imagecolorallocate(画布,R,G,B)
每个颜色值,是一个整型!
0-255十进制
0x0 - 0xff 十六进制

填充画布
利用函数:imagefill完成填充
imagefill(画布,填充位置X, 填充位置Y,颜色);
将像素周围的连续的并且颜色相同的区域可以完成填充!
填充位置使用填充点的坐标表示:
图片位置的原点为 左上角!坐标为(0,0) 因此右下角的坐标是?(width-1,height-1 499,299)

将画布导出成图片
imageXXXX,XXX表示格式
imagejpeg
imagegif 导出成gif格式
imagepng
一个画布可以导出多次,而且是任意格式!

imagepng(画布,保存文件);

销毁资源
imagedestroy();

利用GD库实现验证码

<?php
//require '111.php';$rand_bg_file = './captcha/captcha_bg' . mt_rand(1, 5) . '.jpg';
//echo $rand_bg_file;
//创建画布
$img = imagecreatefromjpeg($rand_bg_file);//绘制边框
$white = imagecolorallocate($img, 0xff, 0xff, 0xff);
//不填充矩形
imagerectangle($img, 0, 0, 144, 19, $white);//写码值
//生成码值,随机的4个只包含大写字母,和数字的字符串!
$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';//32 个字符
//随机取4个
$captcha_str = '';
for($i=1,$strlen=strlen($chars); $i<=4; ++$i) {$rand_key = mt_rand(0, $strlen-1);$captcha_str .= $chars[$rand_key];
}
//保存到session中
@session_start();
$_SESSION['captcha_code'] = $captcha_str;
//echo $captcha_str;
//写//先确定颜色,白黑随机!
$black = imagecolorallocate($img, 0, 0, 0);
if(mt_rand(0, 1) == 1 ) {$str_color = $white;
} else {$str_color = $black;
}imagestring($img, 5, 60, 3, $captcha_str, $str_color);//保存
//imagejpeg($img, './captcha.jpg');//输出到文件内!
//告知浏览器,发送的是jpeg格式的图片
header('Content-Type: image/jpeg; charset=utf-8');//echo 'itcast';
imagejpeg($img);//输出到浏览器端!//销毁资源
imagedestroy($img);

绘制边框
画一个不填充的矩形!
利用函数
imagerectangle()完成

imagerectangle(画布,左上角X,左上角Y,右下角X,右下角Y,笔触颜色);
利用左上角,与右下角的坐标确定矩形范围!

写验证码

写到 画布上
利用函数
imagestring()
imagestring(画布,字体大小,位置X,Y,字符串,颜色);
其中imagestring典型的是使用内置字体!(不支持中文)。字体大小1-5.5最大!

导出,保存
imagejpeg();

将验证码展示到页面上

典型的:
使用一个php文件,直接输一个图片内容!
直接输出的请求的浏览器端
imagejpeg(画布,保存文件)
如果没有第二个参数,则是直接输出!

此时应该在输出图片内容到浏览器之前,告知浏览器,当前内容是二进制的图片内容!
header();//
header(‘Content-Type: text/html; charset=utf-8’);//告知浏览器发送的内容以utf8编码形式的文件html数据!

此时,使用 img标签的src属性,请求一个生成图片的php程序即可显示图片!

如果向浏览器发送的是图片,则如果有错误浏览器不会显示,会将报错信息当作图片内容看待,所以此时如果要调错,则此时
要把header(‘Content-Type:image/jpeg’)先注释!需要严格输出的时候,PHP的开头

文件上传

数据在存储或者传输时,存在两种编码:字节码,二进制码!
普通的字符串上传到服务器需要字节编码!
但是将文件上传的编码是: 二进制编码!

但是,默认的,浏览器是不会处理二进制编码的!将所有的数据都当字节码字符串处理!

因此上传文件的第一个工作:
告知浏览器,当前表单内,有需要被二进制编码的数据!(编码的数据是由多种编码组成)
利用表单的属性:
enctype=”multipart/form-data”

<form action="112.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="50000" />
商品名:<input type="text" name="goods_name" />
<br>
商品图片:<input type="file" name="goods_img" />
<br>
<input type="submit"></form>

此时浏览器在碰到文件域时,就知道以二进制形式编码!

此时,提交到服务器上表单内的所有数据(字符串,文件)

服务器的PHP代码来处理数据:
对字符串的处理:保存$_POST变量内(内存中)
对文件的处理:将接收到文件,保存到服务器系统的临时目录下。有效期,当前脚本结束!

用户需要在php的脚本执行周期内,将临时文件 持久化(拷贝到别的地方)
利用函数:
move_uploaded_file();//移动已经上传的文件
移动结果 = move_uploaded_file(临时文件,目标文件)
上传的临时文件的信息,被保存到超全局数组变量$_FILES中!
为每个上传的文件,整理5个信息:

  • name: 原始文件名
  • type: 类型。image/jpeg text/html 网络上标识资源类型方法。称之为MIME(多用途internel邮件扩展类型)类型。
  • tmp_name:临时文件名
  • error:错误标号(0,123467)
  • size:大小,字节Byte
<?php/*** 拿到一个上传文件的信息* 判断其合理和合法性,移动到指定目标** @param $file array 包含了5个上传文件信息的数组** @return 成功,目标文件名;失败:false*/
function upload($file) {//判断是否有错误if($file['error'] != 0 ) {//文件上传错误switch ($file['error']) {case 1:echo '文件太大,超出了php.ini的限制';break;case 2:echo '文件太大,超出了表单内的MAX_FILE_SIZE的限制';break;case 3:echo '文件没有上传完';break;case 4:echo '没有上传文件';break;case 6:case 7:echo '临时文件夹错误';break;}return false;}//判断类型$allow_types = array('image/jpeg', 'image/png', 'image/gif');if(!in_array($file['type'], $allow_types)) {echo '类型不对';return false;}//判断大小$max_size = 100000;//100kif($file['size'] > $max_size) {echo '文件过大';return false;}//处于安全性的考虑,判断是否是一个真正的上传文件:if( !is_uploaded_file($file['tmp_name'])) {echo '上传文件可疑';return false;}//移动//通常都会为目标文件重启名字//原则是:不重名,没有特殊字符,有一定的意义!$dst_file = uniqid('upload_') . strrchr($file['name'], '.');if (move_uploaded_file($file['tmp_name'], $dst_file)) {//移动成功,上传完毕!return $dst_file;} else {//失败echo '移动失败';return false;}
}$result = upload($_FILES['goods_img']);
echo '<hr>';
var_dump($result);

代码解释
唯一字符串 = uniqid(前缀)函数可以得到一个唯一的字符串!并且可以指定前缀:
strrchr()。找到某个子字符串的最后出现位置,从该位置开始,截取到字符串的最后!

错误类型

  • 文件太大,超过了php的对上传文件的最大限制
    可以php的配置文件中修改:
    PHP对所有post数据的大小也有限制:所有的表单数据加起来,不能超过!

  • 文件过大,超出了表单内的一个隐藏元素的限制:
    该元素要出现在文件上传域之前

上传文件工具类

<?phpclass UploadTool {private $upload_dir;//上传目录private $max_size;private $allow_types;private $error_info;public function __construct($dir='', $size=2000000, $types=array()) {$this->upload_dir = $dir;$this->max_size = $size;$this->allow_types = empty($types)?array('image/jpeg', 'image/png'):$types;}public function __set($p_name, $p_value) {if (in_array($p_name, array('upload_dir', 'max_size', 'allow_types'))) {$this->$p_name = $p_value;}}public function __get($p_name) {if ($p_name  == 'error_info') {return $this->$p_name;}}/*** 拿到一个上传文件的信息* 判断其合理和合法性,移动到指定目标** @param $file array 包含了5个上传文件信息的数组* @param $prefix string 生成文件的前缀** @return 成功,目标文件名;失败:false*/function upload($file, $prefix='upload_') {//判断是否有错误if($file['error'] != 0 ) {//文件上传错误switch ($file['error']) {case 1:$this->error_info = '文件太大,超出了php.ini的限制';break;case 2:$this->error_info = '文件太大,超出了表单内的MAX_FILE_SIZE的限制';break;case 3:$this->error_info = '文件没有上传完';break;case 4:$this->error_info = '没有上传文件';break;case 6:case 7:$this->error_info = '临时文件夹错误';break;}return false;}//判断类型if(!in_array($file['type'], $this->allow_types)) {$this->error_info = '类型不对';return false;}//判断大小if($file['size'] > $this->max_size) {$this->error_info = '文件过大';return false;}//处于安全性的考虑,判断是否是一个真正的上传文件:if( !is_uploaded_file($file['tmp_name'])) {$this->error_info = '上传文件可疑';return false;}//移动//通常都会为目标文件重启名字//原则是:不重名,没有特殊字符,有一定的意义!$dst_file = uniqid($prefix) . strrchr($file['name'], '.');if (move_uploaded_file($file['tmp_name'], $this->upload_dir . $dst_file)) {//移动成功,上传完毕!return $dst_file;} else {//失败$this->error_info = '移动失败';return false;}}}

分子目录保存

目录的创建,mkdir()!
mkdir(目录位置,是否递归创建);
假设b不存在,则:
mkdir(‘a/b/c’);失败
mkdir(‘a/b/c’, true);成功
判断目录是否已经存在,is_dir()判断是否是一个目录!
bool = is_dir(目录地址)

划分子目录的原则!
典型的原则,依据上传时间完成子目录的创建!
按照小时创建子目录!
利用函数 date()可以格式化时间。将一个时间戳,以易于理解的形式展示!
date(‘格式’, 时间戳=time())

tip:strtotime()将一个日期格式变成时间戳!

//形成子目录$sub_dir = date('YmdH');//判断是否存在if(! is_dir($this->upload_dir . $sub_dir)) {//不存在则创建mkdir ($this->upload_dir . $sub_dir);}

注意:这里会报date(): It is not safe to rely on the system’s timezone settings.
解决方法:解决方法

缩略图

基本过程
采样:在原图上采样(采集需要被复制的图像区域)
拷贝:将采集的图样信息,拷贝到某个画布上(缩略图)
修改:修改大小,修改拷贝之后的大小区域结果

需要一个php的gd函数:
imagecopyresampled();采样拷贝,并修改大小

需要的参数有哪些?
两个画布:原图画布,与缩略图画布,dstimg,src_img
采集区域控制:在原图上的一个矩形区域!左上角坐标,宽,高!
拷贝到缩略图画布上的位置与大小:在缩略图画布上矩形!坐标和宽高!

目标在前,而原图在后!先画布,左上角坐标,宽高!
imagecopyresampled(dstimg,src_img, dstx,dst_y, srcx,src_y, dstw,dst_h, srcw,src_h);

实现步骤
1创建原图画布和缩略图画布
2采样,拷贝,修改大小
imagecopryresampled();
3导出
4销毁

<?php//创建原图画布和缩略图画布
$src_file = './src.jpg';
$src_img = imagecreatefromjpeg($src_file);//基于已有图片创建
//缩略图的大小应该如何确定?
$dst_img = imagecreatetruecolor(100, 100);//创建一个新的画布//采样,拷贝,修改大小
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, 100, 100, 500, 375);//导出
header('Content-Type:image/jpeg');
imagejpeg($dst_img);//销毁imagedestroy($dst_img);
imagedestroy($src_img);

等比例的缩略图
实现方式:
一种:限定缩略图的最大尺寸!
二种:补白生成大小一致的缩略图!

<?php//已知条件
$max_w = 100;//范围的最大的宽
$max_h = 100;//范围的最大的高
$src_file = './src.jpg';//原始图片//计算原图的宽高
$src_info = getimagesize($src_file);
$src_w = $src_info[0];//原图宽
$src_h = $src_info[1];//原图高//比较 宽之比 与 高之比
if($src_w/$max_w > $src_h/$max_h) {//宽应该缩放的多$dst_w = $max_w;//缩略图的宽为范围的宽$dst_h = $src_h/$src_w * $dst_w;//按照原图的宽高比将求出缩略图高
} else {$dst_h = $max_h;$dst_w = $src_w/$src_h * $dst_h;
}//创建画布
$src_img = imagecreatefromjpeg($src_file);//基于已有图片创建
//缩略图的大小应该如何确定?
$dst_img = imagecreatetruecolor($dst_w, $dst_h);//创建一个新的画布//采样,拷贝,修改大小
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $dst_w, $dst_h, $src_w, $src_h);//导出
header('Content-Type:image/jpeg');
imagejpeg($dst_img);//销毁
imagedestroy($dst_img);
imagedestroy($src_img);

图片工具类

<?phpclass ImageTool {/*** 生成缩略图,补白** @param $src_file* @param $max_w;* @param $max_h;* * @return 缩略图的图片地址。失败false!*/public function makeThumb($src_file, $max_w, $max_h) {//判断原图片是否存在if (! file_exists($src_file)) {$this->error_info = '源文件不存在';return false;}//计算原图的宽高$src_info = getimagesize($src_file);$src_w = $src_info[0];//原图宽$src_h = $src_info[1];//原图高//在增加一个判断!//如果原图尺寸小于范围(缩略图尺寸)if($src_w < $max_w && $src_h < $max_h) {//则不用判断,直接用原图的$dst_w = $src_w;$dst_h = $src_h;} else {//比较 宽之比 与 高之比if($src_w/$max_w > $src_h/$max_h) {//宽应该缩放的多$dst_w = $max_w;//缩略图的宽为范围的宽$dst_h = $src_h/$src_w * $dst_w;//按照原图的宽高比将求出缩略图高} else {$dst_h = $max_h;$dst_w = $src_w/$src_h * $dst_h;}}//创建画布$src_img = imagecreatefromjpeg($src_file);//基于已有图片创建//缩略图的大小一致!$dst_img = imagecreatetruecolor($max_w, $max_h);//创建一个新的画布//为缩略图确定颜色,蓝色$blue = imagecolorallocate($dst_img, 0x0, 0x0, 0xff);imagefill($dst_img, 0, 0, $blue);//填充//采样,拷贝,修改大小。注意放置的位置!$dst_x=($max_w-$dst_w)/2;$dst_y=($max_h-$dst_h)/2;imagecopyresampled($dst_img, $src_img, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);//导出//取得原始文件的路径与名字$src_dir = dirname($src_file);$src_basename = basename($src_file);$thumb_file=substr($src_basename, 0, strrpos($src_basename, '.')) . '_thumb' . strrchr($src_basename, '.');imagejpeg($dst_img, $src_dir . DS . $thumb_file);//销毁imagedestroy($dst_img);imagedestroy($src_img);//返回return basename($src_dir) . '/' . $thumb_file;}
}

水印

将一张图片 合并 到另一张图片上!

采样:从印章图片上采集作为水印的图片!
拷贝:将采集到的颜色信息,拷贝到需要增加水印的图片上!
合并:需要确定合并位置(不能确定合并的大小),同时需要确定透明度!

一个函数:
imagecopymerge()
需要的参数:
两个画布:印章,待增加水印的画布
采集的区域:坐标和宽高
合并的位置:坐标
合并的透明度:透明值
共 9 个参数!
画布,坐标,宽高,透明度;目标在前!
imagecopymerge(dstimg,stamp_img, dstx,dst_y, stampx,stamp_y, stampw,stamp_h, $pct )

<?php$dst_file = './dst.jpg';
$stamp_file = './stamp.jpg';//画布
$dst_img = imagecreatefromjpeg($dst_file);
$stamp_img = imagecreatefromjpeg($stamp_file);//合并,拷贝
imagecopymerge($dst_img, $stamp_img, 0, 0, 0, 0, 128, 52, 70);//
header('Content-Type: image/jpeg');
imagejpeg($dst_img);imagedestroy($dst_img);
imagedestroy($stamp_img);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019年机器学习:追踪人工智能发展之路

作者&#xff5c;Hussain Fakhruddin编译&#xff5c;专知整理&#xff5c;Yingying&#xff0c;李大囧摘要&#xff1a;“智能助理”的时代已经到来了。机器学习已经成为全球数字化转型的关键要素之一 ,在企业领域&#xff0c;机器学习用例的增长在过去几年中也是显著的。预计…

PHP之MVC项目实战(三)

本文主要包括以下内容 标准错误错误处理 http操作 PDO 文件操作 标准错误错误处理 PHP在语法层面上发生的错误 两个过程&#xff1a; 触发阶段&#xff08;发生一个错误&#xff09; 处理阶段&#xff08;如何处理该错误&#xff09; 触发阶段 系统触发&#xff0c;…

价值2950亿美元的「量子霸权」,技术水平到了哪个阶段

来源&#xff1a;36Kr摘要&#xff1a;谁掌握了量子计算机&#xff0c;谁就可能引领下一次信息革命。当前经典计算体系&#xff0c;并不能解决所有问题。量子计算将给现有的计算理论带来深刻变革&#xff0c;将极大加深人类对物质与信息的理解&#xff1b;将是一种前所未有的计…

微信开发简单实例

本文主要包括以下内容 1. 微信聊天机器人 微信聊天机器人 利用图灵机器人接口实现微信聊天机器人 <?phpdefine("TOKEN", "weixin"); $wechatObj new wechatCallbackapiTest(); if (isset($_GET[echostr])) {$wechatObj->valid(); }else{$wec…

开放政府数据价值:内涵、评价与实践

来源&#xff1a;《政府数据开放研究》作者&#xff1a;陈美 湖北工业大学经济与管理学院分析开放政府数据的价值与评价&#xff0c;有助于政府数据开放更高效地开展。文章在界定开放政府数据价值内涵与层次划分的基础上&#xff0c;介绍国外开放政府数据价值评价进展&#xff…

Smarty模板技术学习

模板引擎技术&#xff1a;使得php代码和html代码分离的技术就称为“模板引擎技术” 自定义smarty模板技术实现 <?php//迷你smarty原理 class MiniSmarty{public $var_arr array();public $template_dir "./view/";public $compile_dir "./view_c/"…

vc++深入详解学习-NO.3

c的多态性&#xff0c;基于虚函数的多态性技术&#xff0c;在成员函数的定义前面加上virtual关键字申明的函数叫做虚函数&#xff0c;当c编译器在编译的时候&#xff0c;发现类中的虚函数&#xff0c;这个时候c就好采用迟邦定技术&#xff0c;在运行期间依据对象的类型确定调用…

50大产业链全景图(高清完整版)

来源&#xff1a;新材料在线摘要&#xff1a;机器人、无人驾驶、VR、光伏、核电、半导体……50大产业链全景图&#xff0c;让你一次纵观全局。&#xfeff;&#xff08;点击图片查看大图&#xff09;—1—全国各省新材料产业链全景图—2—飞机产业链全景图—3—高铁产业链全景图…

3D打印,智能砖,竹子城市……改变未来建筑业的8项技术

来源&#xff1a;资本实验室科学技术正在彻底改现代生活的方方面面&#xff0c;并且每天都在不断进步&#xff0c;没有任何减速的迹象。绝大多数行业已经并且正在受到技术进步的影响&#xff0c;并越来越接近未来。对于建筑行业而言&#xff0c;以下8种新技术将改变未来建筑业的…

Smarty模板技术学习(二)

本文主要包括以下内容 公共文件引入与继承 内容捕捉 变量调剂器 缓存 Smarty过滤器 数据对象、注册对象 与已有项目结合 公共文件引入与继承 可以把许多模板页面都用到的公共页面放到单独文件里边&#xff0c;通过模板就可以直接调用&#xff0c;类似php里边通过include指令…

分布式服务框架 Zookeeper -- 管理分布式环境中的数据

安装和配置详解 本文介绍的 Zookeeper 是以 3.2.2 这个稳定版本为基础&#xff0c;最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取&#xff0c;Zookeeper 的安装非常简单&#xff0c;下面将从单机模式和集群模式两个方面介绍 Zookeeper 的安装和配置。 单机…

AI“重造”麻省理工学院!今宣布投资10亿美元成立全新计算学院,近70年来最大结构调整...

来源&#xff1a;Deep Tech深科技摘要&#xff1a;近日&#xff0c;世界顶尖名校麻省理工学院通过学校官方网站宣布重磅消息。近日&#xff0c;世界顶尖名校麻省理工学院通过学校官方网站宣布重磅消息&#xff1a;投资 10 亿美元以引领计算机技术和人工智能技术的发展及全球影响…

经验分享:10个简单实用的 jQuery 代码片段

尽管各种 JavaScirpt 框架和库层出不穷&#xff0c;jQuery 仍然是 Web 前端开发中最常用的工具库。今天&#xff0c;向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段。 您可能感兴趣的相关文章精心挑选12款优秀 jQuery Ajax 分页插件分享60款绚丽的 jQuery 幻灯片…

PHP数据库操作

PHP实现数据库的增删改查 <?php $connmysql_connect(localhost,root,root); if(!$conn){ echo "connect failed"; exit; }$sqluse test; mysql_query($sql,$conn);//增加 $sql"insert into mytest values(null,pu,20)"; $rsmysql_query($sql,$conn);…

日本机器人实力大盘点,和Atlas的高调刷屏相比,日本机器人的默默崛起更让人忌惮...

来源&#xff1a;机器人大讲堂摘要&#xff1a;近期&#xff0c;估计全球的机器人圈都沉浸在Atlas的三连跳中无法自拔&#xff0c;刷屏的Atlas代表了美国对待科研的态度&#xff1a;我能所以全世界都得膜拜我&#xff01;近期&#xff0c;估计全球的机器人圈都沉浸在Atlas的三连…

Android高性能ORM数据库DBFlow入门

DBFlow&#xff0c;综合了 ActiveAndroid, Schematic, Ollie,Sprinkles 等库的优点。同时不是基于反射&#xff0c;所以性能也是非常高&#xff0c;效率紧跟greenDAO其后。基于注解&#xff0c;使用apt技术&#xff0c;在编译过程中生成操作类&#xff0c;使用方式和ActiveAndr…

不值钱的软件人才[转]

软件人才在中国不值钱&#xff0c;不但价格只比“一文不值”多一点&#xff0c;而且地位也就是一个普通劳动者&#xff0c;和高薪等挂不上钩。这里讲的是中国大陆地区&#xff0c;因为我不知道其他国家的情况&#xff0c;如无特殊声明&#xff0c;以下所有情况均只中国大陆的情…

科学:揭示自由意志的生物学本质

来源&#xff1a;中国科学报摘要&#xff1a;神经科学家开始精确定位大脑中参与自由意志感知的区域。“外星人肢体综合征”听起来也许并非那么像外星人的事&#xff0c;虽然它仍然很怪异。病人们抱怨说&#xff0c;他们的一只手变成了“流氓”&#xff0c;会在自己不知道的情况…

ThinkPHP入门

ThinkPHP项目的创建 <?php include "../../ThinkPHP/ThinkPHP.php"; 在index.php中导入ThinkPHP.php即可&#xff0c;会自动创建目录。 tp创建流程分析 1. 入口文件index.php2. ThinkPHP/ThinkPHP.phprequire THINK_PATH.Common/runtime.php;3. ThinkPHP/…

解密:LL与LR解析 2(译,完结)

由于GFW&#xff0c;我无法联系到作者&#xff0c;所以没有授权&#xff0c;瞎翻译的。原文在这里[http://blog.reverberate.org/2013/07/ll-and-lr-parsing-demystified.html]。 这是第2部分和完结。 3. 解析树的形状 到目前为止&#xff0c;我们使用的算术表达式的那棵树&…