Devil May Code...

Vergil's Blog

转自:http://allensuiverson.blog.163.com/blog/static/13364826920131013103226827/


PHP是弱类型,动态的语言脚本。在申明一个变量的时候,并不需要指明它保存的数据类型。例如:

<?php  
$var = 1;  
$var = "variable";  
$var = 1.00;  
$var = array();  
$var = new Object();  

动态变量,在运行期间是可以改变的,并且在使用前无需声明变量类型。

阅读剩余部分...


前言

第三方登录认证能简化用户登录/注册的操作,降低用户登录/注册的门槛,对提高应用的用户转化率很有帮助。

Socialite

Laravel 为我们提供了简单、易用的方式,使用 Laravel Socialite 进行 OAuth(OAuth1 和 OAuth2 都有支持) 认证。

Socialite 目前支持的认证有 Facebook、Twitter、Google、LinkedIn、GitHub、Bitbucket。(恩,有一半是“不存在”的网站。)
Socialite 的用法官方文档中已经讲得很详细了,恕不赘述。
英文好的同学,建议直接看 Laravel 官方文档,毕竟看二手知识是有高风险的
英文不好的同学(比如我),下面是中文文档:
Laravel 5.0:http://laravel-china.org/docs/5.0/authentication#social-authentication
Laravel 5.1:http://laravel.tw/docs/5.1/authentication#social-authentication

SocialiteProviders

SocialiteProviders 通过扩展 Socialite 的 Driver,实现了很多第三方认证。国内的有:微博、QQ、微信、豆瓣。当然你自己也可以参照实现其他的,只要那个网站支持 OAuth。
SocialiteProviders 的使用也超级简单易用,每个都对应了文档。其实,不懂英文也能看懂。
文档地址:http://socialiteproviders.github.io/
其实,文章到这里就应该结束了。由于文档是基于 Laravel5.0 的,所以我还是打算基于 Laravel5.1 演示一遍,并说一下要注意的地方吧。

阅读剩余部分...


今天,把一个项目的无限分类功能整理出来作为一个package开源发布到Packagist。用Laravel的同学可以看看,欢迎提建议或者贡献你的代码:)
顺手就给个star吧,感谢。

Packagist:https://packagist.org/packages/vergil-lai/node-categories
Github:https://github.com/vergil-lai/node-categoires


本文是GitHub上的文章的索引。


PHP编码规范(中文版)导读

本文档是PHP互操作性框架制定小组(PHP-FIG :PHP Framework Interoperability Group)制定的PHP编码规范(PSR:Proposing a Standards Recommendation)中译版。

翻译过程中参照了 莫希爾(Mosil)手札 的繁体中文版,以及 Corrie Zhao 组织翻译的简体中文版,
译文中为了让语句通顺,便于理解,没有对原文逐字翻译,个别语句与原文原意可能略有偏差,希望告知指正。

目前官方已制定的规范包括以下六份文件:

  • 2014/04/25 添加PSR-2补充文件以及修改之前版本中的翻译不当与错误。
  • 2014/07/31 添加PSR-4

以下是原版的导读:


PHP互操作性框架制定小组

组建本小组的目的是,通过在各项目的代表之间讨论他们共同的编码规范,以制定一个协作标准。本规范的主要面向对象是本小组的各个组成成员,当然,同时也欢迎关注本规范的其它PHP社区采用本规范。


今天在Github上发现了一个挺有意思的PHP项目:PsySH。
百度了一番,发现没有任何关于它的中文文章,经过研究,决定写本篇博文来讲述一下。
如果对你有所帮助,请留下你的回复

PsySH

PsySH is a runtime developer console, interactive debugger and REPL for PHP.

PsySH是一个PHP的运行时开发平台,交互式调试器和Read-Eval-Print Loop (REPL)。

说的简单点,就像你用firebug的console调试你的JavaScript代码一样。

安装

官网介绍了3种安装方式:

  • 直接下载
  • Composer安装
  • 直接cloneGitHub仓库的代码

我比较建议选择Composer安装,因为这个项目还有其他的依赖项目,用Composer很好解决这个问题。

以下教程以OS X和Windows 10为例,假定已经安装phpComposer并已经将它们设置为系统环境变量:

OS X

先用Composer下载PsySH,这里用的是全局安装:

$ composer global require psy/psysh

安装完毕后,PsySH已经安装到/Users/{用户名}/.composer/vendor/psy/psysh目录下

此时,你可以直接运行:

$ /Users/{用户名}/.composer/vendor/psy/psysh/bin/psysh

为了使用方便,建议将它加入到环境变量:

$ echo 'export PATH="/Users/{用户名}/.composer/vendor/psy/psysh/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc

Windows

同样地,使用Composer安装,按win键+R键,输入cmd,打开windows控制台,然后:

composer global require psy/psysh

安装完成后,PsySH被安装到C:\Users\{用户名}\AppData\Roaming\Composer\vendor\psy\psysh

因为bin/psysh文件并不是windows的可执行文件,所以需要使用以下命令运行PsySH

php C:\Users\{用户名}\AppData\Roaming\Composer\vendor\psy\psysh\bin\psysh

为了使用方便,在C:\Users\{用户名}\AppData\Roaming\Composer\vendor\psy\psysh\bin目录下新建一个名为psysh.bat的文件,其内容如下:

@ECHO OFF
php "%~dp0psysh" %*

此时,把C:\Users\{用户名}\AppData\Roaming\Composer\vendor\psy\psysh\bin加入到系统的环境变量PATH,以后可以直接在cmd下运行psysh了:

C:\Users\Vergil>psysh
Psy Shell v0.6.1 (PHP 5.6.8 — cli) by Justin Hileman
>>>

阅读剩余部分...


我想大家在写CSS的时候应该都对清除浮动的用法深有体会,今天我们就还讨论下clearfix的进化史吧。

clearfix清除浮动

首先在很多很多年以前我们常用的清除浮动是这样的。

.clear{clear:both;line-height:0;}

现在可能还可以在很多老的站点上可以看到这样的代码,相当暴力有效的解决浮动的问题。但是这个用法有一个致命伤,就是每次清除浮动的时候都需要增加一个空标签来使用。

这种做法如果在页面复杂的布局要经常清楚浮动的时候就会产生很多的空标签,增加了页面无用标签,不利于页面优化。但是我发现大型网站中居然还在使用这种清楚浮动的方法。有兴趣的同学可以上他们首页搜索一下他们的.blank0这个样式名称。

因此有很多大神就研究出了 clearfix 清除浮动的方法,直接解决了上面的缺陷,不需要增加空标签,直接在有浮动的外层加上这个样式就可以了,这也是我们今天要讨论的clearfix进化史。

起源

.clearfix:after {
    visibility: hidden;
    display: block;
    font-size: 0;
    content: " ";
    clear: both;
    height: 0;
}
.clearfix { display: inline-table; }

* html .clearfix{height: 1%;}//Hides from IE-mac
.clearfix {display: block;}//End hide from IE-mac

解释一下以上的代码:

  • 对大多数符合标准的浏览器应用第一个声明块,目的是创建一个隐形的内容为空的块来为目标元素清除浮动。

  • 第二条为clearfix应用 inline-table 显示属性,仅仅针对IE/Mac。利用 * 对 IE/Mac 隐藏一些规则:

  • height:1% 用来触发 IE6 下的haslayout。

  • 重新对 IE/Mac 外的IE应用 block 显示属性。

  • 最后一行用于结束针对 IE/Mac 的hack。(是不是觉得很坑爹,Mac下还有IE)

起源代码可能也是很早期的时候了,再往后Mac下的IE5也发展到IE6了,各种浏览器开始向W3C这条标准慢慢靠齐了。所以就有了下面这个写法出现了。

.clearfix:after {
    visibility: hidden;
    display: block;
    font-size: 0;
    content: " ";
    clear: both;
    height: 0;
}

* html .clearfix { zoom: 1; } /* IE6 */
*:first-child+html .clearfix { zoom: 1; } /* IE7 */

IE6 和 IE7 都不支持 :after 这个伪类,因此需要后面两条来触发IE6/7的haslayout,以清除浮动。幸运的是IE8支持 :after 伪类。因此只需要针对IE6/7的hack了。

在一个有float 属性元素的外层增加一个拥有clearfix属性的div包裹,可以保证外部div的height,即清除"浮动元素脱离了文档流,包围图片和文本的 div不占据空间"的问题。

Jeff Starr 在这里针对IE6/7用了两条语句来触发haslayout。我在想作者为什么不直接用 * 来直接对 IE6/7 同时应用 zoom:1 或者直接就写成:

.clearfix:after {
    visibility: hidden;
    display: block;
    font-size: 0;
    content: " ";
    clear: both;
    height: 0;
}
.clearfix{*zoom:1;}

但是对于很多同学这种优化程度代码还是不够给力,clearfix 发展到现在的两个终极版。

重构clearfix浮动

构成Block Formatting Context的方法有下面几种:

  • float的值不为none。

  • overflow的值不为visible。

  • display的值为table-cell, table-caption, inline-block中的任何一个。

  • position的值不为relative和static。

很明显,float和position不合适我们的需求。那只能从overflow或者display中选取一个。

因为是应用了.clearfix和.menu的菜单极有可能是多级的,所以overflow: hiddenoverflow: auto也不满足需求
(会把下拉的菜单隐藏掉或者出滚动条),那么只能从display下手。

我们可以将.clearfix的display值设为table-cell, table-caption, inline-block中的任何一个

但是display: inline-block会产生多余空白,所以也排除掉。

剩下的只有table-cell, table-caption,为了保证兼容可以用display: table来使.clearfix形成一个Block Formatting Context
因为display: table会产生一些匿名盒子,这些匿名盒子的其中一个(display值为table-cell)会形成Block Formatting Context。

这样我们新的.clearfix就会闭合内部元素的浮动。

后面又有人对此进行了改良:

终极版一:

.clearfix:after {
    content:"\200B";
    display:block;
    height:0;
    clear:both;
}
.clearfix {*zoom:1;}/*IE/7/6*/

解释下:content:"\200B";这个参数,Unicode字符里有一个“零宽度空格”,即 U+200B,代替原来的“.”,可以缩减代码量。而且不再使用visibility:hidden

终极版二:

.clearfix:before,.clearfix:after{
    content:"";
    display:table;
}
.clearfix:after{clear:both;}
.clearfix{
    *zoom:1;/*IE/7/6*/
}

这两个终极版代码都很简洁,终极版一和二都可以使用,以上代码都经过测试,大家赶紧用一下吧,如果你还停留在clearfix的老代码的时候就赶紧更新一下代码吧。


今天在使用phpmailer smtp发送QQ邮箱的邮件时遇到些问题,在此记录一下:

QQ的发送邮件服务器:smtp.qq.com,使用SSL,端口号465或587
而且需要使用独立密码
代码如下:

$mailer = PHPMailer();
$mailer->IsSMTP();
$mailer->SMTPAuth = true;
$mailer->SMTPSecure = 'ssl';
$mailer->Password = 'QQ邮箱独立密码';
//...其他配置省略

Powered by Typecho.