最常见的是字符串与数字的转换,或是数字/字符串->布尔值的转换。
$a='12avaf1422';
$b=1;
echo $a+$b;//13
$num1=3.14;
$num2=(int)$num1;
var_dump($num1);
echo "
";
var_dump($num2);//int(3)
$num1=1;
$num2=2;
echo $num2;//2
$num2=&$num1;
echo $num2;//1
引用赋值结合变量销毁unset():
$num1=0;
$num2=&$num1;
unset($num1);
var_dump($num2,$num1);//int(0) NULL
注意:$num1销毁变量后,$num2值依然存在
$mk='孟珂';
$$mk='s';
echo $mk,'love',$$mk;
注意: 在 PHP 5.3.0 以后,可以使用 const 关键字在类定义之外定义常量。
2019-09-17补充: 常量的值;在 PHP 5 中,value 必须是标量( integer、 float、string、boolean、NULL)在 PHP 7 中还允许是个 array 的值。
define('PRICE',100);
echo PRICE;//100
用变量的值做常量的名字:
constant()
define('PI',3.14);
$chang='PI';
echo constant($chang);
整型太大的话,会自动转换成浮点型:
var_dump(100000000000000000000000);//float(1.0E+23)
取模运算时,结果的正负仅仅取决于被除数的正负:
$a=-10;//换成10试试
$b=3;//换成-3试试
echo $a%$b;
(expr1) ? (expr2) : (expr3)
对 expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3。
$test=1;
$re=$test??'不存在';//PHP7+写法
$re=$test?:'不存在';// PHP 5.3+普通写法
echo $re,PHP_EOL;
echo 'hi';
x xor y 异或 如果 x 和 y 有且仅有一个为 true,则返回 true
echo( (10 xor 1) ?:'假');//假
// foo() 根本没机会被调用,被运算符“短路”了
$a = (false && foo());
$b = (true || foo());
$c = (false and foo());
$d = (true or foo());
$e = false || true;
$f = false or true;
var_dump($e, $f);//true false
$g = true && false;
$h = true and false;
var_dump($g, $h);//false true
.就一个点,我只说一次!
注意:必须要使用 break 来阻止代码跳入下一个 case 中继续执行!
do
{
要执行的代码;
}
while (条件);
for (初始值; 条件; 增量)
{
要执行的代码;
}
注意:
上面的初始值和增量参数可为空,或者有多个表达式(用逗号分隔)。
条件:循环执行的限制条件。如果为 TRUE,则循环继续。如果为 FALSE,则循环结束。
break 在循环中作用是结束一个循环
continue立即结束本次循环,继续执行下一次循环
PHP 的真正威力源自于它的函数!
函数是一段封装好的代码,随时可调用。
命名规则和变量命名一样,但是函数不区分大小写;
函数的名称应该提示出它的功能。
当函数所有语句执行完毕或者碰到return语句时,函数结束,交回执行权。
函数内部变量与外界变量无关:
function t($a)
{
$a += 1;
return $a;
}
$a = 1;
t($a);
echo $a;//输出1
引用传参(不推荐,因为函数内部的语句影响到了外部的变量,破坏了函数的封装性):
function t(&$a)
{
$a += 2;
return $a;
}
$b = 1;
t($b);
echo $b;//输出3
global 关键字用于函数内访问全局变量。
$x=5;
$y=10;
function myTest()
{
global $x,$y;
$y=$x+$y;
}
myTest();
echo $y; //15;
PHP将所有全局变量存储在一个名为$GLOBALS[index]的数组中。index为 保存变量的名称。上面的实例可以写成这样:
$x=5;
$y=10;
function myTest()
{
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y;
function wel()
{
echo 'welcome';
}
function bad()
{
echo 'bad';
}
$heart = 'wel';
$heart();
time();
返回当前时间戳
microtime(get_as_float) 函数返回当前 Unix 时间戳的微秒数。
如果 get_as_float 参数设置为 TRUE,则返回浮点数,表示自 Unix 纪元(January 1 1970 00:00:00 格林威治时间(GMT))起精确到微秒的以秒为单位的当前时间.
echo microtime();//0.68480900 1539325171
echo '
';
echo microtime(true);//1539325171.6848
可在程序开头和结尾分别放一个,两者相减,用于计算程序运行时间。
echo date('Y-m-d,星期l,a h:i:s');//2018-10-12,星期Friday,AM 06:43:21
echo gmdate('Y-m-d,星期l,a h:i:s');//2018-10-12,星期Friday,AM 06:43:21
date(format,timestamp)
gmdate(format,timestamp)
timestamp 可选。规定时间戳。。默认是当前时间和日期
两个函数日期都是自GMT起。
PHP 5.1.0:有效范围的时间戳是从 1901 年 12 月 13 日 20:45:54 GMT 星期五 到 2038 年 1 月 19 日 03:14:07 GMT 星期二。5.1.0 之前的版本,在某些系统上(例如 Windows)时间戳被限制在从 01-01-1970 到 19-01-2038。
mktime(hour,minute,second,month,day,year)
函数返回日期的 Unix 时间戳。Unix 时间戳包含 Unix 纪元(1970 年 1 月 1 日 00:00:00 GMT)与指定时间之间的秒数。
strtotime() 函数用于把人类可读的字符串转换为 Unix 时间。
strtotime(' today+1day')
checkdate(month,day,year);如果日期是有效的则返回 TRUE,否则返回 FALSE。
echo max(1, 3, 5, 6, 7);//7
echo max(array(2, 4, 5));//5
$str = "Hello World!";
echo $str . "
";//Hello World!
echo trim($str,"Hled!");//o Wor
单引号,双引号,
heredoc,nowdoc:
//heredoc
$a='孟珂';
$str1=<<<INTRO
hello world
{$a}you ok?
INTRO;
echo $str1;
echo $str1;//hello world 孟珂you ok?
//nowdoc
$a='孟珂';
$str1=<<<'INTRO'
hello world
{$a}you ok?
INTRO;
echo $str1;//hello world {$a}you ok?
strlen(string) 函数返回字符串的长度。
utf-8编码,一个中文占3个字节
mixed mb_strlen ( string $str [, string $encoding = mb_internal_encoding() ] )
获取一个 string 的长度。
encoding 参数为字符编码。如果省略,则使用内部字符编码。
echo mb_strlen('孟珂','utf-8');//2
strpos(string,find,start)
函数查找字符串在另一字符串中第一次出现的位置。
str_replace(find,replace,string,count)str_replace(find,replace,string,count)
以其他字符替换字符串中的一些字符(区分大小写)。
str_ireplace() 函数执行不区分大小写的搜索。
echo str_replace('fuck','**','fuckyoufuck');//**you**
print_r(str_replace('fuck','***',array('fuck you','fuckyoufuck')));//Array ( [0] => *** you [1] => ***you*** )
$find = array("Hello","world");
$replace = array("B");
$arr = array("Hello","world","!");
print_r(str_replace($find,$replace,$arr));//Array ( [0] => B [1] => [2] => ! )
查找元素和替换元素都为数组时,它俩里边的值一一对应。
$find = array("Hello","world");
$replace = array("B",'c');
$arr = array("Hello","world","!");
print_r(str_replace($find,$replace,$arr));//Array ( [0] => B [1] => c [2] => ! )
strtr(string,from,to)或strtr(string,array) 批量替换字符串
echo strtr('hello world',['hello'=>'hi','world'=>'earth']);//hi earth
substr(string,start[,length])
函数返回字符串的一部分。
注释:如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。
length可选。规定被返回字符串的长度。默认是直到字符串的结尾
explode(separator,string,limit)
把字符串打散为数组。
implode(separator,array)
返回由数组元素组合成的字符串
separator 可选。规定数组元素之间放置的内容。默认是 “”(空字符串)
$str = "Hello World";
echo str_pad($str,30,".");//Hello World...................
注释:length 必需。规定新的字符串长度。如果该值小于字符串的原始长度,则不进行任何操作。
如果不声明键,则从0,1,2递增来生成键
如果已经存在某1个或几个数字键,则从最大的数字键,递增生成数字键
$arr=array(3=>'a','b');
print_r($arr);//Array ( [3] => a [4] => b )
$arr=array(3=>'a',3=>'b','c');
print_r($arr);//Array ( [3] => b [4] => c )
foreach($arr as $value){}
或者
foreach($arr as $key=>$value){}
$a=array(3=>"red",4=>"green");
print_r(array_merge($a));
//Array ( [0] => red [1] => green )
$a1=array("a"=>"red","b"=>"green");
$a2=array("c"=>"blue","b"=>"yellow");
print_r(array_merge_recursive($a1,$a2));
//Array
(
[a] => red
[b] => Array
(
[0] => green
[1] => yellow
)
[c] => blue
)
$cars=array('v'=>"Volvo",'b'=>"BMW",'t'=>"Toyota");
sort($cars);
var_dump($cars);
//array(3) {
[0]=>
string(3) "BMW"
[1]=>
string(6) "Toyota"
[2]=>
string(5) "Volvo"
}
function my_sort($a,$b)
{
if ($a==$b) return 0;
return ($a<$b)?-1:1;
}
$a=array(4,2,8,6);
usort($a,"my_sort");
print_r($a);//Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 )
asort(array,sortingtype);
对关联数组按照键值进行升序排序。
返回值: 如果成功则返回 TRUE,如果失败则返回 FALSE。
arsort()
函数对关联数组按照键值进行降序排序。
ksort()
函数对关联数组按照键名进行升序排序。
krsort(array,sortingtype);
对关联数组按照键名进行降序排序。
array_diff(array1,array2,array3…);
返回两个数组的差集数组。
返回值: 返回差集数组,该数组包括了所有在被比较的数组(array1)中,但是不在任何其他参数数组(array2 或 array3 等等)中的键值。
array_diff_assoc(array1,array2,array3…);
用于比较两个(或更多个)数组的键名和键值 ,并返回差集。
返回值: 返回数组,该数组包含所有在 array1 中,但是不在任何其他参数数组(array2 或 array3 等等)中的键名和键值。
注释: 与array_diff()区别在于array_diff()是比较数组的值,而array_diff_assoc()的比较包括键和值。
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$a2=array("e"=>"red","f"=>"green","g"=>"blue");
$result=array_diff_assoc($a1,$a2);
print_r($result);
//Array
(
[a] => red
[b] => green
[c] => blue
[d] => yellow
)
array_intersect(array1,array2,array3…);
返回两个或多个数组的交集数组。
返回值: 返回交集数组,该数组包括了所有在被比较的数组(array1)中,同时也在任何其他参数数组(array2 或 array3 等等)中的键值。
array_intersect_assoc(array1,array2,array3…)
用于比较两个(或更多个)数组的键名和键值,并返回交集。
返回值: 返回交集数组,该数组包括了所有在被比较的数组(array1)中,同时也在任何其他参数数组(array2 或 array3 等等)中的键名和键值。
array_change_key_case(array,case);
将数组的所有的键都转换为大写字母或小写字母。(默认将数组的键转换为小写字母。)
返回值: 返回键为大写或小写的数组,或者如果 array 非数组则返回 FALSE。
注释:如果在运行该函数时两个或多个键相同,则最后的元素会覆盖其他元素
array_count_values(array)
对数组中的所有值进行计数。
返回值: 返回关联数组,其元素的键名是原数组的值,键值是该值在原数组中出现的次数。
array_fill(index,number,value);
用给定的值填充数组,返回的数组有 number 个元素,值为 value。返回的数组使用数字索引,从 start 位置开始并递增。如果 number 为 0 或小于 0,就会出错。
注释:index 必需。被返回数组的第一个索引。
返回值: 返回被填充的数组。
array_filter(array,callbackfunction);
用回调函数过滤数组中的值。
该函数把输入数组中的每个键值传给回调函数。如果回调函数返回 true,则把输入数组中的当前键值返回结果数组中。数组键名保持不变。
返回值: 返回过滤的数组。
function test_odd($var)
{
return($var & 1);
}
$a1=array("a","b","b",2,3,4,5);
print_r(array_filter($a1,"test_odd"));
//Array ( [4] => 3 [6] => 5 )
$arr=[1,2,3,'a',4,true,false,‘1’];
echo array_sum($arr);
//单元值为true时,单元值的值为1
$letter = range("a","d");
print_r ($letter);//Array ( [0] => a [1] => c [2] => e )
$A=2;
function t(){
$GLOBALS['A']=99;
}
t();
echo $A;//99
//从100加到1
function add($n){
if($n==1){
return 1;
}
return $n+add($n-1);
}
echo add(100);
//用递归打印当前目录下的所有文件以及子目录....
function t($path, $i = 1)//给$i一个初始值
{
$fh = opendir($path);
while (($re = readdir($fh)) !== false) {
echo str_repeat('-', $i) . $re . '
';
if (is_dir($path . '/' . $re) && ($re !== '.') && ($re !== '..')) {//用is_dir($re)有些文件检测不出来
t($path . '/' . $re, $i + 1);//此处写$i++会出错,不清楚为什么【循环的我脑壳疼,妈呀溜了】
}
}
closedir($fh);
}
$pa = './anluo';
t($pa);
在第一次函数调用声明之后存在,不随函数的结束而结束,当函数再次调用时,可以直接利用上次的结果。
//用递归函数,计算所有单元的和
$arr = array(1, 2, 3, array(4, array(5, 6)));
function sum($arr)
{
static $sum = 0;
if (is_array($arr)) {
foreach ($arr as $key => $value) {
if (!is_array($value)) {
$sum += $value;
} else {
sum($value);
}
}
}
return $sum;//碰到return结束本次函数的执行,注意:是本次函数,不是外层的函数。
}
echo sum($arr);//21
echo $sum;//Notice: Undefined variable: sum
//把为数字的单元值修改为原来的2倍
$arr = array(1, 2, 'b', array(3, 'c', array(4, 5)));
function double($arr)
{
foreach ($arr as $key => $value) {
if (is_integer($value)) {
$arr[$key] = $value * 2;
}
if (is_array($value)) {
unset($arr[$key]);
array_push($arr, double($value));
}
}
return $arr;
}
$arr=double($arr);
print_r($arr);
//递归创建级联目录
function mk($dir)
{
$re=is_dir($dir)?:mkdir($dir,0777,true);
if(!$re){
$arr=explode('/',$dir);
$curr=array_shift($arr);
mkdir($curr,0777,true);
$dir=implode('/',$arr);
mk($dir);
}
return '创建成功!';
}
echo mk(date('Y/m/d'));
echo 0123;//83
注释: 8进制里不可能出现8以及大于8的数字
echo 0x123;//291
echo 0x1c;//28
是针对字节上的位来进行运算的。(一字节8位)
位运算 | 10进制 | 2进制 |
---|---|---|
5 | 0000 0101 | |
12 | 0000 1100 | |
5&12= | 4 | 0000 0100 |
5|12= | 15 | 0000 1101 |
值 | 常量 | 位掩码 |
---|---|---|
1 | E_ERROR | 0000 0001 |
2 | E_WARNING | 0000 0010 |
4 | E_PARSE | 0000 0100 |
8 | E_NOTICE | 0000 1000 |
… | … | … |
@mysql_connect(...) or die("Database Connect Error")
Mysql为关系型数据库
某些小数在十进制下是有限的,转成2进制就变成无限循环,因此存储时会损失一些精度,导致浮点数计算和数学上结果不一致。
例如:
if ((0.3 - 0.2) == 0.1) {
echo 'equal';
} else {
echo 'no equal';//no equal
}