// 单行注释/* */ 多行注释/** */ 文档注释
2. var_dump($var); //输出$var的类型及内容
3. isset($var); //判断$var是否存在(声明但未赋值,记为不存在),存在返回真,否则返回假
4. unset($var); //删除$var(解除名字与内存的绑定关系)
5. empty($var); //判断$var的内容是否为空(不存在、值为0或“”均为空,“ ”为非空),空返回真,否则返回假
6. 可变变量:一个变量的名称可以通过另一个变量的值来设定(即名称可变)。
$name = "age";
$$name = 20; //$age = 20
7. 引用
$name = "Joy";
$alias = &$name; //$alias即为$name的引用
$name2 = "Tom";
$alias = &$name2; //$alias是$name2的引用,不再是$name的引用
unset($name2); //$name2被删除了,$alias还存在($name2与内存的绑定关系被解除了,$alias还与内存绑定着)
Note: 只有变量才有引用;
Note: 引用关系可以改变;
Note: 具有引用关系的两个变量,删除其中一个,另一个还存在;
8. 八种数据类型
4种标量类型(boolean, int, float, string);
2种符合类型(array, object);
2种特殊类型(resource, null);
9. 条件测试为假的情况
10. 类型占内存大小boolean: false;
int: 0;
float: 0.0, 0.00;
string: "", "0"("00"为真, "0.0"为真);
array: array()(即空数组);
null;
boolean: 1Byte;
int: 4 Byte;
float: 8 Byte;
11. 字符串用单引号或双引号声明(单引号中可以使用双引号,双引号中可以使用单引号),也可以使用定界符声明。
12. 单引号与双引号的区别
单引号种不能解析变量,双引号中可以解析变量(变量前后要有空格,或用大括号括起来);
单引号种不能使用转义字符(单引号转义符除外),双引号中可以使用转义字符;
13. 用定界符声明字符串
$str = <<<hello
Hello, hao are you.
I'm fine, and you?
Me fine, thank you!
hello;
Note: <<<后面的hello为定界符,<<<与定界符之间不能有空格,定界符输入完后直接回车;
Note: 结束的定界符hello必须顶格写;
Note: 若开始的定界符未使用单引号表示,则字符串可以解析变量和转义字符,否则不可以;
14. 伪类型
number: int或float;
mixed: 任意类型;
callback: 函数;
15. getType($var); //获取变量$var类型名称字符串
16. setType($var,类型名称字符串);//将变量$var转为类型名称字符串对应的类型
17. $var_1 = 1000; //$var_1为int类型
$var_2 = (string)$var_1; //$var_2为string类型
18. intval($var); //返回(int)$var
floatval($var); //返回(float)$var
strval($var); //返回(string)var
19. string转int
$var_1 = "hello world";
$var_2 = (int)$var_1; //$var_2 = 0
$var_3 = "456hello world";
$var_4 = (int)var_3; //$var_4 = 456
$var_5 = "456e3helloworld";
$var_6 = (int)$var_5; //$var_5 = 456000
20. 类型判断函数
is_bool($var); //判断是否是bool
is_int($var); is_integer($var); is_long($var); //判断是否是int
is_float($var); is_double($var); is_real($var); //判断是否是float
is_string($var); //判断是否是string
is_array($var); //判断是否是array
is_object($var); //判断是否是object
is_resource($var); //判断是否是resource
is_null($var); //判断是否是null
is_scalar($var); //判断是否是标量(bool, int, float, string)
is_numberic($var); //判断是否是数字或说字类型的字符串(int, float, 数字类型的string)
is_callable($var); //判断是否是有效的函数名
21. 常量
声明:define("常量名", 常量值, 名称大小写是否敏感);//true:大小写不敏感, false:大小写敏感,默认大小写敏感
eg: define("ROOT",1000, true); //ROOT=1000, root=1000
常量名称不加$;
常量只支持标量数据类型;
常量不能使用unset()删除;
defined("常量名"); //判断常量名对应的常量是否存在
constant("常量名"); //获取常量名对应常量的值
get_defined_constants(); //获取所有已定义的常量列表
22. 魔术常量
__LINE__ : 文件中的当前行号;
__FILE__ : 文件的全路径;
__DIR__ : 文件所在目录;
__FUNCTION__ : 函数名;
__CLASS__ : 类名;
__METHOD__ : 方法名;
__NAMESPACE__ : 命名空间名;
23. PHP中+号没有连接字符串的功能。
24. 13.564%2.368; //13%2
25. $var = 5;
$var_2 = $var++ + ++$var; //$var_2 = 12, $var = 7
26. echo true; //页面输出1
echo false; //页面显示空
27. ++, --不支持boolean
$var_1 = true;
$var_2 = false;
++$var_1; //$var_1 = true
--$var_1; //$var_1 = true
++$var_2; //$var_2 = false
--$var_2; //$var_2 = false
$var_1 = $var_1 + 1; //$var_1 = 2, 类型提升
28. ++, --用于字符串
$var_1 = "a";
++$var_1; //$var_1 = "b"
++$var_1; //$var_1 = "c"
$var_2 = "z";
++$var_2; //$var_2 = "aa"
++$var_2; //$var_2 = "ab"
29. 用 . 链接字符串
$var_1 = "hello";
$var_2 = "world";
$var_3 = 2016;
$var_4 = $var_1.$var_2.$var_3; //$var_4 = "helloworld2016"
$var_4 .= ", welcome!"; //$var_4 = "hello, world2016, welcome!"
30. ==, != 与 ===, !==
==, !=比较的是内容是否等效(类型可以不同)
===, !==比较的是内容是否完全相等(包括类型是否完全相同)
$var_1 = "007";
$var_2 = 7;
$var_3 = $var_1 == $var_2; //$var_3 = true
$var_4 = $var_1 === $var_2; //$var_4 = false
31. 逻辑运算符
逻辑与: and或&&
逻辑或: or或||
逻辑非: not或!
逻辑异或: xor
32. die($var); //输出$var并退出程序
33. $var_1 = "A" & "a"; //$var_1 = "A"
$var_2 = "A" & 97; //$var_2 = 0, "A"转成int为0
34. break默认跳出最内层循环,但其后面可以跟数字,数字代表跳出哪一层循环(从当前层开始数)。
35. continue后面也可以跟数字。
36. exit与die是别名的关系,参考die.
37. 函数名不区分大小写。
38. function_exits("函数名"); //判断函数存不存在
39. file_put_contents(...); //向文件中写数据
40. 函数内部声明的变量(包括参数)默认是局部变量,只能在函数内部使用,函数调用结束后,其内部声明的变量将被释放。(与if, for, while等语句不同,在这些语句中声明的变量,在其外部也是可见的,是全局变量)
41. 所有函数内部使用的变量默认都是新声明的变量。
42. 全局变量:在函数外部声明的变量。
43. 若在函数内部使用全局变量(函数外部声明的变量)需要在函数内部用global告诉函数哪个变量是全局变量。
function print_var($var) //$var是局部变量,其只在函数内部可见
{
global $var_1; //$var_1是函数外部声明的变量(全局变量)
$var_2 = 2016; //$var_2是局部变量,其只在函数内部可见
echo $var.$var_1.$var_2;
}
$var_1 = "world"; //全局变量(若该全局变量需要在函数内部使用,则该变量的声明必须在函数调用之前)
print_var("hello ");
44. count($arr); //返回数组的长度
45. 函数支持可变个数参数
function print_args()
{
$arr = func_get_args(); // 获取传入参数,返回一个数组
var_dump($arr);
}
print_args(true, null, 0, "hello", 1.234);
46. array不限制所有元素类型相同。
47. func_num_args(); //获取外层函数传入的参数的个数
48. func_get_arg($index); //获取外层函数传入的第$index个参数($index基于0).
49. 变量函数:如果将一个函数名称(字符串), 赋给一个变量(字符串), 通过在这个变量后面加(...)就可以调用对应函数.
function add($a, $b)
{
return $a + $b;
}
$var = "add";
echo $var(2,-5); //输出-3
50. 全局回调函数
function mycomp($a, $b)
{
if( strlen($a) < strlen($b) )
return 1;
elseif( strlen($a) > strlen($b) )
return -1;
else
return 0;
51. print_r( $arr ); //打印数组元素}
$arr = array("aaaa", "aa", "aaaaa", "a", "aaaaaa");
usort( $arr, "mycom" ); //unsort(...)会在内部通过函数名"mycomp"回调mycomp(...)函数
print_r( $arr ); //打印数组元素
52. 三种回调函数:全局回调函数、类对象成员函数、类静态成员函数
//三种回调函数的使用方法
function add_1($a, $b) //全局函数
{
return $a + $b;
}
class AddClass
{
function add_2($a, $b) //类对象成员函数
{
return $a + $b;
}
static function add_3($a, $b) //类静态成员函数
{
return $a + $b;
}
}
$a = 10;
$b = 5;
echo call_user_func_array("add_1", array($a, $b)); //通过call_user_func_array,利用函数名称字符串,回调全局函数,输出15
echo "<br>";
echo call_user_func_array(array(new AddClass(), "add_2"), array($a, $b)); //通过call_user_func_array, 利用类对象及类对象成员函数名称字符串封装成的数组,回调类对象成员函数,输出15
echo "<br>";
echo call_user_func_array(array("AddClass", "add_3"), array($a, $b)); //通过call_user_func_array,利用类名称字符串及类静态成员函数名称字符串封装成的数组,回调类静态成员函数,输出15
53. 遍历给定路径下的所有文件
function fordir($folderpath)
{
$dir = opendir($folderpath); //打开路径
readdir($dir); //返回当前路径,即 "."
readdir($dir); //返回上一级路径,即 ".."
static $num = 0; //统计文件个数
while($file = readdir($dir))
{
$fullfile = $folderpath.'/'.$file; //合成文件全路径
if(is_dir($fullfile)) //文件夹情况
{
fordir($fullfile);
}
else //文件情况
{
echo ++$num.': '.$fullfile.'<br>';
}
}
}
fordir('C:');
54. include(...), include_once(...), require(...), require_once(...)包含文件
55. 匿名函数include, require不对重复包含处理; include_once, require_once对重复包含处理;
include, include_once包含的文件内部出现错误时抛出警告; require, require_once包含的文件内部出现错误时抛出错区;
$var = function($a, $b)
{
return $a+$b;
}; //不要忘记加分号
echo $var(1,2).'<br>'; //输出3
var_dump($var); //输出object类型
56. 闭包
function getClosure()
{
$num = 0;
$inc = function() use (&$num) //闭包函数, 内部不能有返回值, $num为该函数使用的外部函数的局部变量, 要用引用传递
{
$num++;
echo $num.'<br>';
};
return $inc;
}
$var = getClosure();
$var(); //输出1
$var(); //输出2
57. array
$arr[] = 1; //$arr[0] = 1
$arr[] = "hello"; //$arr[1] = "hello"
$arr[5] = 11; //$arr[5] = 11
$arr[] = 10; //$arr[6] = 10
$arr['one'] = 13; //$arr['one'] = 13
$arr[-10] = 23; //$arr[-10] = 23
$arr[] = 45; //$arr[7] = 45
58. array支持负数索引
59. 删除array中的元素(删除后索引不自动重建)
$arr = array('hello', 'world', 'how', 'that'); //$arr[0] = 'hello', $arr[1] = 'world', $arr[2] = 'how', $arr[3] = 'that'
unset($arr[1]); //$arr[0] = 'hello', $arr[2] = 'how', $arr[3] = 'that'
$arr = array_values($arr); //$arr[0] = 'hello', $arr[1] = 'how', $arr[2] = 'that'
60. array_values($arr); //返回一个索引数组,数组中存储的是$arr中的值
61. foreach遍历数组
foreach($arr as $value) { } //$arr为数组, $value为数组元素的值
foreach($arr as $key=>$value) { } //$arr为数组, $key为数组元素的键值, $value为数组元素的值
62. 数组分索引数组和关联数组
63. list(...)可以用来取下标连续的索引数组中的元素'索引数组:下标为整数的数组;
关联数组:下标为字符转的数组;
当然,数组也可以是二者的混合。
eg one:
list($a, $b, $c) = array('hello', 999, 'world');
echo $a.'<br>'; //输出hello
echo $b.'<br>'; //输出999
echo $c.'<br>'; //输出world
eg two:
list($a, , $c) = array('hello', 999, 'world');
echo $a.'<br>'; //输出hello
echo $c.'<br>'; //输出world
eg three:
list($a, $b) = explode("_", "name_age"); //explode用于分割字符串
echo $a.'<br>'; //输出name
echo $b.'<br>'; //输出age
64. each($arr)返回一个数组,数组中存的是参数数组中当前元素的键和值(索引、关联各一对)
$arr = array('hello', 'world', 'google');
$arr_1 = each($arr); //$arr_1 = array( [0]=0, [1]='hello', ['key']=0, ['value']='hello' )
$arr_2 = each($arr); //$arr_2 = array( [0]=1, [1]='world', ['key']=1, ['value']='world' )
$arr_3 = each($arr); //$arr_3 = array( [0]=2, [1]='google', ['key']=2, ['value']='google' )
$arr_4 = each($arr); //$arr_4 = false
65. 数组指针控制函数
66. 获取数组的当前key或value$arr = array('hello', 'world', 'three', 'four', 'five');
next($arr); //$arr内部指针指向第1个元素(基于0)
print_r(each($arr)); //输出$arr的第1个元素,$arr内部指针指向第2个元素
echo '<br>';
prev($arr); //$arr的内部指针指向第1个元素
prev($arr); //$arr的内部指针指向第0个元素
print_r(each($arr)); //输出$arr的第0个元素,$arr的内部指针指向第1个元素
echo '<br>';
end($arr); //$arr的内部指针指向最后一个元素
print_r(each($arr)); //输出$arr的最后一个元素,$arr的内部指针指向最后一个元素的下一个位置
echo '<br>';
reset($arr); //$arr的内部指针指向第0个元素
print_r(each($arr)); //输出$arr的第0个元素,$arr的内部指针指向第1个元素
echo '<br>';
key($arr); //获取$arr的当前key
current($arr); //获取$arr的当前value
67. 9种超全局数组(变量)
_SERVER
_ENV
_GET
_POST
_REQUEST
_FILES
_COOKIE
_SESSION
GLOBALS
Note: 这些变量在任何地方都可以直接使用(包括自定义函数中,不需要用global声明)
68. array_keys($arr); //返回一个索引数组,数组中存储的是$arr中的键值
69. 类的魔术方法
__construct(...) //构造函数
__destruct() //析构函数
__set($name, $value) //用于给类的private成员设置值,用法:person->age = 50;
__get($name) //用于获取类的private成员的值,用法:echo person->age.'<br>';
__isset($name) //用于判断类的private成员是否存在,用法:isset(person->age);
__unset($name) //用于删除类的private成员,用法:unset(person->age);
__toString() //用于将类对象按按定义转成string,用法:echo $person.'<br>';
__clone() //用于克隆类对象(这个方法中的$this代表的是副本,不是原本),用法:$person_2 = clone $person_1;
__call($func_name, $args) //当类对象调用一个不存在的成员函数时自动调用该方法,$func_name是调用的不存在的方法名,$args是由传入参数封装成的数组
Note: 魔术方法自动调用.
70. PHP类只有单继承,没有多继承。
71. PHP类中的static成员只能通过类访问,不能通过类对象访问。
72. 类中this代表本类对象, parent代表父类对象, self代表本类.
73. Singleton模式
class Person
{
static $singleton = null;
private function __construct() {}
static function getSingleton()
{
if( is_null( self::$singleton ) )
{
self::$singleton = new self();
}
return self::$singleton;
}
function __destruct()
{
echo "destruct<br>";
}
}
$var_1 = Person::getSingleton();
$var_2 = Person::getSingleton();
74. 类中不能使用define(...)定义常量。
75. 类中常量的声明
76. 类的克隆使用const声明常量:const NUM_MAX = 100; //常量不加$
类中常量通过类访问,不能通过类对象访问;
77. __call($func_name, $args)的特殊用途$var_1 = new Person();
$var_2 = $var_1; //$var_1与$var_2互为引用,二者代表同一个类对象(不是克隆)
$var_3 = clone $var_1; //$var_3是$var_1的克隆,二者代表的是两个类对象(是克隆)
class Person
{
private $func_set = array("eat", "sleep", "run");
function __call($func_name, $args)
{
if( in_array($func_name, $this->func_set) )
{
echo "Person : {$func_name} : ";
print_r($args);
echo '<br>';
}
else
{
echo "{$func_name} 不存在!<br>";
}
}
}
$var = new Person();
$var->eat("apple", "banana");
$var->sleep(1, "12h", 35);
$var->run(1, 2, 3);
$var->say("hello");
78. 类的串行化与反串行化
__sleep() //串行化时调用,通过返回一个由待串行化类的属性名组成的数组来控制类的哪些属性串行化
__wakeup() //反串行化时调用
79. json串行化
json_encode($mixedVax) //对任意类型串行化,返回string
json_decode($stringVar, $boolVar) //反串行化,boolVar为true时返回array,否则返回class
80. eval($str) //检查并执行php代码
81. var_export($var, $boolVar) //$boolVar默认为false,此时按php代码格式打印输出$var对应的string,$boolVar为true时,按php代码格式返回$var对应的string