月度归档:2012年09月

异步加载JS脚本

异步加载JS脚本:

	function loadSync(url,fn){
		var head = document.getElementsByTagName("head")[0];
		var s = document.createElement("script");
		s.src=url;
		head.appendChild(s);
			 if( s.addEventListener ) {
			    s.addEventListener("load",fn,false);
			 } else if(s.attachEvent) {
				s.attachEvent("onreadystatechagne",function(){
					if(s.readyState==4 || s.readyState == "complete" || s.readyState == "loaded"){
						fn();
					}
				});	 
			}
	}

原理很简单,就是通过document的getElementsByTagName方法获得head元素,然后在其中加入script标签,这个script标签是由document的createElement方法创造出来。

接下来不同浏览器对script元素的处理方式是不同的

这部分参考了鸟哥的eveJsLoader :
http://code.google.com/p/evejsloader/downloads/detail?name=eveJsLoader-1.0.2.js&can=2&q=

一个简单的使用demo如下:

        loadSync("http://lib.sinaapp.com/js/jquery/1.7.2/jquery.min.js",function(){
		alert($);
	});

php中类的属性居然可以为数字?

最近用curl开发rest方式的api的时候,经常用到json编码,发现了一个奇怪的问题。

大家应该都知道一个数组,经过 json_encode 然后 json_decode 以后会变成一个 对象 ,其中键名变成对象的属性名,

到这里奇怪的事情要发生了,如果这个数组是数字索引的,那么就会出现文中的正题了。

比如下边的这段代码:

/*PHP Version 5.3.10*/

	$a[3] = array('id'=>'3','name'=>'hello','description'=>'fasdf');
	$m = json_encode($a);		
	//echo $m;
        ////$m 的值是 {"3":{"id":"3","name":"hello","description":"fasdf"}}object(stdClass)#1 (1) { ["3"]=> object(stdClass)#2 (3) { ["id"]=> string(1) "3" ["name"]=> string(5) "hello" ["description"]=> string(5) "fasdf" } }
	$n = json_decode($m);
	var_dump($n);	
//输出结果为object(stdClass)#1 (1) { ["3"]=> object(stdClass)#2 (3) { ["id"]=> string(1) "3" ["name"]=> string(5)"hello" ["description"]=> string(5) "fasdf" } }

看到奇怪的现象了吧,[“3”]=> object(stdClass)#2 !
其中$n是一个对象,他有一个属性,属性名为3。

OK,接下来大胆假设,类里边可不可以直接定义数字属性呢?


class A {
    public $3 = 3;				
}

报错:
Parse error: syntax error, unexpected ‘$’, expecting T_VARIABLE in t.php on line 18

再假设,将属性名伪装:

class A {
   public function __construct() {
			$m = "3";
			$this->$m=3;
   }			
}

发现可以成功运行,继续修改:

class A {
   public function __construct() {
	$m = "3";
	$this->$m=3;
   }			
}
$a = new A();
var_dump($a);
//输出结果object(A)#3 (1) { ["3"]=> int(3) } 	

求解释这个是什么现象呢?

自己封装的一个查询星座运势的API

PHP中的curl是个很好的工具,应用他可以提供REST模式的API调用。

为了学习下CURL,作者将查询每个星座运势的代码,封装城函数,托管到了BAE上。数据来源于搜狐的星座运势,他的运势好像来自

紫薇星座网,特此对这两个网站表示感谢。

为了调用API方便,封装了如下的函数:


if(!function_exists('bae_api_call')) {

	function bae_api_get($api_name){
		
		$params = func_get_args();
		
		array_shift($params);
		
		$url  = 'http://limapi.duapp.com/api.php';
		
		$d['api_name'] = $api_name;
		
		$d['params']= '';
		
		foreach ($params as $k=>$p)
			
			$d['params['.$k.']'] = $p;
		
		$ch = curl_init($url);
		
		curl_setopt($ch, CURLOPT_POST, true);
		
		curl_setopt($ch, CURLOPT_POSTFIELDS, $d);
		
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		
		curl_setopt($ch, CURLOPT_HTTPHEADER, array('User-Agent :Internet Explorer/8.3 (X11; Ubuntu Server; ) Api called'));			//过滤设置,特殊HTTP头

		$content = curl_exec($ch);
		
		return json_decode($content);
		
	}

}

其中

curl_setopt($ch, CURLOPT_HTTPHEADER, array('User-Agent :Internet Explorer/8.3 (X11; Ubuntu Server; ) Api called'));			

这一行是为了过滤掉直接的请求,采用了HTTP报文的欺骗,嘿嘿!恶搞的,Ubuntu Server 下怎么可能有8.3版本的IE浏览器,o(∩∩)o…哈哈

调用解释: bae_api_call 加的一个必须参数是api的名字,星座运势的名字是horoscope,然后传递调用的两个参数,查询星座运势需要两个参数,

那个星座,这个参数需要设置各个星座的英文表示,注意是小写哦。

十二星座的英文标识如下:

'aries','taurus','gemini','cancer','leo','virgo','libra','scorpio','sagittarius','capricorn','aquarius','pisces'

第三个参数是时间,集合是today tomorrow thisweek thismonth

分别表示查询当天运势,明天运势,本周运势和本月运势。

调用的一个demo如下:

echo bae_api_get('horoscope','cancer','today');		

是查询巨蟹座今天的运势。

注意,要把网页的编码设置为UTF-8b编码哦。

稍后的文章会对整个API的实现做出详细的解释,敬请关注……