文章转自PHP5研究室,作者:John Mertic

------------------

“PHP V5.3 中的新特性” 系列文章将持续介绍该发行版提供的令人兴奋的新特性。第 1 部分 介绍了 PHP 5.3 中对面向对象编程及对象处理所做的更改,第 2 部分 介绍了闭包函数及 lambda 函数。第 3 部分 探讨了名称空间,这是该 PHP 版本中最令人期待也是最具争议的特性之一。在 第 4 部分中,我们进一步研究了 Phar,这是一种用于 PHP 的归档格式。在本系列的最后一部分中,了解从 PHP V5.2 升级到 PHP V5.3 时要考虑的一些事情。PHP V5.3 中的一些变化破坏了向后兼容性,有些特性在 PHP V5.3 中不受支持,在将来的版本中将被取消。本文还介绍 PHP V5.3 对 PHP 中一些已有特性的增强。

简介

本系列着重介绍 PHP V5.3 中的新特性,例如名称空间、闭包、对象管理、面向对象编程和 Phar。虽然这些动人的新特性作为该语言的增补广受欢迎,但 PHP V5.3 同时也是为进一步优化 PHP 而设计的。它构建在流行、稳定的 PHP V5.2 的基础上,并对该语言作了增强,使之更加强大。在本文中,了解 PHP V5.3 中的变化,以及从 PHP V5.2 升级到 PHP V5.3 时需要考虑的一些事情。



语法变化

该语言新增了名称空间和闭包,增加了更多的保留字。从 PHP V5.3 开始,namespace 不再用作标识符。closure 类现在是一个保留类,但它仍然可以作为有效的标识符。清单 1 显示了一些例子,由于新增的保留字的缘故,有些语句在 PHP V5.3 中不再有效。


清单 1. 无效的 PHP 语句


// the function definition below will throw a fatal error in PHP 5.3, but is perfectly
// valid in 5.2
function namespace()
{
....
}

// same with this class definition
class Closure
{
....
}

PHP V5.3 中还增加了对 goto 语句的支持。现在,goto 是一个保留字。goto 语句在现代语言中不太常见(您也许记得在 BASIC 中如何使用 goto),但是有些情况下,goto 语句的确方便。清单 2 显示了一个如何使用 goto 语句的例子。


清单 2. PHP 中的 goto 语句


echo "This text will get outputted";
goto a;

echo "This text will get skipped";

a:
echo "This text will get outputted";

goto 的一个可能的用例是中断深度嵌套的循环和 if 语句。这将使代码阅读起来清晰很多。



函数和方法的变化

在 PHP V5.3 中,函数和方法没有大的变化,但还是有一些增强,以帮助解决 PHP 中的一些突出问题并提高性能。本节讨论一些较为显著的变化。

在之前版本的 PHP 中,数组函数 atsortnatcasesortusortuasortuksortarray_flip 和 array_unique 可以以参数形式传递对象而不是数组。然后,这些函数将对象的属性当做数组的键和值。PHP V5.3 中不再支持这一点,所以需要首先将对象转换成数组。清单 3 展示了如何修改代码。


清单 3. 为某些函数修改代码,将对象转换成数组


$obj = new stdClass;
$obj->a = '1';
$obj->b = '2';
$obj->c = '3';

print_r(array_flip($obj)); // will NOT work in PHP 5.3, but will in PHP 5.2

print_r(array_flip((array) $obj)); // will work in PHP 5.3 and 5.2

魔术类方法现在受到更严格的限制。下面的方法必须具有公共可见性:

  • __get
  • __set
  • __isset
  • __unset
  • __call

现在,当在静态上下文中使用 __call 时,为了应对上述变化,可以使用新的 __callStatic() 魔术方法。除了不接受参数的 __isString() 魔术方法以外,这些方法的必需参数都是强制性的,并且必须提供。清单 4 显示了如何使用这些方法以及它们的必需参数。


清单 4. 使用魔术方法


class Foo
{
public function __get($key) {} // must be public and have one parameter
public function __set($key,$val) {} // must be public and have two parameters

public function __toString() {} must be public and have no parameters
}

在 Windows 上,有些函数之前在 PHP 中不受支持,现在在 PHP V5.3 中获得支持。例如,getopt() 函数用于解析从命令行调用 PHP 脚本时使用的选项。用于编码和解码 Internet 地址的 inet_ntop() 和 inet_pton() 函数,现在也可以在 Windows® 上使用。还有一些数学函数,例如 asinh()acosh()atanh()log1p() 和 expm1(),现在在 Windows 上也受支持。



扩展的变化

PHP Extension C Library(PECL)一直都是 PHP 中的新扩展的来源地。当一个扩展已经成熟和稳定,并且被认为可以成为核心发行版中一个有用的功能,那么它通常在重大的版本变更时被添加进来。根据这条规 则,从 PHP V5.3 开始,下面的扩展会成为核心 PHP 发行版中的一部分。

FileInfo
提供帮助检测文件的内容类型和编码的函数,这些函数通过查看文件中的某些魔术字节字符序列进行检测。
intl
International Components for Unicode(ICU)库的一个包装器,提供用于 unicode 和全球化支持的函数。
Phar
第 4 部分 中讨论过的一个 PHP 归档工具。
mysqlnd
用于 MySQL 数据库访问的一个本地 PHP 驱动程序,是早期利用 libmysql 库的 MySQL 和 MySQLi 扩展的替代物。
SQLite3
用于使用 SQLite V3 数据库的一个库。

当一个扩展不再受到积极的维护,或者被认为不值得随核心 PHP 发行版一起发行时,它通常被转移到 PECL。在 PHP V5.3 的改造过程中,下面这些扩展被踢出核心 PHP 发行版,而放在 PECL 中进行维护。

ncurses
对 curses 的模拟,用于在命令行显示图形化的输出。
fpdf
用于在 PDF 文档中构建和使用表单和表单数据。
dbase
提供读写 dbase 兼容文件的支持。
fbsql
支持 Frontbase 数据库服务器上的数据库访问。
ming
一个开源库,用于创建 Flash 4 动画。

Sybase 扩展已经被完全移除,取而代之的是 sybase_ct 扩展。sybase_ct 扩展与前者完全兼容,应该是一个简易替代者(drop-in replacement)。这个更新的功能将使用 Sybase client 库,需要将这些库安装在 Web 服务器上。



构建的变化

PHP V5.3 着重改善了构建过程,因此更容易在所有平台上构建 PHP。为了维护 PHP 构建之间的一致性,并提供一组可靠的组件,在构建中不再禁用 PCRE、Reflection 和 SPL 扩展。现在,可以构建可分发的 PHP 应用程序,它们将使用这些扩展并且保证这些扩展是可用的。

一个新的团队在去年接管了 PHP Windows 构建。这个小组将为 Windows 上的用户提供一些改进。新的构建将以 586 架构(Intel® Pentium® 或更高型号)为目标,并要求 Windows 2000/XP 或更高版本,另外去掉了对 Windows 98/NT 及之前版本的支持。将构建使用 Microsoft® Visual Studio® 2008 构建的 PHP 构建和针对 x86-64 架构的构建。当和 Microsoft IIS Web 服务器上的 FastCGI 或者和 Apache 一起使用时,在使用相同的编译器和架构进行构建的情况下,它们可以提供更高的性能。Windows 安装程序也将有所改进,以便更好地在 Microsoft IIS Web 服务器上配置 PHP。该团队专门为 Windows 上的 PHP 建立了一个网站(参见 参考资料)。



.ini 的变化

PHP 的一个重要特性是,可以使用 .ini 文件配置它的行为。在 PHP V5.3 中,与这个文件有关的一些有问题的指令已经被删除,例如 zend.ze1_compatibility_mode。现在,在使用这个文件时,灵活性有了巨大的提高。

对于 php.ini 文件有两个重大的改进:

  • 在 php.ini 文件中可以使用变量。这对于减少该文件的冗余非常方便,必要时更新文件也更加方便。清单 5 显示了一个例子。 

    清单 5. php.ini 文件中的变量

    foo = bar

    [section]
    newfoo = ${bar}

    foo 和 newfoo 有相同的值。
  • 和用 Apache 配置文件进行设置一样,可以进行 per-directory 和 per-site PHP ini 设置。这样做的优点是,在所有不同的可运行 PHP 的 SAPI 中,语法都是一致的。清单 6 显示了如何进行 PHP ini 设置。 

    清单 6. per-site 和 per-directory .ini 设置

    [PATH=/var/www/site1]

    ; directives here only apply to PHP files in the /var/www/site1 directory

    [HOST=www.example.com]

    ; directives here only apply to PHP files requested from the www.example.com site.

还可以像对待 Apache HTTP Web 服务器上的 .htaccess 文件一样,在用户指定的、位于文件系统的 .ini 文件中创建这些 .ini 指令。这个文件的默认文件名由 user_ini.filename 指令指定。通过将这条指令设置为空值,可以禁用该特性。在用户指定的 .ini 文件中,任何 per-site 和 per-directory 指令都不能被覆盖。



放弃的特性

PHP V5.3 开始正式放弃一些较旧的函数,将来版本的 PHP 中将不再提供它们。当使用这些函数时,会遇到 E_DEPRECATED 错误。以下函数在 PHP V5.3 中被遗弃:

  • tick(declare(ticks=N) 和 register_tick_function()),之前用于在 declare() 块中当解析器每执行 n 条语句时就进行一个函数调用。它们将被废除,因为它们的函数中有很多的中断,而且该特性不大常用。
  • define_syslog_variables(),该函数初始化所有与 syslog 相关的变量。该函数不是必需的,因为它定义的常量已经被全局定义。废除这个函数调用应该是有必要的。
  • ereg 正则表达式函数。建议使用 PCRE 正则表达式函数替代,因为它们更快,并且与其他语言和应用程序中使用的正则表达式更加一致。对 ereg 函数的支持将被废除,以使 PHP 可以标准化地使用一个正则表达式引擎。

建议在迁移到 PHP V5.3 时移除这些特性。将来主要的 PHP 发行版将取消对上述特性的支持。



结束语

PHP V5.3 有很多新的特性,同时也 “清除” 了一些内容。另外也存在一些向后兼容的问题。本文为将 Web 应用程序迁移到 PHP V5.3 提供了一些指南。要了解最新的关于 PHP V5.3 的详细信息,请参阅 PHP wiki,其中提供了可能影响到应用程序的任何其他变化的说明。

posted @ 2012-02-27 16:43 小马歌 阅读(252) | 评论 (0)编辑 收藏
 
web server避免一些不必要的麻烦,可以把apache和php的版本信息不显示

隐藏 Apache 版本信息

/etc/apache2/apache2.conf 或 /etc/httpd/conf/httpd.conf

ServerTokens ProductOnly
ServerSignature Off

重启 apache
现在 http 头里面只看到:
Server: Apache

=====================

nginx

#vi nginx.conf
在http 加上 server_tokens off;

如下:

http {
……省略配置
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
tcp_nodelay on;
server_tokens off;
…….省略配置
}

=======================

隐藏 PHP 版本
php.ini

expose_php On
改成
expose_php Off

重启apache后,php版本在http头中隐藏了。

详解 :

为了防止某些别有用心的家伙窥视我们的服务器,应该做些什么.
我们来看一下相关的2个参数,分别为ServerTokens和ServerSignature,通过控制这2个阀门应该就能起到一些作用,比如我们可以在配置文件中这么写:
ServerTokens Prod
ServerSignature Off

ServerTokens
用 于控制服务器是否相应来自客户端的请求,向客户端输出服务器系统类型或内置模块等重要的系统信息。在主配置文件中提供全局控制默认阀值为"Full" (ServerTokens Full),所以,如果你的Linux发行版本没有更改过这个阀值的话,所有与你的系统有关的敏感信息都会向全世界公开。比如RHEL会将该阀值更改 为"ServerTokens OS",而Debian依然使用默认的"Full"阀值
以apache-2.0.55为例,阀值可以设定为以下某项(后面为相对应的Banner Header):
Prod >>> Server: Apache
Major >>> Server: Apache/2
Minor >>> Server: Apache/2.0
Minimal >>> Server: Apache/2.0.55
OS >>> Server: Apache/2.0.55 (Debian)
Full (or not specified) default >>> Server: Apache/2.0.55 (Debian) PHP/5.1.2-1+b1 mod_ssl/2.0.55 OpenSSL/0.9.8b

ServerSignature
控制由系统生成的页面(错误信息,mod_proxy ftp directory listing等等)的页脚中如何显示信息。

可在全局设置文件中控制,或是通过.htaccess文件控制
默认为"off"(ServerSignature Off),有些Linux发行版本可能会打开这个阀门,比如Debian在默认的虚拟主机上默认将这个阀门设置为开放
全局阀门的阀值会被虚拟主机或目录单位的配置文件中的阀值所覆盖,所以,必须确保这样的事情不应该发生
可用的阀值为下面所示:
Off (default): 不输出任何页脚信息 (如同Apache1.2以及更旧版本,用于迷惑)
On:输出一行关于版本号以及处于运行中的虚拟主机的ServerName (2.0.44之后的版本,由ServerTokens负责是否输出版本号)
EMail: 创建一个发送给ServerAdmin的"mailto"

注意*上述关于如何设置2个阀门从而尽量减少敏感信息泄露的方法,并不会使你的服务器真的更安全,如果你现在使用的版本比较旧,请务必尽快将系统升级,降低被蠕虫攻击的风险。

 

隐藏server信息

cd /usr/local/src/nginx-0.5.35/src/core/
[root@zyatt core]# cat nginx.h
/*
* Copyright (C) Igor Sysoev
*/
#ifndef _NGINX_H_INCLUDED_
#define _NGINX_H_INCLUDED_
#define NGINX_VERSION      "1.0"
#define NGINX_VER          "LPKWS/" NGINX_VERSION
#define NGINX_VAR          "LPKWS"
#define NGX_OLDPID_EXT     ".oldbin"
#endif /* _NGINX_H_INCLUDED_ */
测试效果
C:\curl-7.18.0>curl.exe -I 211.100.11.122/info.php

HTTP/1.1 200 OK
Server: LPKWS/1.0
Date: Tue, 11 Mar 2008 04:53:02 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
X-Powered-By: PHP/5.2.4

 

还有更彻底的编译安装

修改src/core/nginx.h

#define NGINX_VERSION "1.0.5"

#define NGINX_VER "nginx/" NGINX_VERSION

#define NGINX_VAR "NGINX"


修改src/http/ngx_http_header_filter_module.c48-49
static char ngx_http_server_string[] = "Server: nginx" CRLF;
static char ngx_http_server_full_string[] = "Server: nginx" CRLF;


修改src/http/ngx_http_special_response.c

staticu_char ngx_http_error_tail[]="<hr><center>nginx</center>"CRLF

"</body>"CRLF

"</html>"CRLF

;


嘿嘿,接下来就编译安装吧!不过修改源码后还有1个地方要修改哦,Nginx的FastCGI配置文件fastcgi.conf

fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

常用Web Server版本名称:

Microsoft-IIS
GWS或GFE
Apache

Lighttpd

 

 

 

1. Lighttpd 1.4.20
src/response.c:108 改为:
buffer_append_string_len(b, CONST_STR_LEN("Server: jufukeji"));
输出 Header:
HTTP/1.1 404 Not Found
Content-Type: text/html
Content-Length: 345
Date: Mon, 12 Jan 2009 13:54:02 GMT
Server: jufukeji

2. Nginx 0.7.30
src/http/ngx_http_header_filter_module.c:48-49 改为:
static char ngx_http_server_string[] = "Server: jufukeji" CRLF;
static char ngx_http_server_full_string[] = "Server: jufukeji" CRLF;
输出 Header:
HTTP/1.1 200 OK
Server: jufukeji
Date: Mon, 12 Jan 2009 14:01:10 GMT
Content-Type: text/html
Content-Length: 151
Last-Modified: Mon, 12 Jan 2009 14:00:56 GMT
Connection: keep-alive
Accept-Ranges: bytes

3. Cherokee 0.11.6
cherokee/version.c:93 添加:
ret = cherokee_buffer_add_str (buf, "jufukeji");
return ret;
输出 Header:
HTTP/1.1 200 OK
Connection: Keep-Alive
Keep-Alive: timeout=15
Date: Mon, 12 Jan 2009 14:54:39 GMT
Server: jufukeji
ETag: 496b54af=703
Last-Modified: Mon, 12 Jan 2009 14:33:19 GMT
Content-Type: text/html
Content-Length: 1795

4. Apache 2.2.11
server/core.c:2784 添加:
ap_add_version_component(pconf, "jufukeji");
return;
输出 Header:
HTTP/1.1 200 OK
Date: Mon, 12 Jan 2009 14:28:10 GMT
Server: jufukeji
Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT
ETag: "1920edd-2c-3e9564c23b600"
Accept-Ranges: bytes
Content-Length: 44
Content-Type: text/html

5. Squid 3.0 STABLE 11
src/globals.cc:58 改为:
const char *const full_appname_string = "jufukeji";
输出 Header:
HTTP/1.0 400 Bad Request
Server: jufukeji
Mime-Version: 1.0
Date: Mon, 12 Jan 2009 15:25:15 GMT
Content-Type: text/html
Content-Length: 1553
Expires: Mon, 12 Jan 2009 15:25:15 GMT
X-Squid-Error: ERR_INVALID_URL 0
X-Cache: MISS from 'cache.hutuworm.org'
Via: 1.0 'cache.hutuworm.org' (jufukeji)
Proxy-Connection: close

6. Tomcat 6.0.18
java/org/apache/coyote/http11/Constants.java:56 和 java/org/apache/coyote/ajp/Constants.java:236 均改为:
ByteChunk.convertToBytes("Server: jufukeji" + CRLF);
输出 Header:
HTTP/1.1 200 OK
Server: jufukeji
ETag: W/"7857-1216684872000"
Last-Modified: Tue, 22 Jul 2008 00:01:12 GMT
Content-Type: text/html
Content-Length: 7857
Date: Mon, 12 Jan 2009 16:30:44 GMT

7. JBoss 5.0.0 GA
a. tomcat/src/resources/web.xml:40 改为
jufukeji
b. 下载 JBoss Web Server 2.1.1.GA srctar (http://www.jboss.org/jbossweb/downloads/jboss-web/)
java/org/apache/coyote/http11/Constants.java:56 和 java/org/apache/coyote/ajp/Constants.java:236 均改为:
ByteChunk.convertToBytes("Server: jufukeji" + CRLF);
将编译所得 jbossweb.jar 覆盖 JBoss 编译输出文件:
JBOSS_SRC/build/output/jboss-5.0.0.GA/server/all/deploy/jbossweb.sar/jbossweb.jar
JBOSS_SRC/build/output/jboss-5.0.0.GA/server/standard/deploy/jbossweb.sar/jbossweb.jar
JBOSS_SRC/build/output/jboss-5.0.0.GA/server/default/deploy/jbossweb.sar/jbossweb.jar
JBOSS_SRC/build/output/jboss-5.0.0.GA/server/web/deploy/jbossweb.sar/jbossweb.jar
输出 Header:
HTTP/1.1 200 OK
Server: jufukeji
X-Powered-By: jufukeji
Accept-Ranges: bytes
ETag: W/"1581-1231842222000"
Last-Modified: Tue, 13 Jan 2009 10:23:42 GMT
Content-Type: text/html
Content-Length: 1581
Date: Tue, 13 Jan 2009 10:30:42 GM

posted @ 2012-02-27 16:06 小马歌 阅读(1948) | 评论 (0)编辑 收藏
 
Chrome 浏览器作为基于Webkit的新一代浏览器。Chrome自从正式发布以来,市场占有率逐步提高,自从公布了Chrome扩展的API以来,Chrome扩展开发更是前途似锦。一个Chrome插件小则可以解决生活中琐碎的问题,多则可以惠及千众,造福万代。而且,Google为Chrome建立了自己的Web开发市场,做得好的插件还可以为作者赢得丰厚的利益。

工具/原料

  • Chrome浏览器
  • 文本编辑工具,普通的记事本也可以,不过最好是带格式整理和语法高亮的,笔者用的是Notepad++,需要的朋友可以百度一下。

步骤/方法

  1. 创建一个单独的文件夹,起个名字吧,比如说我们为百度贴吧开发一个插件,就叫TiebaAddion。之后在这个文件夹里创建一个名字为“manifest.json”的文件,在里面写上如下的样子。
    {
    "name": "TiebaAddin",
    "version": "1.0",
    "description": "An addin for Tieba.",
    "browser_action": {"default_icon": "icon.png"},
    "permissions": [http://*/*]
    }
    这里各项的意义很显然可以通过名字得之,但如果你想了解更多,请参考“Chrome扩展”文档(详见参考资料)
  2. 如果你细心看上面的配置文件,你就会知道,你现在需要找一个图标,放在这个目录下,名字叫icon.png,当然,这个名字只要和上面的配置文件里default_icon的属性一致就好。
  3. 现在,只要点击Chrome工具条的菜单按钮选择里面的工具(Tools)>> 扩展(Extensions)就好。菜单按钮如右图。
  4. 选择开发者模式,选择加载未打包的插件,然后,选择第一步中的那个文件夹即可。好吧,现在我们就可以启动插件了。
  5. 好了,在地址栏的右侧出现了我们的图标,但是点击图标却什么也没做,这是自然地,因为我们还什么代码没有写。现在在那个目录下,建立一个html文件,并且名字为popup.html,同时在配置文件里“browser_action”下加上一条:"popup": "popup.html"。示范:
    {
    "name": "TiebaAddin",
    "version": "1.0",
    "description": "An addin for Tieba.",
    "browser_action": {"default_icon": "icon.png","popup": "popup.html"},
    "permissions": [http://*/*]
    }
    此处注意,每一对大括号里的最后一项后面都没有逗号,其余的每项之间必须用逗号间隔!哪怕是browser_action这样复合的项目,在他的大括号后也要有逗号。
  6. 在Popup.html里写上一些html代码,比如简单的输出HelloWorld也好,这个Popup.html和普通的html文件按没有任何差别。


  7. 这就是基本的插件制作方法,插件制作的中级教程我在一下篇相关经验会详细讲解的。

注意事项

  • 第一步:格式要正确,且最好此时文件夹里已经有icon图标。
  • 第三步:有的时候插件需要相关的权限,这一点,可以到百度的数字大人吧学习如何给使用插件。

参考资料

Google Code中Chrome扩展的文档:http://code.google.com/chrome/extensions/getstarted.html 
百度数字大人吧:http://tieba.baidu.com/f?kw=%CA%FD%D7%D6%B4%F3%C8%CB
经验内容仅供参考,如果您需要解决具体问题(尤其在法律、医学等领域),建议您接下来详细咨询相关领域专业人士。
posted @ 2012-02-25 17:50 小马歌 阅读(188) | 评论 (0)编辑 收藏
 
     摘要: 1. AppJump App Launcher and OrganizerAfter you finish downloading all the extensions in this list, you’ll definitely need an organizer.AppJump is a Chrome extension that allows you to locat...  阅读全文
posted @ 2012-02-25 17:47 小马歌 阅读(553) | 评论 (0)编辑 收藏
 
  1. 尽量避免使用DOM。当需要反复使用DOM时,先把对DOM的引用存到JavaScript本地变量里再使用。使用设置innerHTML的方法来替换document.createElement/appendChild()方法。
  2. eval()有问题,new Fuction()构造函数也是,尽量避免使用它们。
  3. 拒绝使用with语句。 它会导致当你引用这个变量时去额外的搜索这样的一个命名空间,with里的代码在编译时期是完全未知的。
  4. 使用for()循环替代for…in循环。因为for…in循环在开始循环之前需要Script引擎创建一个含有所有可循环属性的 List,需要多检查一次。
  5. try-catch语句放在循环外面,不要放在循环里面,因为异常是很少发生的,放在外面避免每次都要执行它们。
  6. 甚至圣经里都提到过这个– 不要全局的。全局变量的生命周期贯穿整个脚本的生命周期,而本地变量的存在范围随着本地命名空间的销毁而消失。当在函数或其它地方引用一个全局变量时,脚本引擎需要搜索整个全局命名空间。
  7. fullName += 'John'; fullName += 'Holdings';执行速度快于fullName += 'John'+'Holdings';
  8. 如果你需要把多个字符串连接起来,最好是把他们做成一个数组,然后调用join()方法实现这个操作。这种方式在生成HTML片段时尤其有效。
  9. 对于简单的任务,最好使用基本操作方式来实现,而不是使用函数调用实现。例如val1 < val2 ? val1 : val2;执行速度快于Math.min(val1, val2);,类似的,myArr.push(newEle);慢于myArr[myArr.length] = newEle;
  10. 将函数的引用作为参数传递到setTimeout()和setInterval()里优于将函数名作为字符串参数传递(硬编码)。例 如,setTimeout(”someFunc()”, 1000)执行效率慢于setTimeout(someFunc, 1000)
  11. 当进行遍历操作时避免使用DOM操作。通过像getElementsByTagName()这种方法得到的DOM元素队列都是动态的;有可能在你还没有对它遍历完成时,它已经被改变。这有可能导致死循环。
  12. 当你对对象的成员(属性或方法)进行反复操作时,先存储对它们的引用。例如var getTags = document.getElementsByTagName; getTags(’div’);
  13. 在任何的代码段里,在局部变量范围外存放一个这个局部变量的引用。例如
    function foo(arr){
    var a = ’something’;//变量‘a’对于下面的一段就是范围外变量,这个变量的引用在很多情况下会有用处。
    for (var i = 0, j = a, loopLen = arr.length; i < loopLen; i++){
    //do something
    }
    }
  14. for(var i=0; i < someArray.length; i++) {…}的执行效率慢于for (var i=0, loopLen=someArray.length; i<loopLen; i++){…}。
  15. 在HTTP头信息里加入缓存控制过期和最大存活时间标记。
  16. 优化CSS。要使用<link>方式,而不要使用@import方式。请参考这个优秀的文档http://www.slideshare.net/stubbornella/object-oriented-css
  17. 使用CSS技术来优化图片资源
  18. 用GZip方式压缩.js 和.css 文件。如果你使用的是Apache,在 .htaccess 里设置压缩方式,你的HTML, XML 和 JSON 也同时会被压缩。
    AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml application/x-javascript application/json
  19. 使用JavaScript压缩工具。除了使用YUI和JSMin外,你还可以试一试Google Closure http://closure-compiler.appspot.com/home (感谢: James Westgate,一位读者)
  20. 优化每个页面上的各种资源,把它们拆分到各个子域上,这么它们就能够并行下载。请参考http://yuiblog.com/blog/2007/04/11/performance-research-part-4/
  21. 将CSS样式表放在页面的最顶端,这样能方便包括IE在内的浏览器进行解析。
  22. 尽量将DOM结构保持的越简单越好。DOM的体积会影响相关的操作效率,像查找, 遍历,DOM改动都有影响。document.getElementsByTagName(’*’).length这个值越小越好。
  23. 注意你使用的选择器。例如,如果你想获取一个ul下的直接子元素,使用jQuery(”ul > li”)而不要使用jQuery(”ul li”)
  24. 当切换元素的可见性时(display),请记住:element.css({display:none})的速度快于 element.hide() 和 element.addClass(’myHiddenClass’)。 除非在一个循环里,我选择element.addClass(’myHiddenClass’),这样会使代码更简洁–不要使用 inline CSS 和 JavaScript。
  25. 当你使用完对DOM的引用变量后,要把它置为NULL。
  26. 使用AJAX时,GET的执行效率高于POST。所以要尽量使用 GET 方式。只是要注意一点,IE只允许你用GET传送2K的数据。
  27. 小心使用脚本动画。没有硬件的支持,动画会执行的很慢。尽量避免使用那些没有实际价值的动画效果。
  28. 如果你的background-image对于这个图片的容器太小的话,请避免使用background-repeat。如果你的背景图片需要来 回填充很多次才能充满背景,那么将background-repeat属性设置成background-image 和repeat-x 或 repeat-y来达到填充背景的效果的做法是不明智的,这种填充方式的效率特别的低。你应该尝试使用一个足够大的图片来做background- image并且使用background-repeat: no-repeat。
  29. 布局时不要使用<table>。 <table>在浏览器完全把它画出来之前需要反复绘制好几次。因为DOM中<table>是很少见的一种之后输出的会影响之前 输出的显示效果的元素。对于表格数据来说,你可以使用table-layout:fixed; 这是一种更有效的现实算法,根据CSS 2.1技术说明,这种写法可以让表格一行一行的输出。
  30. 尽可能的使用原始JavaScript。限制JavaScript框架的使用。
posted @ 2012-02-24 11:11 小马歌 阅读(146) | 评论 (0)编辑 收藏
 

拒绝平庸——浅谈WEB登录页面设计

大C / 视觉设计 / 2012.01.16 / 相关标签     

  用户活跃度是检验产品成功与否的重要指标之一,传统行业的商家极为重视门面的装潢,因为一个好的门面可以聚集人气,招揽更多的顾客。古时候的大户人家院子门口的石狮子或其他的摆件的摆放极为讲究,有一定的风水学说道理,更能彰显主人家的身份地位.由此可见,“门面’就如人的脸面之于人的形象一样重要,而WEB的登录页面就相当传统的“门面”。

  现在越来越多的大型网站把登录和首页放在一起设计,由此可见登录页面的重要性,一个出彩的登录界面,将提升产品的品质,赋予产品独特的气质,登录界面也是一个发挥情感化设计,提升用户体验,拉近与用户之间距离的兵家必争之地,本文不谈趋势,不讲交互大道理,不涉及技术,就侃侃用户登录页面的一些设计表现形式。希望这些设计表现手法能给大家带来一些启发和灵感。

优雅大方
  如果说iPad是介于传统电脑和手机之间的产品,那么tumblr则是介于blog和twitter之间的服务。相比twitter,它的功能更复杂、内容展示性更强、更加重视多媒体的应用。Tumblr做为轻博客的鼻祖,带来一种全新的视觉体验, 安东尼·德·圣-埃克苏佩里曾说过,“完美就是多一点则太多,少一点则太少。” Tumblr的登录页面没有过多的视觉干扰,优雅大方,一切元素的存在都是为了用户更好的登录,登录过程非常流畅。

 

 

精致的质感表现
  iCloud是苹果公司所提供的云端同步服务,用户有5GB的免费存储空间。 负责Macintosh用户界面设计的柯戴尔·瑞茨拉夫回忆说:“乔布斯会一个像素一个像素地检查屏幕上的每个细节,确保相关的图像准确对齐。他非常重视细节,细致程度居然达到了像素的层面。如果发现问题,乔布斯就会立即冲着某个工程师大吼起来。”iCloud登录页面的设计继承了苹果公司对细节的苛求, 细致的纹理,微妙的阴影,精致的质感,完美的细节,金属光泽可以随着鼠标指针移动,底部的图标可以随着分辨率的大小自适应,改变排列方式,确保用户的浏览体验。

  iCloud给我们上了很好的一课,有句大家都听过却未必做到的话——细节决定成败,丰富的细节可以提升设计的价值,也是判断一个设计高下的一条很重要的标准之一,精致舒适的质感纹理,给用户一种沉浸式,充满惊喜的登录体验,是一种很棒的表现方式。

 

小清新的插图
  在网页设计中,插图非常具有表现力,它与绘画艺术关系密切。所以大部分设计职位,对手绘能力出众者格外青睐,许多表现技法都是借鉴了绘画艺术的表现技法。插画艺术与网页设计的的结合,具有独特的艺术魅力,从而更具表现力。越来越多的设计师,将插画运用到网页设计中来,生动有趣温情的清新插图,能迅速的抓住用户的眼球,让登录界面的更加具有亲和力,

  163邮箱的登录页面就采用了大幅的插图,小邮差很快唤醒了80后等待来信的记忆,有故事的插图与用户建立情感的联系,唤起用户的心灵共鸣,让用户更有归属感。

  Vimeo是一家提供高清视频存放服务的网站,在这里可以找到很多来自世界各地非常有创意的设计师。相信登录过Vimeo的朋友都对Vimeo的登陆页面记忆深刻。

 

人文关怀的品牌传达
  设计以人为本,以人为本的设计不仅能提高产品的品质,还能提高设计的艺术水平,而登录页面是体现人文关怀,传播品牌理念的绝佳位置。

  QQ邮箱登陆页面每一次刷新都能看到不同的内容,或用海子的诗,或用迈克尔.杰克逊的歌词,唤起用户的共鸣,设计手法简洁,主体信息突出,引导清晰,并没有多余的元素,界面中最重要的操作“登录”按钮使用了交通中通行的绿色,而没有使用常用的蓝色,细节设计非常考究,对每个细节都注入人文的关怀。

  新浪微博将登录框设计成一条围脖的样式,用户的每一次登录都是一次品牌传达的过程,切合新浪力推的围脖品牌理念,织围脖的概念深入人心。

 

越来越大的登录框
  越来越大的输入框设计,让用户输入起来感到心情舒畅,登录过程非常愉悦,在显示器越来越大的今天,mailchimp大输入框显的霸气十足,并且一反常态的可以看到自己的密码,第一次在WEB登录框里见到这种设计,非常贴心.正是这种不拘一格的设计,让mailchimp从一个内部项目蜕变成一个该公司最成功的商业产品。

 

简约而不简单
  WEB设计的风格越来越趋向于简洁,登录页面大量地使用留白可以让登录框更加突出。最大程度的减少用户分心,从视觉的角度来看,简约的设计是平静的,砍掉了多余的元素,颜色,形状和纹理,不能使用让人眼前一亮的设计元素,只能靠空白去做视觉吸引力。布局的权衡及简化设计做的不到位的话很容易变的单调乏味,wordpress后台登陆页面采用适当的投影,灰色的巧妙运用,以及出错的抖动提示,让整个登录页面简约而不简单.堪称典范。

  随着互联网的高速发展,移动互联网的到来,WEB设计越来越呈现多元化。尽管一个好的设计并代表产品就一定会成功,但却能为产品加分,为产品注入设计DNA,创造独特的风格和视觉感受, 好了,今天就先侃到这,作为用户使用的入口,希望这篇小文可以让大家对登录页面重视起来,设计出更多精彩的登录页面。


posted @ 2012-02-23 15:45 小马歌 阅读(324) | 评论 (0)编辑 收藏
 
     摘要: 才华横溢的Stoyan Stefanov,在他写的由O’Reilly初版的新书《JavaScript Patterns》(JavaScript模式)中,我想要是为我们的读者贡献其摘要,那会是件很美妙的事情。具体一点就是编写高质量JavaScript的一些要素,例如避免全局变量,使用单变量声明,在循环中预缓存length(长度),遵循代码阅读,以及更多。此摘要也包括一些与代码不太相关的习...  阅读全文
posted @ 2012-02-21 17:50 小马歌 阅读(253) | 评论 (0)编辑 收藏
 

jslint是道格拉斯大神的作品,用来检查javascript的语法错误或者给出良好的编码建议。

现在自己多用notepad++来编写/查看一些零散的js代码,于是一天突然想到是否有jslint的插件,上网一搜,果然有,现收录如下,以便查备。

安装步骤如下:

  1. 首先到这里下载该插件并解压到任意目录。
  2. 然后在设置>>导入>>导入插件中选择解压好的JSLintNpp.dll文件。
  3. 然后,然后就木有然后了……

好吧,可以看到安装过程非常简单,当然使用方法也非常简单:

  1. 随意打开一个js文件,然后选择 插件>>JSLint>>JSLint Current File。
  2. JSLint的窗口已经出现在主窗口下方,此时可以看到jslint为本js代码给出的错误以及警告。(话说,这文件错误有点多啊~囧rz~直接就too many errors了)。
  3. 插件>>JSLint>>option 里面包括一些选项,可以根据你自己的需要来配置。The good parts是道大神建议的选项,assume则表示在检查代码时假设js代码的运行环境,一般选择前两项即可。
  4. 木有然后……^^

这个小教程到此为止,祝各位包括自己编码愉快~

ps:之前用visual studio 的编辑器写js都会自动给出提示,并且能高亮错误处,自动格式化代码和代码提示也是非常滴爽啊,可惜就是vs实在太庞大了,速度满足不了,要是能把编辑器分离出来做一个轻量级的JS IDE也是不错啊~

文章转自:http://blog.filod.net/notepad-plus-plus-jslint.html

标签: Notepad++ JSLint
posted @ 2012-02-21 16:15 小马歌 阅读(1192) | 评论 (0)编辑 收藏
 

JSLint是一个JavaScript验证工具(非开源),可以扫描JavaScript源代码来查找问题。如果JSLint发现一 个问题,JSLint就会显示描述这个问题的消息,并指出错误在源代码中的大致位置。有些编码风格约定可能导致未预见的行为或错误,JSLint除了能指 出这些不合理的约定,还能标志出结构方面的问题。尽管JSLint不能保证逻辑一定正确,但确实有助于发现错误,这些错误很可能导致浏览器的 JavaScript引擎抛出错误。

JSLint定义了一组编码约定,这比ECMA定义的语言更为严格。这些编码约定汲取了多年来的丰富编码经验,并以一条年代久远的编程原则 作为宗旨:能做并不意味着应该做。JSLint会对它认为有的编码实践加标志,另外还会指出哪些是明显的错误,从而促使你养成好的 JavaScript编码习惯。

JSLint可能会把一些结构方面的错误标志为可疑的编码实践,以下列出了其中一部分(完整的列表可以参考JSLint的文档)。

    JSLint要求所有代码行都以分号结束。尽管JavaScript确实允许将换行符作为行结束符,但一般认为这种做法是不明确的,而且是不好的编码风格。

    使用if和for的语句必须使用大括号把语句块括起来。

    不同于其他编程语言,在JavaScript中,块不会作为变量的作用域。JavaScript只支持函数级作用域。因此,JSLint只接受作为function、if、switch、while、for、do和try语句一部分的块,其他的块都会标志为错误。

    var只能声明一次,而且在使用之前必须声明。

    JSLint会把出现在return、break、continue或throw语句后面的代码标志为不可达的代码。这些语句后面必须紧跟一个结束大括号。

    对于JavaScript来说,JSLint是一个非常好的工具,因为它会教你一些好的JavaScript编码实践。由于JSLint能 把可能导致逻辑错误或其他未预见行为的部分标出来,因此可以减少调试时间。如果你调试一段JavaScript代码时遇到困难,可以试试JSLint。

posted @ 2012-02-21 16:07 小马歌 阅读(184) | 评论 (0)编辑 收藏
 

Backbone 是一种重量级javascript  MVC 应用框架,通过Models进行key-value绑定及custom事件处理,通过Collections提供一套丰富的API用于枚举功能,通过Views来进行事件处理及与现有的Application通过RESTful JSON接口进行交互.

比较适合于现在的类Twitter web2.0网站的开发!

posted @ 2012-02-21 14:26 小马歌 阅读(188) | 评论 (0)编辑 收藏
仅列出标题
共95页: First 上一页 40 41 42 43 44 45 46 47 48 下一页 Last