for语句

使用PHP的for循环,需要记住以下几点规则。

  • 第一个表达式在第一次循环时自动计算。
  • 第二个表达式在每次循环时进行计算。这个表达式确定是否继续循环。
  • 第三个表达式在每次循环结束时计算。
  • 任何一个表达式都可以为空,它们可以由for块内部的逻辑所取代。
for ($kilometers = 1; $kilometers <= 5; $kilometers++) {
    printf('%d kilometers = %f miles <br />', $kilometers, $kilometers*0.62140);
}

for ($kilometers = 1; ; $kilometers++) {
    if ($kilometers > 5) break;
    printf('%d kilometers = %f miles <br />', $kilometers, $kilometers*0.62140);
}

$kilometers = 1;
for (; ; ){
    if ($kilometers > 5) break;
    printf('%d kilometers = %f miles <br />', $kilometers, $kilometers*0.62140);
    $kilometers++;
}

三个结果都如下:

1 kilometers = 0.621400 miles
2 kilometers = 1.242800 miles
3 kilometers = 1.864200 miles
4 kilometers = 2.485600 miles
5 kilometers = 3.107000 miles

heredoc语法

heredoc语法为输出大量文本提供了一种便利的方式。它不是使用双引号或单引号来界定字符串,而是采用了两个相同的标识符。

$website = ‘http://www.mangolau.com’;
echo <<<HTML
<p>What a good day!<a href=”$website”>Click here</a></p>
HTML;

关于这个例子,有几个值得注意的地方。

开始和结束标识符必须相同,此示例中的开始和结束标识符是HTML,可以选择你喜欢的任何开始和结束标识符,但要求它们必须完全相同。唯一的限制是该标识符只能由字母数字和下划线组成,而且前面不能有空格或任何其他多余的字符。此外,开始或结束标识符后面的任何空格都会导致语法错误。

PHP编程中10个最常见的错误

错误1:foreach循环后留下悬挂指针

在foreach循环中,如果我们需要更改迭代的元素或是为了提高效率,运用引用是一个好办法:

$arr = array(1, 2, 3, 4);

foreach ($arr as &$value) {

$value = $value * 2;

}

// $arr is now array(2, 4, 6, 8)

这里有个问题很多人会迷糊。循环结束后,$value并未销毁,$value其实是数组中最后一个元素的引用,这样在后续对$value的使用中,如果不知道这一点,会引发一些莫名奇妙的错误:)看看下面这段代码:

$array = [1, 2, 3];

echo implode(‘,’, $array), “\n”;

foreach ($array as &$value) {} // by reference

echo implode(‘,’, $array), “\n”;

foreach ($array as $value) {} // by value (i.e., copy)

echo implode(‘,’, $array), “\n”;

上面代码的运行结果如下:

1,2,3

1,2,3

1,2,2

你猜对了吗?为什么是这个结果呢? 继续阅读“PHP编程中10个最常见的错误”

nginx提示:500 Internal Server Error错误的解决方法

现在越来越多的站点开始用 Nginx ,(“engine x”) 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。

在高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。根据测试结果,Nginx 0.6.31 + PHP 5.2.6 (FastCGI) 可以承受3万以上的并发连接数,相当于同等环境下Apache的10倍。

但很多人用 Nginx 的时候都会出现 500 错误,根据我使用的情况来看,很大一部分原因是 因为文件打开句柄太小有关。

继续阅读“nginx提示:500 Internal Server Error错误的解决方法”

php优化

1. If a method c++an be static, declare it static. Speed improvement is by a factor of 4. 如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。

2. echo is faster than print. echo 比 print 快。

3. Use echo’s multiple parameters instead of string concatenation. 使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接。

4. Set the maxvalue for your for-loops before and not in the loop. 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。

5. Unset your variables to free memory, especially large arrays. 注销那些不用的变量尤其是大数组,以便释放内存。

6. Avoid magic like __get, __set, __autoload 尽量避免使用__get,__set,__autoload.

7. require_once() is expensive require_once()代价昂贵。

8. Use full paths in includes and requires, less time spent on resolving the OS paths. 在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。

继续阅读“php优化”

Redis类

phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系

很有用;以下是redis官方提供的命令使用技巧:

下载地址如下:

https://github.com/owlient/phpredis(支持redis 2.0.4)
Redis::__construct构造函数
$redis = new Redis();

connect, open 链接redis服务
参数
host
: string,服务地址
port
: int,端口号
timeout
: float,链接时长 (可选, 默认为 0 ,不限链接时间)
注: 在redis.conf中也有时间,默认为300

pconnect, popen 不会主动关闭的链接
参考上面

继续阅读“Redis类”

Boolean 布尔类型

这是最简单的类型。boolean 表达了真值,可以为 TRUEFALSE

语法

要指定一个布尔值,使用关键字 TRUEFALSE。两个都不区分大小写。

<?php
$foo = true; // assign the value TRUE to $foo
?>

通常运算符所返回的 boolean 值结果会被传递给控制流程。

// == 是一个操作符,它检测两个变量是否相等,并返回一个布尔值
if ($action == “show_version”) {
echo “The version is 1.23”;
}

// 这样做是不必要的…
if ($show_separators == TRUE) {
echo “<hr>\n”;
}

// …因为可以使用下面这种简单的方式:
if ($show_separators) {
echo “<hr>\n”;
}

转换为布尔值

要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个 boolean 参数时,该值会被自动转换。

当转换为 boolean 时,以下值被认为是 FALSE

  • 布尔值 FALSE 本身
  • 整型值 0(零)
  • 浮点型值 0.0(零)
  • 空字符串,以及字符串 “0”
  • 不包括任何元素的数组
  • 不包括任何成员变量的对象(仅 PHP 4.0 适用)
  • 特殊类型 NULL(包括尚未赋值的变量)
  • 从空标记生成的 SimpleXML 对象

所有其它值都被认为是 TRUE(包括任何资源)。

-1 和其它非零值(不论正负)一样,被认为是 TRUE

var_dump((bool) “”);        // bool(false)
var_dump((bool) 1);         // bool(true)
var_dump((bool) -2);        // bool(true)
var_dump((bool) “foo”);     // bool(true)
var_dump((bool) 2.3e5);     // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array());   // bool(false)
var_dump((bool) “false”);   // bool(true)

PHP截断函数mb_substr()介绍

mb_substr获取字符串的部分

string mb_substr ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] )

根据字符数执行一个多字节安全的 substr() 操作。 位置是从 str 的开始位置进行计数。 第一个字符的位置是 0。第二个字符的位置是 1,以此类推。

参数

str

从该 string 中提取子字符串。

start

str 中要使用的第一个字符的位置。

length

str 中要使用的最大字符数。 If omitted or NULL is passed, extract all characters to the end of the string.

encoding

encoding 参数为字符编码。如果省略,则使用内部字符编码。

返回值

mb_substr() 函数根据 startlength 参数返回 str 中指定的部分。

$str = ‘这样一来我的字符串就不会有乱码^_^’;

echo “mb_substr:” . mb_substr($str, 0, 7, ‘UTF-8’);
//结果:这样一来我的字
echo ”
“;

echo “mb_strcut:” . mb_strcut($str, 0, 6, ‘utf-8’);
//结果:这样

可以截断中英混合字符串不出现乱码。

empty()和isset()函数的区别

empty检查一个变量是否为空

如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,“”0“0”NULLFALSEarray()var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE

除了当变量没有置值时不产生警告之外,empty()(boolean) var 的反义词。

empty() 与 isset() 的一个简单比较。

<?php
$var = 0;
// 结果为 true,因为 $var 为空
if (empty($var)) {
echo ‘$var is either 0 or not set at all’;
}

// 结果为 false,因为 $var 已设置
if (!isset($var)) {
echo ‘$var is not set at all’;
}
?>

注意:

因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。

empty() 只检测变量,检测任何非变量的东西都将导致解析错误。换句话说,后边的语句将不会起作用: empty(addslashes($name))

isset检测变量是否设置

检测变量是否设置,并且不是 NULL

如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节(”\0″)并不等同于 PHP 的 NULL 常数。

如果 var 存在并且值不是 NULL 则返回 TRUE,否则返回 FALSE

Warning

isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined() 函数。

注意:

因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。

如果使用 isset() 来检查对象无法访问的属性,如果 __isset() 方法已经定义则会调用这个重载方法。