PHP5 学习笔记

环境搭建

相关内容可参见《Ubuntu Apache MySQL PHP》

开发环境需要PHP显示错误信息:

sed -i 's/^display_errors = .*$/display_errors = On/g' /etc/php5/apache2/php.ini
sed -i 's/^error_reporting = .*$/error_reporting = E_ALL/g' /etc/php5/apache2/php.ini

基本语法

大小写

PHP是部分大小写敏感的:

  • 变量名:大小写敏感
  • 常量名:大小写敏感
  • 关键字:大小写不敏感
  • 函数名:大小写不敏感
  • 类名:大小写不敏感

PHP标签

PHP使用<?php作为代码开始标记,使用?>作为代码结束标记。

<?php
    // TODO
?>

指令分隔符

PHP使用分号(;)作为语句结束标记。

注释

// 单行注释

/*
    多行注释
*/

注意:多行注释不能嵌套使用。

类型

内置类型:

  • bool
  • int
  • float
  • string
  • array
  • object
  • resource
  • null

bool

$a_bool = true;     // 真
$a_bool = false;    // 假

转换为布尔:

var_dump((bool) -1);        // bool(true)
var_dump((bool) +1);        // bool(true)
var_dump((bool) 0);         // bool(false)
var_dump((bool) 0.0);       // bool(false)
var_dump((bool) '');        // bool(false)
var_dump((bool) ' ');       // bool(true)
var_dump((bool) 'false');   // bool(true)
var_dump((bool) '0');       // bool(false)
var_dump((bool) '0.0');     // bool(true)
var_dump((bool) array());   // bool(false)
var_dump((bool) array(5));  // bool(true)
var_dump((bool) null);      // bool(false)

int

$an_int = 1234; // 十进制数
$an_int = 0377; // 八进制数
$an_int = 0xFF; // 十六进制数

转换为整数:

var_dump((int) true);       // int(1)
var_dump((int) false);      // int(0)
var_dump((int) 5.3);        // int(5)
var_dump((int) '');         // int(0)
var_dump((int) ' ');        // int(0)
var_dump((int) '5.3');      // int(5)
var_dump((int) 'PHP');      // int(0)
var_dump((int) array());    // int(0)
var_dump((int) array(5));   // int(1)
var_dump((int) null);       // int(0)

整数溢出:

var_dump(9223372036854775807);  // int(9223372036854775807)
var_dump(9223372036854775808);  // float(9.2233720368548E+18)

整数除法:

var_dump(27/6);         // float(4.5)
var_dump(round(25/6));  // float(4)
var_dump(round(29/6));  // float(5)
var_dump(floor(29/6));  // float(4)

float

$a_float = 1.234;
$a_float = 1.2e3;
$a_float = 7E-10;

转换为浮点数:

var_dump((float) true);     // float(1)
var_dump((float) false);    // float(0)
var_dump((float) 5);        // float(5)
var_dump((float) '');       // float(0)
var_dump((float) ' ');      // float(0)
var_dump((float) '5');      // float(5)
var_dump((float) 'PHP');    // float(0)
var_dump((float) array());  // float(0)
var_dump((float) array(5)); // float(1)
var_dump((float) null);     // float(0)

浮点数比较:

$m = 1.23456789;
$n = 1.23456780;
$epsilon = 0.00001;

if(abs($m-$n) < $epsilon) {
    echo 'EQUAL';
}

string

echo 'escape: single quote \' backslash \\';
echo "escape: double quote \" backslash \\";
echo "expand: \$variable is {$variable}";

转换为字符串:

var_dump((string) true);        // string(1) "1"
var_dump((string) false);       // string(0) ""
var_dump((string) 5);           // string(1) "5"
var_dump((string) 5.3);         // string(3) "5.3"
var_dump((string) array());     // string(5) "Array"
var_dump((string) array(5));    // string(5) "Array"
var_dump((string) null);        // string(0) ""

字符串修改:

$a_string = 'Hello';
$a_string[0] = 'Y';

字符串拼接:

var_dump('Hello' . 'World');    // string(10) "HelloWorld"
var_dump('Hello' + 'World');    // int(0)

array

// 索引数组
$arr1 = array('value');

// 关联数组
$arr2 = array(
    'key' => 'value',
);

元素操作:

// 添加元素
$arr1[] = 'value2';
$arr2['key2'] = 'value2';

// 修改元素
$arr1[0] = 'value1';
$arr2['key'] = 'value1';

// 删除元素
unset($arr1[0]);
unset($arr2['key']);

遍历数组:

foreach ($arr1 as $value) {
    echo $value;
}

foreach ($arr2 as $key => $value) {
    echo "$key => $value";
}

键名覆盖:

$an_array = array(
    0     => 'value1',
    1     => 'value2',
    1.5   => 'value3',
    '0'   => 'value4',
    '1'   => 'value5',
    ''    => 'value6',
    false => 'value7',
    true  => 'value8',
    null  => 'value9',
);
var_dump($an_array);    // array(3) { [0]=> string(6) "value7" [1]=> string(6) "value8" [""]=> string(6) "value9" }

null

$a_null = null;
unset($a_null);

转换为其他类型:

var_dump((bool)   null);    // bool(false)
var_dump((int)    null);    // int(0)
var_dump((float)  null);    // float(0)
var_dump((string) null);    // string(0) ""
var_dump((array)  null);    // array(0) { }
var_dump((object) null);    // object(stdClass)#1 (0) { }

判断null:

$a_null === null;
is_null($a_null);

比较null:

var_dump(null == true);     // bool(false)
var_dump(null == false);    // bool(true)
var_dump(null == 0);        // bool(true)
var_dump(null == 0.0);      // bool(true)
var_dump(null == '');       // bool(true)
var_dump(null == ' ');      // bool(false)
var_dump(null == '0');      // bool(false)
var_dump(null == array());  // bool(true)
var_dump(null == null);     // bool(true)

var_dump(null === true);    // bool(false)
var_dump(null === false);   // bool(false)
var_dump(null === 0);       // bool(false)
var_dump(null === 0.0);     // bool(false)
var_dump(null === '');      // bool(false)
var_dump(null === ' ');     // bool(false)
var_dump(null === '0');     // bool(false)
var_dump(null === array()); // bool(false)
var_dump(null === null);    // bool(true)

注意:不要使用==判断NULL。

变量

命名规则:

  • 变量以美元符号($)开头。
  • 变量名称以下划线或字母开头。
  • 变量名称只能包含下划线、字母、数字。
  • 变量名称区分大小写。

变量默认为传值赋值,使用&操作符进行引用赋值。

作用域

函数外部声明的变量,函数内部不能直接访问:

$global_var = '';

// 错误做法
function func1() {
    echo $global_var;  // Notice: Undefined variable
}

// 正确做法
function func2() {
    global $global_var;
    echo $global_var;
}

// 正确做法
function func3() {
    echo $GLOBALS['global_var'];
}

函数外部声明的变量,函数内部创建引用的区别:

$global_var1 = '';
$global_var2 = '';

// 只在函数内部有效
function func1() {
    global $global_var1, $global_var2;
    $global_var2 = &$global_var1;
}

// 函数内外同时有效
function func2() {
    $GLOBALS['global_var2'] = &$GLOBALS['global_var1'];
}

函数内部声明的普通变量,只在函数内部有效,且调用结束后释放:

function func_name() {
    $local_var = '';
    echo $local_var;
}

echo $local_var;  // Notice: Undefined variable

函数内部声明的静态变量,只在函数内部有效,且调用结束后不释放:

function func_name() {
    static $count = 0;

    $count++;
    echo $count;
}

func_name();  // 1
func_name();  // 2
func_name();  // 3

echo $count;  // Notice: Undefined variable

可变变量

$var_name = 'message';
${$var_name} = 'Hello';
var_dump($message);  // string(5) "Hello"

常量

定义常量:

define('PI', 3.14);

条件判断中的常量:

// 错误做法
if (DEBUG) {
    echo 'Debug mode.';
}

// 正确做法
if (defined('DEBUG') && DEBUG) {
    echo 'Debug mode.';
}

运算符

算术运算符

  • 加(+
  • 减(-
  • 乘(*
  • 除(/
  • 取模(%
  • 递增(++
  • 递减(--

字符串运算符

  • 连接(.

赋值运算符

  • 基本赋值
    • = // $var = $expr
  • 组合赋值
    • += // $var += $expr 等价于 $var = $var + $expr
    • -= // $var -= $expr 等价于 $var = $var - $expr
    • *= // $var *= $expr 等价于 $var = $var * $expr
    • /= // $var /= $expr 等价于 $var = $var / $expr
    • %= // $var %= $expr 等价于 $var = $var % $expr
    • .= // $var .= $str 等价于 $var = $var . $str

比较运算符

  • 宽松相等(==
  • 严格相等(===
  • 宽松不相等(!=
  • 严格不相等(!==
  • 小于(<
  • 小于等于(<=
  • 大于(>
  • 大于等于(>=

三元运算符

$var = $true_or_false ? $is_true : $is_false

等效:

if ($true_or_false) {
    $var = $is_true
} else {
    $var = $is_false
}

位运算符

  • 与(&
  • 或(|
  • 取反(~
  • 异或(^
  • 左移(<<
  • 右移(>>

逻辑运算

  • 与(&&
  • 或(||
  • 非(!
  • 异或(xor

控制结构

if

if ($expression) {
    echo 'TRUE';
} else {
    echo 'FALSE';
}

switch

switch ($expression) {
    case 'value1':
        // TODO
        break;
    case 'value2':
        // TODO
        break;
    case 'value3':
        // TODO
        break;
    default:
        // TODO
        break;
}

while

$index = 0;
while ($index < 10) {
    echo $index;

    $index++;
}

do-while

do {
    // TODO
} while ($expression);

for

$count = count($an_array);
for ($i = 0; $i < $count; $i++) {
    echo $an_array[$i];
}

foreach

foreach ($arr1 as $value) {
    echo $value;
}

foreach ($arr2 as $key => $value) {
    echo "$key => $value";
}

循环中的引用:

// 错误做法
foreach ($an_array as &$value) {
    // TODO
}
// 此时$value指向数组最后一个元素

// 正确做法
foreach ($an_array as &$value) {
    // TODO
}
unset($value);  // 明确释放$value

break

break关键字用于结束当前控制结构。

continue

continue关键字用于跳过当前循环迭代的剩余部分。

函数

function关键字用于定义函数。

命名规则:

  • 函数名称以下划线或字母开头。
  • 函数名称只能包含下划线、字母、数字。
  • 函数名称不区分大小写。

参数

赋值参数:

function func_name($var) {
    // TODO
}

赋值参数带默认值:

function func_name($var = 'default') {
    // TODO
}

引用参数:

function func_name(&$var) {
    // TODO
}

返回值

return关键字用于从函数中返回值。

匿名函数

$message = 'welcome to the world of PHP.';

$welcome = function($name) use ($message) {
    return $name . ', ' . $message;
};

echo $welcome('Jane');

class关键字用于定义类。

class Person {
    protected $name;
    protected $age;

    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }

    public function __destruct() {
        // TODO
    }

    public function sayHi() {
        echo "Hi! I'm $this->name. I'm $this->age years old.";
    }
}

$person = new Person('Jane', 18);
$person->sayHi();

继承

extends关键字用于声明继承类。

class Child extends Person {
    protected $toy;

    public function __construct($name, $age, $toy) {
        parent::__construct($name, $age);

        $this->toy = $toy;
    }

    public function __destruct() {
        // TODO

        parent::__destruct();
    }

    public function play() {
        echo "$this->name is playing with a $this->toy.";
    }
}

$child = new Child('Anna', 6, 'doll');
$child->play();

final

final关键字用于阻止类被继承或者方法被重写。

static

static关键字用于定义静态属性和方法。

class ShapeStatistics {
    public static $shapeCount = 0;
    public static $totalArea = 0;

    public static function reset() {
        self::$shapeCount = 0;
        self::$totalArea = 0;
    }

    public static function add($shape) {
        self::$shapeCount++;
        self::$totalArea += $shape->getArea();
    }

    public static function getShapeCount() {
        return self::$shapeCount;
    }

    public static function getTotalArea() {
        return self::$totalArea;
    }
}

抽象类

abstract关键字用于声明抽象类。

abstract class Shape {
    protected $color;

    public function __construct($color) {
        $this->color = $color;
    }

    public function getColor() {
        return $this->color;
    }

    public function setColor($color) {
        $this->color = $color;
    }

    abstract public function getArea();
    abstract public function showInfo();
}

class Circle extends Shape {
    private $radius;

    public function __construct($color, $radius) {
        parent::__construct($color);

        $this->radius = $radius;
    }

    public function getArea() {
        return 3.14 * $this->radius * $this->radius;
    }

    public function showInfo() {
        echo 'This is a ' . $this->getColor() . " circle with a radius of $this->radius. Its area is " . $this->getArea() . '.';
    }
}

class Rectangle extends Shape {
    private $width;
    private $height;

    public function __construct($color, $width, $height) {
        parent::__construct($color);

        $this->width = $width;
        $this->height = $height;
    }

    public function getArea() {
        return $this->width * $this->height;
    }

    public function showInfo() {
        echo 'This is a ' . $this->getColor() . " rectangle with a width of $this->width and a height of $this->height. Its area is " . $this->getArea() . '.';
    }
}

$circle = new Circle('blue', 5);
$circle->showInfo();

$rectangle = new Rectangle('gray', 9, 8);
$rectangle->showInfo();

接口

interface关键字用于定义接口,implements关键字用于声明实现接口。

interface ShapeInterface {
    public function getArea();
    public function showInfo();
}

class Shape {
    protected $color;

    public function __construct($color) {
        $this->color = $color;
    }

    public function getColor() {
        return $this->color;
    }

    public function setColor($color) {
        $this->color = $color;
    }
}

class Circle extends Shape implements ShapeInterface {
    private $radius;

    public function __construct($color, $radius) {
        parent::__construct($color);

        $this->radius = $radius;
    }

    public function getArea() {
        return 3.14 * $this->radius * $this->radius;
    }

    public function showInfo() {
        echo 'This is a ' . $this->getColor() . " circle with a radius of $this->radius. Its area is " . $this->getArea() . '.';
    }
}

class Rectangle extends Shape implements ShapeInterface {
    private $width;
    private $height;

    public function __construct($color, $width, $height) {
        parent::__construct($color);

        $this->width = $width;
        $this->height = $height;
    }

    public function getArea() {
        return $this->width * $this->height;
    }

    public function showInfo() {
        echo 'This is a ' . $this->getColor() . " rectangle with a width of $this->width and a height of $this->height. Its area is " . $this->getArea() . '.';
    }
}

$circle = new Circle('blue', 5);
$circle->showInfo();

$rectangle = new Rectangle('gray', 9, 8);
$rectangle->showInfo();

对象拷贝

默认行为:

class GradeClass {
    public $gradeName;
    public $className;

    public function __construct($gradeName, $className) {
        $this->gradeName = $gradeName;
        $this->className = $className;
    }
}

class Student {
    public $name;
    public $gradeClass;

    public function __construct($name, $gradeClass) {
        $this->name = $name;
        $this->gradeClass = $gradeClass;
    }
}

$student1 = new Student('Zhang San', new GradeClass('IE-Department', '2010-1'));
var_dump($student1);    // object(Student)#1 (2) { ["name"]=> string(9) "Zhang San" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-1" } }

$student2 = $student1;
$student2->name = 'Li Si';
$student2->gradeClass->gradeName = 'IE-Department';
$student2->gradeClass->className = '2010-2';
var_dump($student2);    // object(Student)#1 (2) { ["name"]=> string(5) "Li Si" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-2" } }
var_dump($student1);    // object(Student)#1 (2) { ["name"]=> string(5) "Li Si" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-2" } }

$student3 = clone $student1;
$student3->name = 'Wang Wu';
$student3->gradeClass->gradeName = 'IE-Department';
$student3->gradeClass->className = '2010-3';
var_dump($student3);    // object(Student)#3 (2) { ["name"]=> string(7) "Wang Wu" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-3" } }
var_dump($student2);    // object(Student)#1 (2) { ["name"]=> string(5) "Li Si" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-3" } }
var_dump($student1);    // object(Student)#1 (2) { ["name"]=> string(5) "Li Si" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-3" } }

使用__clone()魔术方法:

class GradeClass {
    public $gradeName;
    public $className;

    public function __construct($gradeName, $className) {
        $this->gradeName = $gradeName;
        $this->className = $className;
    }

    public function __clone() {
        // TODO
    }
}

class Student {
    public $name;
    public $gradeClass;

    public function __construct($name, $gradeClass) {
        $this->name = $name;
        $this->gradeClass = $gradeClass;
    }

    public function __clone() {
        $this->gradeClass = clone $this->gradeClass;
    }
}

$student1 = new Student('Zhang San', new GradeClass('IE-Department', '2010-1'));
var_dump($student1);    // object(Student)#1 (2) { ["name"]=> string(9) "Zhang San" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-1" } }

$student2 = $student1;
$student2->name = 'Li Si';
$student2->gradeClass->gradeName = 'IE-Department';
$student2->gradeClass->className = '2010-2';
var_dump($student2);    // object(Student)#1 (2) { ["name"]=> string(5) "Li Si" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-2" } }
var_dump($student1);    // object(Student)#1 (2) { ["name"]=> string(5) "Li Si" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-2" } }

$student3 = clone $student1;
$student3->name = 'Wang Wu';
$student3->gradeClass->gradeName = 'IE-Department';
$student3->gradeClass->className = '2010-3';
var_dump($student3);    // object(Student)#3 (2) { ["name"]=> string(7) "Wang Wu" ["gradeClass"]=> object(GradeClass)#4 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-3" } }
var_dump($student2);    // object(Student)#1 (2) { ["name"]=> string(5) "Li Si" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-2" } }
var_dump($student1);    // object(Student)#1 (2) { ["name"]=> string(5) "Li Si" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-2" } }

不使用__clone()魔术方法:

function deepCopy($obj) {
    return unserialize(serialize($obj));
}

class GradeClass {
    public $gradeName;
    public $className;

    public function __construct($gradeName, $className) {
        $this->gradeName = $gradeName;
        $this->className = $className;
    }
}

class Student {
    public $name;
    public $gradeClass;

    public function __construct($name, $gradeClass) {
        $this->name = $name;
        $this->gradeClass = $gradeClass;
    }
}

$student1 = new Student('Zhang San', new GradeClass('IE-Department', '2010-1'));
var_dump($student1);    // object(Student)#1 (2) { ["name"]=> string(9) "Zhang San" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-1" } }

$student2 = $student1;
$student2->name = 'Li Si';
$student2->gradeClass->gradeName = 'IE-Department';
$student2->gradeClass->className = '2010-2';
var_dump($student2);    // object(Student)#1 (2) { ["name"]=> string(5) "Li Si" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-2" } }
var_dump($student1);    // object(Student)#1 (2) { ["name"]=> string(5) "Li Si" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-2" } }

$student3 = deepCopy($student1);
$student3->name = 'Wang Wu';
$student3->gradeClass->gradeName = 'IE-Department';
$student3->gradeClass->className = '2010-3';
var_dump($student3);    // object(Student)#3 (2) { ["name"]=> string(7) "Wang Wu" ["gradeClass"]=> object(GradeClass)#4 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-3" } }
var_dump($student2);    // object(Student)#1 (2) { ["name"]=> string(5) "Li Si" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-2" } }
var_dump($student1);    // object(Student)#1 (2) { ["name"]=> string(5) "Li Si" ["gradeClass"]=> object(GradeClass)#2 (2) { ["gradeName"]=> string(13) "IE-Department" ["className"]=> string(6) "2010-2" } }

命名空间

namespace关键字用于声明命名空间,use关键字用于导入命名空间。

namespace MyProject;

use OtherProject as OP;

错误处理

返回特殊值:

function divide($dividend, $divisor) {
    if ($divisor == 0) {
        return false;
    }
    return $dividend / $divisor;
}

$result = divide(10, 0);
if ($result === false) {
    // 处理错误
}

抛出异常:

function divide($dividend, $divisor) {
    if ($divisor == 0) {
        throw new InvalidArgumentException("除数不能为0!");
    }
    return $dividend / $divisor;
}

try {
    $result = divide(10, 0);
} catch (InvalidArgumentException $e) {
    echo $e->getMessage();
}

其他

类型相关函数

gettype

echo gettype(false);            // boolean
echo gettype(0);                // integer
echo gettype(0.0);              // double
echo gettype('');               // string
echo gettype(array());          // array
echo gettype(new stdClass());   // object
echo gettype(null);             // NULL

is_xxx

var_dump(is_bool($var));    // 检查变量是否是bool类型
var_dump(is_int($var));     // 检查变量是否是int类型
var_dump(is_float($var));   // 检查变量是否是float类型
var_dump(is_string($var));  // 检查变量是否是string类型
var_dump(is_array($var));   // 检查变量是否是array类型
var_dump(is_object($var));  // 检查变量是否是object类型
var_dump(is_null($var));    // 检查变量是否是null类型
var_dump(is_numeric($var)); // 检查变量是否是数字或数字字符串

变量相关函数

isset

var_dump(isset($undefined));    // bool(false)

$var = false;
var_dump(isset($var));          // bool(true)

$var = 0;
var_dump(isset($var));          // bool(true)

$var = 0.0;
var_dump(isset($var));          // bool(true)

$var = '';
var_dump(isset($var));          // bool(true)

$var = ' ';
var_dump(isset($var));          // bool(true)

$var = '0';
var_dump(isset($var));          // bool(true)

$var = array();
var_dump(isset($var));          // bool(true)

$var = new stdClass();
var_dump(isset($var));          // bool(true)

$var = null;
var_dump(isset($var));          // bool(false)

empty

var_dump(empty($undefined));    // bool(true)

$var = false;
var_dump(empty($var));          // bool(true)

$var = 0;
var_dump(empty($var));          // bool(true)

$var = 0.0;
var_dump(empty($var));          // bool(true)

$var = '';
var_dump(empty($var));          // bool(true)

$var = ' ';
var_dump(empty($var));          // bool(false)

$var = '0';
var_dump(empty($var));          // bool(true)

$var = array();
var_dump(empty($var));          // bool(true)

$var = new stdClass();
var_dump(empty($var));          // bool(false)

$var = null;
var_dump(empty($var));          // bool(true)

字符串相关函数

strlen

$str = 'Hello World';
echo strlen($str);  // 11

strpos

$str = 'Hello World';
$pos = strpos($str, 'Hello');
if ($pos !== false) {
    echo $pos;  // 0
}

substr

$str = 'Hello World';
echo substr($str, 0, 5);    // Hello
echo substr($str, -5, 5);   // World

str_replace

$str = 'Hello World';
echo str_replace('World', 'PHP', $str); // Hello PHP

数组相关函数

array_keys

var_dump(
    array_keys(
        array(
            'key1' => 'value1',
            'key2' => 'value2',
            'key3' => 'value3',
        )
    )
);  // array(3) { [0]=> string(4) "key1" [1]=> string(4) "key2" [2]=> string(4) "key3" }

array_key_exists

var_dump(
    array_key_exists(
        'key1',
        array(
            'key1' => 'value1',
            'key2' => 'value2',
            'key3' => 'value3',
        )
    )
);  // bool(true)

var_dump(
    array_key_exists(
        'key4',
        array(
            'key1' => 'value1',
            'key2' => 'value2',
            'key3' => 'value3',
        )
    )
);  // bool(false)

in_array

var_dump(
    in_array(
        'value1',
        array(
            'key1' => 'value1',
            'key2' => 'value2',
            'key3' => 'value3',
        )
    )
);  // bool(true)

var_dump(
    in_array(
        'value4',
        array(
            'key1' => 'value1',
            'key2' => 'value2',
            'key3' => 'value3',
        )
    )
);  // bool(false)

count

echo count(array(1, 2, 3)); // 3