“->”(减号、右尖括号)
用于类中,访问类里的函数或对象,比如:
代码如下 | 复制代码 |
<?php class Test { function do_test() { echo "Doing foo."; } } $bar = new Test; $bar->do_test(); ?> |
"=>"(等号、右尖括号)
数组中给值赋值,比如:
代码如下 | 复制代码 |
$arr=array("one" =>("1"=>10, "2"=>20), "two"=>2); |
那么$arr["one"]["1"]=10;
‘->’与C++类似,用以指向对象内部结构或方法;
‘=>’是PHP数组带索引元素定义的一种方式。
=> 键值对,左边是键,右边是值(类似 json 的 key:val )
在php文件上传时我们都会要用到判断文件类型,下面我来介绍几种常用见判断文件类型格式的实例。php中如何判断图片格式,下面给出一种较为简便的方法:
第一种思想方法就是把图片路径当作字符串来处理,那么判断图片格式的也就是变成了查找.号的字符串
代码如下 | 复制代码 |
$file= "test.jpg"; $filetype= strtolower(strrchr($file,".")); $arrtype = array(".jpeg",".bmp",".gif",".jpg"); if(!in_array($filetype,$arrtype)) exit; } |
getimagesize获取图片大小格式的方式,这个不是gd类库函数这个方法很经典,不仅可以用来判断图片格式还可以获得图片长宽信息
一个示例如下:
代码如下 | 复制代码 |
$array = getimagesize(“images/flower_1.jpg”); print_r($array); |
该函数的返回值是一个数组,内容大致如下:
代码如下 | 复制代码 |
Array ( [0] => 350 [1] => 318 [2] => 2 [3] => width=”350″ height=”318″ [bits] => 8 [channels] => 3 [mime] => image/jpeg ) |
按N天分隔时间, 求出每一个时间段的开始和结束. 例如按7天分隔里头, 求当前时间所处的区间的开始和结束. 要注意时区!
注意, 不要简单地对时间戳取模, 而是要对时间戳与开始时间(1970-01-01)的距离进行取模.
代码如下 | 复制代码 |
<? $span = ($time - $zerotime) % ($step * 86400); $sdate = date("Y-m-d H:i:s", $stime); |
注意: Asia/Chongqing 时区, php 5.2.14
代码如下 | 复制代码 |
strtotime('1980-5-1 01:00:00') - strtotime('1980-5-1 00:00:00'); // 输出 0! |
变量与其它变量 明确区别的,下面我来给各位介绍 static 静态变量和属性方法及静态变量的引用与静态函数的用法,各位有需要了解的同学可参考。
静态变量
变量范围的另一个重要特性是静态变量(static variable)。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。看看下面的例子:
例子 7-4. 演示需要静态变量的例子
代码如下 | 复制代码 |
<?php function Test () { $a = 0; echo $a; $a++; } ?> |
本函数没什么用处,因为每次调用时都会将 $a 的值设为 0 并输出 "0"。将变量加一的 $a++ 没有作用,因为一旦退出本函数则变量 $a 就不存在了。要写一个不会丢失本次计数值的计数函数,要将变量 $a 定义为静态的:
例子 7-5. 使用静态变量的例子
代码如下 | 复制代码 |
<?php function Test() { static $a = 0; echo $a; $a++; } ?> |
现在,每次调用 Test() 函数都会输出 $a 的值并加一。
静态变量也提供了一种处理递归函数的方法。递归函数是一种调用自己的函数。写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来中止递归。一下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止:
例子 7-6. 静态变量与递归函数
代码如下 | 复制代码 |
<?php $count++; |
注: 静态变量可以按照上面的例子声明。如果在声明中用表达式的结果对其赋值会导致解析错误。
例子 7-7. 声明静态变量
代码如下 | 复制代码 |
<?php $int++; |
全局和静态变量的引用
在 Zend 引擎 1 代,驱动了 PHP4,对于变量的 static 和 global 定义是以 references 的方式实现的。例如,在一个函数域内部用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用。这有可能导致预料之外的行为,如以下例子所演示的:
代码如下 | 复制代码 |
function test_global_noref() { test_global_ref(); |
执行以上例子会导致如下输出:
代码如下 | 复制代码 |
NULL |
类似的行为也适用于 static 语句。引用并不是静态地存储的:
代码如下 | 复制代码 |
<?php echo "Static object: "; function &get_instance_noref() { echo "Static object: "; $obj1 = get_instance_ref(); |
执行以上例子会导致如下输出:
代码如下 | 复制代码 |
Static object: NULL Static object: NULL |
上例演示了当把一个引用赋值给一个静态变量时,第二次调用 &get_instance_ref() 函数时其值并没有被记住。
注:
1.函数外部声明静态变量意义不大,函数内部声明静态变量受限于作用域,函数外部不能修改函数内部静态变量。
2.引用变量,也是变量,只不过它的值是变量的内存地址。
php保留字 global和static
代码如下 | 复制代码 |
<?php $i = $j = 8; function global_var() { global $j, $b; $c = $j = $b = $i = 4; } global_var(); echo "i:$i, j:$j b:$b c:$c n"; //i:8, j:4 b:4 c: ?> |
函数外和内都有变量$i,但是他们二个是完全不同的变量。函数外的$i是全局变量,该内存空间直到脚本运行结束后才会被释放。函数内的$i是局部变量,程序流经过函数的时候,初始化,退出函数的时候,内存被系统回收,再次调用函数,则再次分配内存空间和回收内存空间。二次分配的内存空间有可能是同一内存地址,也有可能不能同一内存地址。
与$i不同的是$j,通过关键字global将局部变量”转为”全局变量。当调用函数global_var()的时候,并不会重新给$j分配内存空间。同样的,可以在函数外打印$b,却不能打印$c是因为$b是全局变量,不会被销毁。而$c则不能打印,$c已经不存在了,在退出函数就给销毁了。
代码如下 | 复制代码 |
<?php $a = 2; static $b = 2; static $c = 3; function global_var() { static $i, $c; global $j, $a; $c = $a = $b = $i = $j = 4; } global_var(); echo "a:$a b:$b c:$c i:$i j:$j"; //a:4 b:2 c:3 i: j:4 ?> |
首先,我们看函数外的$b和$c,即是全局变量又是static变量。这里static修饰没有太大的意义,因为他们都存放在数据段(data-segment),直到脚本运行完了之后才会被回收。然后,我们再看函数里面的$i和$c,函数调用后,$i和$c其实都没有被回收,但是$i输出是NULL和$c输出是3,这是因为他们的作用域是函数内部,不是函数外部,也就是说$i和$c在函数外是不可见的。函数内static变量的意义就在于此:仅函数内部可见且不会被销毁。也就是说,保证函退出函数,变量也不会被回收,但又不会被其它函数修改。(注:函数外和函数内的$c是二个不同的变量)
代码如下 | 复制代码 |
<?php function global_var() { static $i; ++$j; ++$i; echo "j:$j i:$i n"; } global_var(); //j:1 i:1 global_var(); //j:1 i:2 global_var(); //j:1 i:3 ?> |
上例中,变量$j一直都是1,而$i每调用一次就累加1。这是因为,局部变量存放在堆段,每次退出函数时都会被回收。而$i存放在存放在数据段(data-segment),直到程序执行完毕才会被回收。我们平常说的static变量,如果没有特别指明,都说的是函数内部的static变量。
引用函数与static变量
既然static变量要直到脚本执行结束,才会被销毁。那么,有没有办法访问该变量的值呢?我们来看看下面的示例:
代码如下 | 复制代码 |
<?php get_local_static_var(); $ptr = &get_local_static_var(); get_local_static_var(); ++$ptr; get_local_static_var(); what_i($ptr); get_local_static_var(); //?? what_p($ptr); get_local_static_var(); //?? function &get_local_static_var() { static $i; ++$i; echo "i:$i n"; return $i; } function what_i($ptr) { $i = &get_local_static_var(); ++$i; ++$ptr; } function what_p(&$ptr) { $i = &get_local_static_var(); ++$i; ++$ptr; } ?> |
二个凝问号处,分别输出是8和12。这就说明了只要变量没有被销毁,还是可以被访问。我们可以通过引用函数将static变量的地址返回其它函数。其它函数则可通过static变量的地址访问并且修改它的值。
上例第一处??,为什么是8,而不是9。这是因为what_i($ptr)函数,要求参数是按值传递,即此处的$ptr实参值是5,且参数$ptr和全局变量$ptr是二个不同的变量。第二处??的值是12,为什么不是11的道理亦是如此。what_p(&$ptr)函数,要求参数是按引用传递,即此处的$ptr是指向static变量$i的地址,需要注意的是参数$ptr和全局变量$ptr也是二个不同的变量,只不过他们都指向同一个地方。
前言
我们在写一个Web程序的时候,总会想着把自己的网站更美观一些,功能能更多一些,有时候写一些小的工具或者加上小的插件会让我们的站点更加完善。比如万年历功能,比如我们现在要讲的天气预报功能。
当然我们没法利用专业的卫星接受数据,所以我们的天气数据来自现有的天气预报网站。利用天气预报网站提供的数据服务,我们可以写一个PHP爬虫,然后动态采集我们所需要的数据,并且在目标站点更新数据的时候,我们的程序也能做到同步更新,自动地获取数据。
下面就介绍一下如何编写一个简单的PHP数据采集程序(PHP爬虫)。
原理
给定一个网页的URL,使用PHP下载该网页并得到网页内容,然后通过正则表达式将其中我们感兴趣的数据提取出来,然后输出。
具体在这个例子中,我们要抓取的网页是 http://www.天气网com.cn/weather/101050101.shtml,我们感兴趣的是页面中的未来7天天气情况。
实现
0.获取天气预报网页的URL:
代码如下 | 复制代码 |
$url = "http://www.天气网com.cn/weather/101050101.shtml"; $page_content = file_get_contents($url); |
在这里,file_get_contents() 函数会将 $url 指向的网页下载下来,并把网页内容作为一个字符串返回。于是,$page_content 变量中就是我们要抓取的网页的全部HTML代码了。接下来,我们要从其中抽取我们需要的数据。
1.使用正则表达式匹配符合条件的字符串
先输出 $page_content 的值,然后查看网页源代码,观察可知我们需要的字符串可以在
<!--day 1 -->
......
<!--day 7 -->
这两行的注释里找到。
使用正则表达式来取得 <!--day 1--> 和 <!--day 7--> 之间的所有内容:
代码如下 | 复制代码 |
eregi("<!--day 1-->(.*)<!--day 7-->",$page_content,$res); |
2.补全页面中图片的路径
由于远程网页中的图片路径都是像 /m2/i/icon_weather/29x20/d01.gif 这样的相对路径,我们需要把这些路径补全,在它们前面加上 http://www.天气网com.cn。
代码如下 | 复制代码 |
$forecast = str_replace("<img" width=100% src="","<img" width=100% src="http://www.天气网com.cn",$res[0]); |
至此,$forecast 中就是我们需要的天气预报信息了。这个简单的PHP爬虫也就写好了。
源代码
以下是这个抓取天气预报小程序的完整源代码,其中添加了一些测量各部分程序运行时间的代码,并可以通过设置 $start 和 $end 的值来控制抓取哪几天的信息。
代码如下 | 复制代码 |
$start = 1; if ($end > 7){ eregi("--day $start--(.*)--day $end--", $page_content, $res); $forecast = str_replace("<img" width=100% src="", echo $forecast; echo 'First step costs '.($t2 - $t1).' ms.'; |