重温PHP手册 – 引用

引用

在 PHP 中引用意味着用不同的名字访问同一个变量内容。

引用做什么

如果对一个未定义的变量进行引用赋值、引用参数传递或引用返回,则会自动创建该变量。

function foo(&$var) { }

foo($a); // $a is "created" and assigned to null

$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)

继续阅读

重温PHP手册 – 生成器

生成器

(PHP 5 >= 5.5.0)生成器提供了一种更容易的方法来实现简单的对象迭代。

生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组,生成器可以根据需要 yield 多次,以便生成需要迭代的值。

一个简单的例子就是使用生成器来重新实现 range() 函数。 标准的 range() 函数需要为其中的每一个返回值在内存中生成一个数组, 结果就是生成一个很大的数组。 比如,调用 range(0, 1000000) 将导致内存占用超过 100 MB。

做为一种替代方法, 我们可以实现一个 xrange() 生成器, 只需要足够的内存来创建 Iterator 对象并在内部跟踪生成器的当前状态,这样只需要不到1K字节的内存。

继续阅读

重温PHP手册 – 异常

PHP 异常

在 PHP 代码中所产生的异常可被 throw 语句抛出并被 catch 语句捕获。

  • 需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常。
  • 每一个 try 至少要有一个与之对应的 catch。
  • 使用多个 catch 可以捕获不同的类所产生的异常。
  • 当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行。
  • PHP 允许在 catch 代码块内再次抛出(throw)异常。

当一个异常被抛出时,其后(指抛出异常时所在的代码块后面)的代码将不会继续执行,而 PHP 就会尝试查找第一个能与之匹配的 catch。如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出 Uncaught Exception … (未捕获异常)的提示信息。

PHP 内部函数主要使用错误报告, 只有现代面向对象的扩展才使用异常。但错误可以很容易的通过ErrorException转换为异常。

继续阅读

重温PHP手册 – 命名空间

命名空间概述

PHP 在 5.3.0 以后开始支持的命名空间提供了一种将相关的类、函数和常量组合到一起的途径。解决了如下两类问题:

  1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名,提高源代码的可读性。

继续阅读

重温PHP手册 – 类与对象

基本概念

$this

$this 是一个到主叫对象的引用(如果是从第二个对象静态调用时也可能是另一个对象)。

$this 和 self 的区别:

  • $this 指向当前的 object, self 指向当前的 class。
  • 访问类中声明的静态(static)变量和静态函数,需使用 self(使用 $this 合法,但输出 null)

继续阅读

买彩票机选和守号哪个中奖概率高?

我有买彩票,不过就是瞎买买。早之前是随机买过一注,然后一直买这个号,不过断过一段时间没买,后来就一直是每期机选一注了。算起来也有一年多了,但目前最高奖金还是停留在5元…

于是乎就冒出了这么一个想法,机选跟守号(随意买的,没有刻意去研究彩票)哪个中奖的可能性高一些?

本着实践出真知的想法,顺便学习下拖了很久的Python网络爬虫,写了个小程序,抓取了历年大乐透/双色球的开奖数据,进行了简单的验证。

抓取彩票开奖数据

Python网络爬虫,结合pyQuery解析HTML内容,很容易就将历年开奖数据保存到本地csv文件中。

继续阅读

Python网络爬虫入门教程

本文主要介绍了如何使用Python实现基础的网络爬虫来抓取网页内容(使用 Python 2.7 的 urllib2 库)。

基本使用

使用 urllib2 模块可以轻松抓取页面的源代码。主要用到两个函数:

  • urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])
  • urllib2.urlopen(url[, data][, timeout])

继续阅读

重温PHP手册 – 函数

用户自定义函数

  • 函数无需在调用之前被定义,除非是函数是有条件被定义时。
  • PHP 不支持函数重载,也不可能取消定义或者重定义已声明的函数。
  • 在 PHP 中可以调用递归函数。但是要避免递归函数/方法调用超过 100-200 层,因为可能会使堆栈崩溃从而使当前脚本终止。
/* 现在还不能调用bar()函数,因为它还不存在 */
foo();

function foo()
{
  function bar()
  {
    echo "I don't exist until foo() is called.\n";
  }
}

/* 现在可以调用bar()函数了,因为foo()函数
   的执行使得bar()函数变为已定义的函数 */
bar();

继续阅读

重温PHP手册 – 流程控制

break

break 可以接受一个可选的数字参数来决定跳出几重循环,默认为1。

$i = 0;
while (++$i) {
    switch ($i) {
    case 5:
        echo "At 5<br />\n";
        break 1;  /* 只退出 switch. */
    case 10:
        echo "At 10; quitting<br />\n";
        break 2;  /* 退出 switch 和 while 循环 */
    default:
        break;
    }
}

类似的,continue 接受一个可选的数字参数来决定跳过几重循环到循环结尾,默认为1。

继续阅读