赞
踩
这里默认有HTML,JavaScript基础咯。
客户端(用户端):享受服务的【前端,客户端运行代码】
服务端(远程):提供服务的【后端,服务端运行代码】
PHP(全称:以前叫Personal Home Page,现在改名为Hypertext Preprocessor,即"PHP:超文本预处理器"),是一种通用开源脚本语言。
PHP是服务器端的语言,对于web开发(html),非常友好,能嵌入在html文档里面;可以跟html,css和JavaScript代码融合在一起,弥补它们做不了的事情。
xampp官网:https://www.apachefriends.org/index.html
下载自己所需要的版本。安装即可。
开启xampp中的Apache后,在浏览器中打开localhost,即可看到htdocs(html文档)根目录下的index.php对应的页面。
几乎能干后端一切能干的事情
php简单、好学、上手快。
首先在官网(https://www.xp.cn/)下载对应的版本,然后解压,安装。
安装后,启动phpStudy中的服务器,在localhost中,即可以看到WWW根目录下的index.php对应的页面。
当解析一个文件时,PHP会寻找起始和结束标记,也就是<?php ?>
, 这告诉PHP开始和停止解析二者之间的代码。此种解析方式使得PHP可以被嵌入到各种不同的文档中,而任何起始和结束标记之外的部分都会被PHP解析器忽略。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 嵌入到html文件中 -->
<?php echo "hello,php"?>
</body>
</html>
注意,访问的文档如果不是默认的index.php,则需要在访问时,加入路径进行访问。
比如想访问的是basic.php,那么需要访问的URL是localhost/basic.php
如果文件内容是纯PHP代码,最好在文件末尾删除PHP结束标记。这可以避免在PHP结束标记之后,万一意外加入空格或者换行符,会导致PHP开始输出这些空白,而脚本中此时并无输出意图。
<?php
echo "hello,php";
// ... more code
echo "last statement";
// 脚本至此结束,并无PHP结束标记
PHP需要在每个语句后用分号结束指令;
,一段PHP代码中的结束标记隐含表示了一个分号,在一个PHP代码段中的最后一行可以不用分号结束。
//
/**/
PHP中变量用一个$
后加变量名来表示。变量名区分大小写。(变量、常量、php配置文件php.ini区分大小写,其他不分)
$var = 'Bob';
$Var = 'Joe';
$4site = 'not yet'; //非法变量名,以数字开头了
$_4site = 'not yet'; //合法变量名,以下划线开头
$this = 'Nikon'; //非法赋值,$this是一个特殊的变量,不能被赋值
使用“=”将赋值表达式的值赋给另一个变量(单独分配房间),互不干扰。
$name = "tom";
$myname = $name;
将赋值表达式内存空间的引用赋给另外一个变量,简单地将一个&
符号加到将要赋值的变量前(共享一个房间),改变其中一个变量的值会影响另一个变量。
$foo = 'Bob';
$bar = &$foo; //通过$bar引用给$foo
变量的名字可以动态改变,用$$
符号表示。
$a = 'hello';
$$a = 'world'; //等价于$hello = 'world'
常量是一个简单值的标识符(名字),在脚本执行期间该值不能改变。默认大小写敏感,一般来讲常量标识符总是大写的,用define()函数关键词再定义。
常量只能包含标量数据(boolean, integer, float, string),注意没有$
符号。
define('NAME', 'Tom');
echo NAME;
注意:
和使用define()定义常量不同的是,使用const关键字定义常量必须处于最顶端的作用域,因为此方法是在编译时定义的。这就意味着不能在函数中,循环内以及if语句中使用const来定义常量。
在程序的任何地方都可以访问到,由php预先定义好的。
$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
<?php
$a = 100;
$b = 200;
function add() {
$GLOBALS['c'] = $GLOBALS['a'] + $GLOBALS['b'];
}
add();
echo "<h1>$c</h1>"; //300
全局变量一般声明在函数外的变量,代码间可以访问,函数内不可以访问。
<?php
$a = 100; //全局变量
function output() {
echo "<h1>$a</h1>";
//报错:Notice: Undefined variable: a in D:\xampp\htdocs\test.php on line 5
}
output();
可以在函数中使用global关键字,对全局变量进行访问。
<?php
$a = 100;
function output() {
global $a;
echo "<h1>$a</h1>"; //100
}
output();
静态函数只是在函数体内,在函数外无法访问。但是执行后,其值保留,等待下次函数执行。
function add() {
static $c = 500; //静态函数
$c++;
echo "<h1>$c</h1>";
}
add(); //501
add(); //502
php一般有自动垃圾回收机制,但是也可以通过收到销毁,用函数unset()。
$a = 100;
$b = $$a;
unset($a);
echo $b; //报错,无法访问
$a = 1234; //十进制数
$a = -123;
$a = 0123; //八进制
$a = 0x1A; //十六进制
$a = 0b11111111; //二进制
NAN属于浮点数
一般情况是单引号和双引号
$c = 100;
echo 'this is {$c}'; //this is {$c}
echo "this is {$c}"; //this is 100
双引号字符串中可以解析变量;
如果变量使用大括号{}
, 注意变量和左括号之间不可以有空格,否则会把大括号也打印出来。
heredoc语法结构
nowdoc语法结构(<<<)
不区分大小写
表示一个变量没有值。以下三种情况,变量可能为NULL:
php中的数组实际上是一个有序映射,映射是一种把values关联到keys的类型。
array( key => value, …)
键key可以是一个整数integer或字符串string
值value可以是任意类型的数
$a = array(
"a" => "abc",
"b" => "ddd"
);
// 自php5.4开始
$b = [
"a" => "abc",
"b" => "ddd"
];
var_dump($a); //该函数可以打印变量以及它的一些类型信息
var_dump($b);
key的强制转换:
"8"
实际被储存为8,但是"08"
则不会强制转换,因为其不是一个合法的十进制数值。8.7
实际被存储为8。""
。Illegal offset type
。重复的key会进行覆盖:
如果在数组定义中,多个单元都使用了同一个key,则最后一个出现的单元会将前面的覆盖。
$a = array(
1 => "abc",
"b" => "ddd",
1.5 => "ccc"
);
var_dump($a); //array(2) { [1]=> string(3) "ccc" ["b"]=> string(3) "ddd" }
key为可选项:
如果未指定key,php将自动使用之前用过的最大integer键名加上1作为新的键名。
$b = ["abc", "ddd", "aaa"];
$d = array(1, 2, 3, 4);
$e = [
"a",
"b",
4 => "c",
"d"
];
var_dump($e); // array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [4]=> string(1) "c" [5]=> string(1) "d" }
注意这里的变量$e
,其中"d"
对应的键名为5,正是因为之前使用过的最大键名为4。
数组的访问:
$array[key]
(大括号{}
的访问方法已经不再支持了)
$a = [1, 2, 3, 4];
echo $a[0]; //1
$b = [
"a" => 1,
"b" => 2,
3
];
// echo $b{0};
echo $b[0];
数组元素的修改与新增:
数组单元可以通过array[key]
来进行修改或新增;如果想要删除某键值对,对其调用unset()
函数。
$arr = array(5 => 1, 12 => 2);
$arr[] = 15; //相当于$arr[13] = 56
unset($arr[5]); //删除该键值对
var_dump($arr); //array(2) { [12]=> int(2) [13]=> int(15) }
对象是复合型的数据类型,php中任何对象可以拥有特征(属性)和行为(方法)。
class Stu { public $university = "PeKing"; public $major; public function __construct($m) { $this->major = $m; } public function wugong() { echo "wugong"; } } $zhang = new Stu("CS"); var_dump($zhang); echo $zhang->major; //CS
Resource资源类型:
比如打开一个文件,或者链接一个数据库等。
$fp = fopen("test.txt", "r");
var_dump($fp); //resource(5) of type (stream)
fclose($fp);
(type)
强制转换(int)、(integer)
:转换为整型(float)、(double)、(real)
:浮点型(string)
:字符型(bool)、(boolean)
:布尔型(array)
:数组型(object)
:对象$a = "12.2";
var_dump((float)$a); //float(12.2)
$a = "12.2";
var_dump(floatval($a)); //float(12.2)
$a = "12.2";
settype($a, "float");
var_dump(floatval($a)); //float(12.2)
注意,前两种转换方式都不会改变原数据的类型,即$a
还是string类型。但第三种方式会改变原数据类型,也就是直接将$a
的类型转变为float类型。
如果给定的数超出integer范围,将会被解释为float类型。
echo PHP_INT_MAX; //9223372036854775807
var_dump(PHP_INT_MAX + 1); //float(9.2233720368548E+18)
将resource转换成integer时,结果会是PHP运行时,给resource分配的唯一资源号。
$fp = fopen("test.txt", "r");
var_dump($fp); //resource(3) of type (stream)
var_dump((int)$fp); //int(3)
NAN将转换为0。
echo (int)NAN; //0
字符串转换为数值:
如果该字符串没有包含'.','e'或'E'
并且其数字值在整型的范围之内,该字符串将被当成integer来取值,其他所有情况下为PHP_INT_MAX。
该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。
$a = "1249857576676879778766767793";
var_dump((int)$a); //int(9223372036854775807) 即PHP_INT_MAX
$b = "123aljfeioj";
var_dump((int)$b); //int(123)
$c = "5.8";
var_dump((int)$c); //int(5) 向下取整
$d = "jflj320jljk";
var_dump((int)$d); //int(0)
$e = 1.5e+10;
var_dump((int)$e); //int(15000000000)
当转换为布尔值时,以下值被认为是FALSE:
"0"
其他所有的值都被认为是TRUE(包括任何资源 和 NAN)
$a = NAN;
var_dump((bool)$a); //bool(true)
$b = " ";
var_dump((bool)$b); //bool(true)
$c = "";
var_dump((bool)$c); //bool(false)
转换规则:
"1"
,FALSE转换成""
(空字符串)"Array"
"Resource id #1"
这种结构的字符串$a = NAN;
var_dump((string)$a); //string(3) "NAN"
$b = true;
var_dump((string)$b); //string(1) "1"
$fp = fopen("test.txt", "r");
var_dump((string)$fp); //string(14) "Resource id #3"
fclose($fp);
对于任意integer,float,string,boolean和resource类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为0,该元素即为此标量的值。
$a = 12.33;
var_dump((array)$a); //array(1) { [0]=> float(12.33) }
如果一个对象object类型转换为array,则结果为一个数组,其单元为该对象的属性,键名将为成员变量名。
class Age
{
public $age1 = 100;
private $age2 = 200;
protected $age3 = 300;
}
$s = new Age();
var_dump((array)$s); //array(3) { ["age1"]=> int(100) ["Ageage2"]=> int(200) ["*age3"]=> int(300) }
注意这里,对象内的属性类型不同,转换为数组时,键名也会有所不同。public、private以及protected有所区别。
array转换成object将键名成为属性并具有相对应的值。
$obj1 = (object) array(1 => "foo");
var_dump($obj1); //object(stdClass)#2 (1) { ["1"]=> string(3) "foo" }
var_dump($obj1->{1}); //string(3) "foo" 当键名为数字时,一定要使用大括号包裹键名
var_dump(isset($obj1->{1})); //bool(true)
注意,当键名为数字时,一定要使用大括号包裹键名。
对于其他值,会包含进成员变量名scalar。(scalar是标量的意思)
$obj = (object) "hao";
var_dump($obj); //object(stdClass)#1 (1) { ["scalar"]=> string(3) "hao" }
var_dump($obj->scalar); //string(3) "hao"
=
+ - * / % ++ -- **(指数)
intdiv()
整除
连接运算符.
:
返回其左右参数连接后的字符串。
$a = "hello ";
$b = "php";
$c = $a.$b;
echo $c; //hello php
与&&(AND)、或||(OR)、非!、异或xor
优先级从高到低:&&、||、=、AND、OR
$a = true && false;
var_dump($a); //bool(false)
$b = true and false;
var_dump($b); //bool(true)
一般情况下,AND
和&&
等价,但是要注意它们的优先级是不同的,and的优先级比较低,低于赋值运算符,所以$b
通过赋值运算符,直接等于了true。
平时使用时,建议使用&&
来替代AND
,否则优先级容易出问题。
短路运算:
$a = false && foo();
var_dump($a); //bool(false)
$b = false and foo();
var_dump($b); //bool(false)
$c = true || foo();
==
和===
等于和全等运算符:和JavaScript相同。
<>
和!=
不等。
!==
不全等。
<=>
太空船运算符(组合比较符):当$a
小于、等于、大于$b
时,分别返回一个小于、等于、大于0的integer值。php7开始提供。
$a = 9 <=> 10;
var_dump($a); //int(-1)
$b = 10 <=> 9;
var_dump($b); //int(1)
$c = 9 <=> 9;
var_dump($c); //int(0)
??
NULL合并操作符:从左往右第一个存在且不为NULL的操作数。如果都没有定义,则返回NULL。php7开始提供。
$a = $b ?? $c;
var_dump($a); //NULL
$d = $b ?? 10;
var_dump($d); //int(10)
位运算符允许对整型数中指定的位进行求值和操作。
位运算符 | 含义 |
---|---|
& | 按位与 |
` | ` |
^ | 异或 |
~ | 非 |
<< >> | 移位 |
var_dump(3 & 1); //int(1)
// 0000 0011(3) & 0000 0001(1) = 0000 0001(1)
var_dump(3 | 1); //int(3)
var_dump(3 ^ 1); //int(2)
var_dump(~3); //int(-4)
// ~0000 0011 = 1111 1100
var_dump(3 << 1); //int(6)
// 0000 0011 << 1 = 0000 0110(6)
var_dump(3 >> 1); //int(1)
$php_errormsg = "error";
$my_file = @file('non_existent_file') or
die("Failed opening file: error wa '$php_errormsg'");
//Failed opening file: error wa 'error'
合并运算符+
:
$arr = [
"a" => "apple",
"b" => "banana"
];
$arr1 = [
"a1" => "apple1",
"b1" => "banana1",
"a" => "apple", //键名相同,合并时将会被忽略,以首次出现的键值对为准
"c" => "apple" //键值相同,会正常合并
];
$a = $arr + $arr1;
var_dump($a);
//array(5) { ["a"]=> string(5) "apple" ["b"]=> string(6) "banana" ["a1"]=> string(6) "apple1" ["b1"]=> string(7) "banana1" ["c"]=> string(5) "apple" }
相等运算符==
和===
:
$arr = [
"a" => "apple",
"b" => "banana"
];
$arr1 = [
"b" => "banana",
"a" => "apple"
];
var_dump($arr == $arr1); //bool(true)
var_dump($arr === $arr1); //bool(false)
双等运算符主要看键值对是否一致,不管顺序。三等运算符需要考虑键值对的顺序。
$arr = ["apple", "banana"];
$arr1 = [
"1" => "banana",
"0" => "apple"
];
var_dump($arr == $arr1); //bool(true)
var_dump($arr === $arr1); //bool(false)
php支持一个执行运算符:反引号(``)。php将尝试将反引号中的内容作为shell命令来执行,并将其输出信息返回。
$output = `ipconfig`;
echo "<pre>$output</pre>";
$a = 12;
$b = 13;
if ($a > $b) {
echo "a > b";
} elseif ($a < $b) {
echo "a < b";
} else {
echo "a == b";
}
php还提供了一些替代语法:
使用:
替代{
;使用endif
替代}
。
if ($a > $b) :
echo "a > b";
elseif ($a < $b) :
echo "a < b";
else :
echo "a == b";
endif;
同样有替代语法,:
和endwhile
。
endfor
foreach语法结构提供了遍历数组的简单方式,foreach仅能用于数组和对象。
$arr = ["a", "b", "c", "d"];
foreach ($arr as $key=>$val) {
echo "<h1>$key - $val</h1>";
}
endforeach
break结束当前for、foreach、while、do-while或者switch结构的执行,后面可以跟一个参数,表示跳出几层循环,默认为1层。
$arr1 = ["a1", "b1", "c1"];
$arr2 = ["a2", "b2", "c2"];
foreach ($arr1 as $key1=>$val1) {
foreach ($arr2 as $key2=>$val2) {
if ($val1 == "b1" && $val2 == "b2") {
echo "--------";
break;
}
echo "<h1>$val1 - $val2</h1>";
}
}
此时就是break一层的情况,输出结果为:
如果改为break 2
:
$arr1 = ["a1", "b1", "c1"];
$arr2 = ["a2", "b2", "c2"];
foreach ($arr1 as $key1=>$val1) {
foreach ($arr2 as $key2=>$val2) {
if ($val1 == "b1" && $val2 == "b2") {
echo "--------";
break 2;
}
echo "<h1>$val1 - $val2</h1>";
}
}
continue在循环中用来跳过本次循环中剩余代码的执行,用法跟break差不多,也可以跟参数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。