念!离我而去的小哈

我一直都想养一条狗,想了好久好久!我知道一直有拖延症,突然有一天脑袋一热,在完全没做啥准备就去买狗了,结果,悲剧的故事就这样开始了。

其实只要我做事稍微谨慎一点点,这事情都不会发生,可它就是发生恩啦。

显示在深圳这边所有几个宠物店都逛了一下,都说哈士奇这样的狗需要预定,而且价格在3000以上,一般品相好一点的要4000多。。

然后我就手贱的上了一个很神奇的网站58同城搜哈士奇,找到了一个狗场,他们说,他们的哈士奇在广州价格是1500-2000。我当时就觉得狗场应该很靠谱。毕竟是剪掉了中间商赚差价,然后事实确真好相反。

狗场的联系电话

这是那个狗场给我发的联系地址,狗场的忽悠计量才刚刚开始了。

她跟我说,是广州荔湾区,我到了之后发现那里没有狗场,全是买花卉的,过了一会,他们说开车来接我,说就在前面,我第一反应是传销,但更根本没想到!!这特么比传销更坑。

以为真心想买狗,就上车了,司机说就在前面,结果开了20多公里,从广州都了佛山。到了一个前不着村后不挨店的地方。确实是狗场,这个没骗我们,而且也没有强买强卖,这个要先说明一声

然后第一次看到好多狗狗。真的有20多种。。而且导购小哥也比较热心,但有点业余。只知道狗名字,其他都不知道。

然后我开始挑选狗狗,当然是哈士奇。

小哈士奇

这只好漂亮,我问多少钱,他说3000以上,具体多少!导购小哥含糊其所。我现在在想,我当是是不是脑抽,这明显是他想乱开价,一时想不到具体的价格的表现,我当时怎么就没看出来。

在狗场条狗的人很多,学了一招,就是把狗狗丢到外面看他跑不跑。。这只小哈士奇,丢外面根本就不动~ (我根本就不知道还有病狗这么一说)

我犹豫了一下,要不要买这只,然后它就被其他人抱走了。。。。。。。

最后挑了一只年纪大一点的,2个多月的

小哈士奇2

这种看着肥肥的,而且挺精神的,就买了这只。我一直都有不讲价的习惯(这TM也可以)。结果2600就买了。然后有一个自称营养师的女人来跟我推销东西,什么养狗设备,狗粮呀,,一共收了我520(回家一搜价300)。

到这里我已经无力吐槽我自己了,特么我也太好忽悠了,被宰活该。

当时天已经黑了!!!已经来狗场3个小时了。

狗狗回家后就开始上吐下泻,开始一蹶不振,打电话给狗场,狗场说是正常现象,不适应新环境,我信了,第二天还是这样的,去动物诊所检查:“细小病毒”

然后诊所收了300块钱的检查费(4项检查,后来去动物医院检查,医院收了1项40块,良心呢?) 然后那个诊所的医生说:“一天420,要7-10天,不一定治的好!!你们做决定吧!”我当时真想真是十万头草泥马。

过了2天,狗狗的病情越来越差,找了一个家靠谱的医院,医院说,送来晚了,已经中后期了。都便血了!!!

送去医院的第二天狗狗就因细小病毒,离世了!!

QQ图片20151120210810

看着好心痛,,我带他回来才4天就离开我了。

我还没有带你去洗过澡呢!我还没没来的急把狗粮给你吃呢!小雷给你卖的脱脂羊奶还在路上呢!!你就走了。。

还打算看你长大了,范二的样子呢!都把沙发让出来,让你去咬,,可惜你再也咬不到了。

每次看到装你的笼子,笼子里面确没有你,狗粮还在,喝水器还装着水,确再也等不到你回来。

还打算等你长大了,把你身上毛全剃了了,只留一个头,拍照片“嘲笑”你,求你心里阴影面积呢?

—————-

在这里我要科普一个东西,我看这就生气的东西:

宠物诊所许可经营:动物疾病的诊断、治疗、绝育手术等(不含颅腔、腹腔、胸腔手术、免疫注射)。
宠物医院能做的诊疗远多于宠物诊所,除了宠物诊所许可经营的动物疾病的诊断、治疗、绝育手术外,还包含颅腔、腹腔、胸腔手术、免疫注射等手术和项目。人员和设备配备更齐全,服务也更规范。

就是这个宠物诊所和宠物医院的区别,我小哈先送去的那个宠物诊所叫:台湾福懋宠物诊所 根本就没有治疗的资质,确为了赚钱,给我狗狗治疗。耽误了我狗狗的治疗时间。

后来发现:http://tieba.baidu.com/p/3395981174 更我有相同遭遇的人还真不少,有些宠物诊所!!!唉,,,现在真实有钱就敢赚,不怕后代遭报应吗?

http://www.dianping.com/shop/14836900我当初要是再谨慎一点,这TM就不会被坑了。

真是被社会教育的不要不要的!!!

想想小哈的悲剧,其实是一步一步发生的,都是自己的选择错误了,要是是在送诊所之前我能用点心看看这诊所的评价,我是打死也不会送他去的!!无良诊所!!

—————

深圳的爱宠朋友们,如果狗狗生病了,我强烈建议去医院,价格先说,环境都好很多,经朋友介绍,深圳宝安有一家加:吉美宠物医院。我暂时看起来比较靠谱。想必那行黑心的宠物店已经靠谱很多了。

 

Thinkphp打水印,设置水印位置

最近在用Thinkphp的打水印的功能,发现只能打在左下角。 PHP打水印功还是很容易的,最要是用到

[php]

bool imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )
将 src_im 图像中坐标从 src_x,src_y 开始,宽度为 src_w,高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_x 和 dst_y 的位置上。两图像将根据 pct 来决定合并程度,其值范围从 0 到 100。当 pct = 0 时,实际上什么也没做,当为 100 时对于调色板图像本函数和 imagecopy() 完全一样,它对真彩色图像实现了 alpha 透明。

[/php]

水印demo图

水印demo图

我需要把水印打到图片的真中间,查看Thinkphp代码。发现,作者居然是写死了,,我只能做一个修改

[php]
/**
* 为图片添加水印
* @static public
* @param string $source 原文件名
* @param string $water 水印图片
* @param string $$savename 添加水印后的图片名
* @param string $postion 水印的具体位置 leftbottom rightbottom lefttop righttop center <新增>
* @param string $alpha 水印的透明度
* @return void
*/
static public function water($source, $water, $savename=null,$postion="center", $alpha=80) {
//检查文件是否存在
if (!file_exists($source) || !file_exists($water))
return false;

//图片信息
$sInfo = self::getImageInfo($source);
$wInfo = self::getImageInfo($water);

//如果图片小于水印图片,不生成图片
if ($sInfo["width"] < $wInfo["width"] || $sInfo[‘height’] < $wInfo[‘height’]) return false; //建立图像 $sCreateFun = "imagecreatefrom" . $sInfo[‘type’]; $sImage = $sCreateFun($source); $wCreateFun = "imagecreatefrom" . $wInfo[‘type’]; $wImage = $wCreateFun($water); //设定图像的混色模式 imagealphablending($wImage, true); //图像位置,默认为右下角右对齐 $posArr = $this->WaterPostion($postion,$sInfo,$wInfo); //新增

//生成混合图像
imagecopymerge($sImage, $wImage, $posArr[0], $posArr[1], 0, 0, $wInfo[‘width’], $wInfo[‘height’], $alpha);

//输出图像
$ImageFun = ‘Image’ . $sInfo[‘type’];
//如果没有给出保存文件名,默认为原图像名
if (!$savename) {
$savename = $source;
@unlink($source);
}
//保存图像
$ImageFun($sImage, $savename);
imagedestroy($sImage);
}

private function WaterPostion($postion,$sInfo,$wInfo)
{
$posY = $sInfo["height"] – $wInfo["height"];
$posX = $sInfo["width"] – $wInfo["width"];

switch($postion)
{
case "rightbottom":
return array($posX,$posY);
break;

case "leftbottom":
return array($wInfo["width"],$posY);
break;

case "lefttop":
return array($wInfo["width"],$wInfo["height"]);
break;

case "righttop":
return array($posX,$wInfo["height"]);
break;

case "center":
return array($posX/2,$posY/2);
break;
}
}
[/php]

好像就可以了~

亿美短信接口HTTP协议实现

最近在做帮一个朋友做一个发短信的接口,也是我一直想做的一个接口,,亿美公司提供了几种方式,我还是一直很偏向HTTP协议的

因为这种方式不限制语言,而且轻量级。然后刚好这几天也在学习代码重构技术。

根据重构的原则编写了这个发短信的类

这里有说几个坑:

  1.  调用发短信接口后,短信发送成功,但手机收不到短信? 发送短信的格式有要求,必须有是公司简称或者产品简称  类似:【支付宝】【京东】这些的 信息,不然短信没办法发出去。
  2. 签名移到最前端  联通移动什么都不会限制的
  3. 短信内容必须是UTF-8编码的,中文还需要经过urlencode()编码。代码中有实现。

[php]

/***
* 北京亿美短信发送通用接口
* @version 1.0
* @author Summer<dengwz7788@gmail.com>
* @保留版权信息,不限制使用范围
* **/

class SendM{

private $cdkey = "0SDK-EMY-6688-KHZOS"; // "改成您的密钥"
private $password = "123456"; //"改成您的密码"
private $SendMessageApi = "http://sdk4report.eucp.b2m.cn:8080/sdkproxy/sendsms.action";
private $PlanSendMessageApi = "http://sdk4report.eucp.b2m.cn:8080/sdkproxy/sendtimesms.action";
private $QueryMessageNumApi = "http://sdk4report.eucp.b2m.cn:8080/sdkproxy/querybalance.action";
private $getreportApi = "http://sdk4report.eucp.b2m.cn:8080/sdkproxy/getreport.action";
private $registApi = "http://sdk4report.eucp.b2m.cn:8080/sdkproxy/regist.action";
private $registdetailinfoApi= "http://sdk4report.eucp.b2m.cn:8080/sdkproxy/registdetailinfo.action";
private $querybalanceApi = "http://sdk4report.eucp.b2m.cn:8080/sdkproxy/querybalance.action";
private $getmoApi = "http://sdk4report.eucp.b2m.cn:8080/sdkproxy/getmo.action";

public function __construct() {

$this->param["cdkey"] = $this->cdkey;
$this->param[‘password’] = $this->password;

}

/**获取剩余短信余量**/
public function querybalance()
{
$Arr= $this->Curl($this->querybalanceApi, $this->param);
$this->json($Arr);
}

/**获取上行短信接口**/
public function getmo()
{
$Arr= $this->Curl($this->getmoApi, $this->param);
$this->json($Arr);
}

/**获取短信数据报表**/
public function getreport()
{
$Arr= $this->Curl($this->getreportApi, $this->param);
$this->json($Arr);
}

/**公司信息注册**/
public function registdetailinfo()
{
$this->param["ename"] = "小邓PHP-高效PHP开发"; //企业名称(最多60字节),必须输入
$this->param["linkman"] = "小邓"; //联系人姓名(最多20字节),必须输入
$this->param["phonenum"] = ""; //联系电话(最多20字节),必须输入
$this->param["mobile"] = ""; //联系手机(最多15字节),必须输入
$this->param["email"] = ""; //电子邮件(最多60字节),必须输入
$this->param["fax"] = ""; //联系传真(最多20字节),必须输入
$this->param["address"] = ""; //公司地址(最多60字节),必须输入
$this->param["postcode"] = ""; //邮政编码(最多6字节),必须输入

$Arr= $this->Curl($this->registdetailinfoApi, $this->param);
$this->json($Arr);
}

/**查询发送短信数**/
public function querymessagenum()
{
$Arr= $this->Curl($this->QueryMessageNumApi, $this->param);
$this->json($Arr);
}

/**公司注册**/
private function regist()
{
$Arr= $this->Curl($this->registApi, $this->param);
$this->json($Arr);
}

/**发送短信接口,单例发送**/
public function Sendsms($Content,$phone,$addserial="")
{
if(is_array($phone)){
$phone = implode(",", $phone);
}
$this->param["phone"] = $phone;
$this->param["message"] = $Content;
$this->param[‘seqid’] = $this->seqid;

$this->param["addserial"] = $addserial;
$Arr= $this->Curl($this->SendMessageApi, $this->param);
$this->json($Arr);
}

private function Curl($url,$param)
{
$ch2 = curl_init();
//获取个人信息
$url2 = $url."?".$this->_param($param);

curl_setopt($ch2, CURLOPT_URL, $url2);
curl_setopt($ch2, CURLOPT_HEADER, 0); //不返回header部分
curl_setopt($ch2, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
curl_setopt($ch2, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch2, CURLOPT_FOLLOWLOCATION,1);
$information = curl_exec($ch2);
curl_close($ch2);

return $this->XML_toArr($information);
}

private function XML_toArr($XML)
{
$p = xml_parser_create();
xml_parse_into_struct($p, trim($XML), $vals, $index);
xml_parser_free($p);

foreach($vals as $key=>$value)
{
$result[strtolower($value[‘tag’])] = $value[‘value’];
}

return $result;
}

private function _param($param)
{
foreach($param as $key=>$value)
{
$tmp[] = $key."=".urlencode($this->encodeToUTF8($value));
}

return implode("&", $tmp);
}

private function json($data)
{
echo json_encode($data);
exit;
}

private static function encodeToUTF8($value)
{

$encode = mb_detect_encoding($value, array("ASCII","UTF-8","GB2312","GBK","BIG5"));

if($encode == "UTF-8"){
return $value;
}

return mb_convert_encoding($value, "UTF-8", $encode);

}

}
[/php]

Thinkphp导入类的使用模版

[php]

import("@.ORG.SendM");

$SendM = NEW SendM();

$SendM->Sendsms("【PHP开发工程师-小邓高新能PHP开发】给你发了短信了", "1397335xxxx");
[/php]

HTML5的游戏–通用模版

HTML5游戏一直很热门,自从去年的围住神经猫,在短短几天里面获取了,过亿的PV开始。。HTML5就成了手机游戏代名词

因为朋友圈的推广太疯狂,加上大家对转发炫耀的心理,HTML5游戏才能了朋友圈里面的宠儿。

但这么庞大的流量给开发着带来了什么?最简单的,开发组能不能把这些流量变现。

据不可靠消息,在之前的一个广告联盟群里面,有一个小哥用HTML5小游戏做广点通(腾讯广告联盟)的广告,一天赚了2700

还有大家经常在微信朋友圈里面看到,为XXX加油获取红包,攒钱68元即可提现(一般我都会举报)的活动。

这些都是利用HTML5做的相关的东西,今天我给大家分析一下HTML5的小游戏,十分简单

用手机看,效果可能会好一点:http://www.dengwz.com/html/html5/huba/index.html

大家一看就说会我这个是从网上拔下来的,学习要从网上开始,不要做商用就好。改改素材,你就可以做《啪啪啪!大圣归来》

看过源代码之后,你就会懂,为啥我会连素材都不改就发出来了。

要源代码吗?

前端购物车JS插件(HTML5新特效插件)

最近做一个商城,需要用到一个简答的购物车功能,当然,后端实现比较容易,,这里重点还是讲一下前端的JS插件。

从源代码里面没看出来,它叫啥,好像叫:ctshop .js,不管啦,反正我提供下载就好,我做了一些简单的修复,支持了中文

这个插件使用了HTML5的新特效:storage ,就是游览器数据库的功能,这跟之前把数据存在cookies里面原理是相识的,这样的好处在于用户刷新页面,数据还在,,又不需要跟后端进行数据交互。

[javascript]

create_storage_cart: function() {
for (var t = this, e = t.storage_get(), a = 0, n = e.items.length; n > a; a++) {
var i = e.items[a].id,
r = e.items[a].name,
s = e.items[a].price,
c = e.items[a].input;
t.cart.append(‘<li class="animated ‘ + t.settings.animation + ‘" data-id=’ + i + "><span class=" + t.settings.cart + "-name>" + r + "</span><span class=" + t.settings.cart + "-price>" + s + ‘</span><input type="number" min="1" value="’ + c + ‘" class=’ + t.settings.cart + "-input><button class=" + t.settings.cart + "-remove>x</button></li>")
}
},
[/javascript]

需要兼容老版的游览器,需要在上面进行修改。下面是插件的配置文件

[javascript]

s = {
currency: "$",
currency_after_number: "false",
permanent_cart_buttons: "false",
display_total_value: "true",
permanent_total_value: "false",
animation: "fadeIn",
empty_disable: "false",
empty_text: "Your cart is empty",
paypal: {
business: "office@createit.pl",
currency_code: "USD",
lc: "EN",
cpp_cart_border_color: "",
cpp_payflow_color: "",
no_note: "0",
no_shipping: "0",
"return": "",
cancel_return: ""
},
lang:{ //我新增的属性,主要是用来支持多语言
clear:’清空’,
checked:’结算’
},
};
[/javascript]

实例化

[javascript]

$(‘body’).ctshop({
currency: ‘$’,
paypal: {
currency_code: ‘RMB’
},
empty_text:’您敢信,你的购物车居然是空的!’,
});

[/javascript]

很简单的吧。。

看看效果:购物车demo

下载ZIP包:JS购物车源码

 

关于PHP的静态变量的注意细节

之前的公司的小兄弟要去面试PHP,他遇到了一道PHP基础面试题,大致内容是如下:

[php]
function test(){
static $a = 0;
$a++;
echo "before unset ".$a."<br/>";
unset($a);
$a = 23;
echo "after unset ".$a."<br/>";
}
test();
test();
test();
[/php]

看到这题的时候,就注意到了stats这个标记了$a。就知道这题不会是第一反应的结果。(结果如下)

PHP运行结果

PHP运行结果

这个$a 值没有因为unset() 函数改变,而是一直在累计!!我知道unset()对应static状态的变量是无效的。我马上查看了手册

unset() 销毁指定的变量。

unset() 在函数中的行为会依赖于想要销毁的变量的类型而有所不同。

如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。

如果在函数中 unset() 一个静态变量,那么在函数内部此静态变量将被销毁。但是,当再次调用此函数时,此静态变量将被复原为上次被销毁之前的值。

其实这样这么理解:

PHP变量关系图

PHP变量关系图

PHP的内存地址跟变量直接就是通过这种方式进行关联的。一般的变量是是通过关联的方式指向对应的地址,而不是真是的值。所以unset()的过程,其实是断了之间的联系,而不是抹掉了内存地址的值。
而static在初始化变量的,仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。

所以才看到之前累加的情况出现。而且静态变量在生命周期内只能赋值一次。

PS:现在这样理解着,等读了源码再回来看看逻辑是否正确

Hotspotter — jquery图片热点插件

之前那个图片热点的Jquery插件,太高端了!不怎么好用,还需要自己切小图。。所以昨天有去找了另一个插件叫:Hotspotter

正如你所见这个插件又是收费的,而且国内也有人在卖它,我态度一直很明确(嘿嘿)。。我还是之前的套路,我又把它扒下来了,发现确实高端了不少。。

图片定位和图片显示都相当不错,给你一个demo提供参考

上面是精简出来的demo

[javascript]
$(document).ready(function () {
$(‘.hs-area’).hotspotter({ imgTopMargin: 50 });
$(‘#resize’).resizable({
aspectRatio: true,
stop: function () {
$(this).hotspotter();
}
});
});
[/javascript]

然后我看了源码,,o(︶︿︶)o 唉~说多了都是泪,,没有配置文件,需要自己生成HTML

[html]
<div class="hs-area ui-resizable" id="resize">
<img data-imgdim="640,480" src="images/zx.jpg" style="width: 100%;">
<div class="hs-wrap" style="display: block;">
<div data-activeon="hover" data-coord="136,162" class="sniper-spot"></div>
<div class="tt-wrap bottom">
<div data-dir="bottom" data-pos="-15" data-anim="goin" class="tip-tooltip bottom">
<div style="height:145px;width:425px;">
<img src="images/fxj.jpg" style="width:200px;float:left;">
<p> PHP开发工程师 </p>
</div>
</div>
</div>
</div>
</div>
[/html]

看完这里我再简单说一下,这里那个作者扩充的HTM的属性的作用(我也是猜的)

[html]
data-activeon="hover" //触发实践
data-coord="136,162" //标记的坐标(这里可以添三个参数,第三个表示圆角CSS3的DIV样式)
class="sniper-spot" //标记的类型,是点还是巨型
data-dir="bottom" // 数据展示的位置,bottom 下面,top ,left,right
data-pos="-15" //距离标记点的偏移量
data-anim="goin" //动画效果
[/html]

我要不要把源码打一个压缩包呢?你点广告了,我就给你。。。哈哈哈(不要脸)

jquery的插件spinner的一些使用细节

开始,我不是不想写这个博文的,最近要做一个功能。就是需要使用到spinner这个插件功能。如下图

spinner插件效果图

spinner插件效果图

看了效果图,其实,你应该知道我要做啥功能了。就是一个简单的,在下单量那里点击,上键或者下键,根据对于的商品价格进行总结计算。

就这么一个简单的,我好意识要写博客?肯定不是这样原因,你百度一下关键字:jquery-spinner插件。搜索完之后,你估计会愤怒。

一篇文章被转载了N次,这些我也就算了,你就是做一个spinner浅尝辄止的说明,需要一篇接一篇的转发吗?互联网本来就信息多,你们这造了多少信息垃圾,你们就不一点不负责么?

所以我选择看源代码来明白这个插件到底怎么用。

[javascript]

b.fn.spinner.defaults = {
 value: 1, //初始值
 min: 1, //最小值
 max: 999, //最大值
 step: 1, //每一步增量
 hold: true, //保持(表示没看懂)
 speed: "medium", //速度
 disabled: false //是否可以修改
};

[/javascript]

上面是这个源码的中的默认值,这是是参数,然后还有操作的函数

[javascript]

a.prototype = {
//anything code
change: function() {
//javascript code ,值改编的时候,获取其值
},
stopSpin: function() {
//javascript code
},
startSpin: function(d) {
//javascript code
},
iterator: function(d) {
//javascript code
},
value: function(d) {
//javascript code
},
disable: function() {
//javascript code
}
};

[/javascript]

上面是是这个插件的全部的内置函数,你用firebug答应结点的时候时候,也可以获取到。

你可能在网上找到说,获取spinner中的数值的方法是

[javascript]
spinner.spinner("value")
[/javascript]

这只能获取他的初始值,每次change数据改版的时候,这种获取值的方法是失败的.

从源代码来看的话

[javascript]
$(function(){

$(‘.add_num’).ace_spinner(
{
value:0,
min:0,
max:200,
step:1,
btn_up_class:’btn-info’ ,
btn_down_class:’btn-info’,
}
).on( "change", function( ) {

var num = $(this).val(); //获取选择框里面的改版后数字
} );

});
[/javascript]

有能力的多看插件的源代码,不要去过分的百度,太浪费时间和感情了。。。

PHP面向对象的自动加载机制

在学习PHP的面向对象的时候,会知道很多“语法糖”,也就是魔术方法。有一个加自动加载的魔术方法,叫:__autoload();

先看一段代码

[php]

<?php
function __autoload($classname) {
$filename = "./". $classname .".php";
include_once($filename);
}

new a();

[/php]

这里实例化了一个A类,但在代码块中没有A类的相关代码,按常理是应该会报错,因为没有找到对应的A类,但如果你使用了autoload()自动加载函数的话,结果就可以能不一样

QQ截图20150527203846

 

从上面的流程图:在页面实例化一个新类,就会先在当前目录找对应的类代码,如果没有就去autoload堆栈找对应的自动加载函数,如果有的话就自动加载该类,没有话就抛出错误。

这是PHP自动加载的一个机制。然后重点在后面。如果我有多个自动加载的函数,怎么办! 

PHP提供了一个SPL函数

[php]

spl_autoload_register(); // 注册autoload函数

[/php]

官方:spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用。

然而在PHPexecl 和 PHPWord 里面都使用到了 这个函数来做自动加载,但两者有区别!!

PHPexecl 自动加载的方法(这里作者估计是Python工程师,不然花括号都没有,用缩进来表示)

[php]

public static function Register() {
$functions = spl_autoload_functions();
foreach ( $functions as $function)
spl_autoload_unregister($function);
$functions = array_merge(array(array(‘PHPExcel_Autoloader’,’Load’)),$functions);
foreach ( $functions as $function)
$x = spl_autoload_register($function);
return $x;
}

[/php]

PHPWord 自动加载的方法

[php]
public static function Register() {
return spl_autoload_register(array(‘PHPWord_Autoloader’, ‘Load’));
}
[/php]

这两种方法,都可以完成重定义自动加载,但有区别? 如果是独立运行代码,两种情况都可以运行,但要是整合到框架中,比如YII框架。那么PHPWord的自动加载就无效了。

因为YII框架自动带有自动加载函数,而且再代码运行的时候就已经注册了,而spl_autoload_register()会将新的自动加载函数,加载autoload队列的后面。所有PHPWord在运行的时候

就调用的是YII框架定义的自动加载机制,而且不是PHPWord这种加载方式。

所以反过来看PHPexecl的加载函数,你就明白了。

如何采集微信公共账号里面的图片

做页面内容抓起,遇到图片获取是必不可免的,这在之前的项目的有提过,但那个做法是很简单的,传统的图片存储。所有按正常的方式可以得到想要的结果。

但技术一直在进步嘛!!现在的WEB的流量中图片占70%的流量,在移动互联网时代,这种情况是不能忍的,所有就出现了微信的这种情况

[php]

$url = http://mmbiz.qpic.cn/mmbiz/jZa4drp6SdD6u2bGeiakB9BSfJCoFJLyKLdt2Kmve55TvibSFjgtFCe2A1G0fLNsX84SbMb96EPVb0Je6afnQaSg/640?wx_fmt=jpeg&tp=webp&wxfrom=5

[/php]

上面这个链接,是可以通过游览器打开的,但你从链接上面根本看出来是什么格式? 其实不是看不出来,是我们不认识这种格式,webp. 这是Google推出的一种移动图片压缩格式

这种格式怎么用?有什么用!,暂时不在这里讨论。

我发现他的原因是

[php]

$image = get_headers($url); //只获取访问URL的返回的表头

[/php]

PHP图片返回的头

PHP图片返回的头

这样就知道,这个URL的指定的图片的后缀名是什么了吧。。然后用普通的方式下载图片,后缀名用webp就OK了。。现在只能用游览器打开。。

你要是有时间,可以把他转换成JEPG格式的,,一个WEBTOOLS:https://cloudconvert.com/

这种格式在移动互联网时代应该会成为主流,毕竟能省很多流量。