一、编写和运行PHP程序
- 第一步:使用文本编辑器(也可以是其它编辑代码的软件,如VSCode),创建一个包含源代码的磁盘文件,扩展名一定要是“.php”;
- 第二步:将文件上传至Web服务器,也就是将文件保存在wamp集成环境下的…\www\目录中;
- 第三步:通过浏览器访问Web服务器运行程序,即在浏览器地址栏中输入http://localhost/文件名.php。
- 测试代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>第一个PHP程序(获取服务器信息)</title>
</head>
<body>
<?php
header('Content-type:text/html;charset=utf-8');
$sysos = $_SERVER["SERVER_SOFTWARE"]; // 获取服务器标识的字符串
$sysversion = PHP_VERSION; // 获取PHP服务器版本
// 以下两条代码连接MySQL数据库并获取数据库的版本信息
$con = mysqli_connect("localhost", "root", "");
$mysqlinfo = mysqli_get_server_info($con);
// 从服务器中获得GD信息
$gd = gd_info();
$gdinfo = $gd['GD Version'];
// 从GD库查看是否支持FreeType字体
$freetype = $gd["FreeType Support"] ? "支持" : "不支持";
// 从PHP配置文件中获得是否可以获取远程文件
$allowurl = ini_get("allow_url_fopen") ? "支持" : "不支持";
// 从PHP配置文件中获得最大上传限制
$max_upload = ini_get("file_uploads") ? ini_get("upload_max_filesize") : "Disabled";
// 从PHP配置文件中获得脚本的最大执行时间
$max_ex_time = ini_get("max_execution_time")."秒";
// 以下两条获取服务器时间,中国采用的是东八区的时间,设置时区写出Etc/GMT-8
date_default_timezone_set("Etc/GMT-8");
$systemtime = date("Y-m-d H:i:s",time());
/*以HTML表格形式输出以上获取到的信息*/
echo "<table align=center cellspacing=0 cellpadding=0>";
echo "<caption><h2>系统信息</h2></caption>";
echo "<tr><td>Web服务器: </td> <td>$sysos </td></tr>";
echo "<tr><td>PHP版本: </td> <td>$sysversion </td></tr>";
echo "<tr><td>MySQL版本: </td> <td>$mysqlinfo </td></tr>";
echo "<tr><td>GD库版本: </td> <td>$gdinfo </td></tr>";
echo "<tr><td>FreeType: </td> <td>$freetype </td></tr>";
echo "<tr><td>远程文件获取:</td> <td>$allowurl </td></tr>";
echo "<tr><td>最大上传限制:</td> <td>$max_upload </td></tr>";
echo "<tr><td>最大执行时间:</td> <td>$max_ex_time</td></tr>";
echo "<tr><td>服务器时间: </td> <td>$systemtime </td></tr>";
echo "</table>";
?>
</body>
</html>
二、变量的申明和应用
1.变量的申明
- 在PHP中变量的声明必须使用一个美元符号**“$”**后跟变量名来表示,使用赋值操作符(=)给一个变量赋值;
- 大部分的PHP变量如果不是在函数里面声明的,则只能在声明处草文件结束的一个单独的范围内使用。这个单独的范围跨度可以是开始标记到结束标记之间;可以是一个页面开启的所有PHP模式里面;可以是include和required引入的文件;可以是使用了Cookie或Session的多个页面;
- 在函数使用范围内:unset()函数释放指定变量;isset()函数检测变量是否设置;empty()函数检测一个变量是否为空
- 实例代码:
<?php
$var = '';
if(empty($var)){
echo "$var is either 0 or not set at all";
}
if(!isset($var)){
echo "$var is not set at all";
}
unset($var);
if(isset($var)){
echo "This var is set so I will print";
}
2.变量的命名
- 变量名是严格区分大小写的,但内置结构和关键字及用户自定义的类名和函数名是不区分大小写的。
- 实例代码:
<?php
$name = "tarzan";
$Name = "skygao";
$NAME = "tom";
echo $name;
echo $Name;
echo $NAME;
echo "this is a test";
Echo "this is a test";
ECHO "this is a test";
phpinfo();
Phpinfo();
PhpInfo();
PHPINFO();
- 变量名不能以数字开头,必须以字母或者下划线开头,后面可以跟任意数量的数字、字母和下划线,且中间不能使用空格;PHP的变量名中还可以含有中文;
- 实例代码:
<?php
$var = 'Bob';
$Var = 'Joe';
echo "$var,$Var";
$4site = 'not yet';
$_4site = 'not yet';
$i站点is = 'not yet';
- PHP中系统定义的标识符即关键字,不能作为常量名、函数名和类名使用;但是可以作为变量名使用;不过为了避免混淆,最好不要是关键字作为变量名。
- 如果变量是由多个单词构成的,则第一个单词采用全部小写字母,以后每个单词首字母采用大写的风格,例如$myNewVariable。
3.可变变量
- 可变变量就是获取一个普通变量的值作为该可变变量的变量名
- 实例代码:
<?php
$hi = "hello";
$$hi = "world";
echo "$hi $hello";
echo "$hi $($hi)";
4.变量的引用赋值
- 一般情况下我们使用的都是传值赋值,使用这种赋值方法,当一个变量的值赋予另一个变量时,改变其中一个变量的值,将不会影响到另一个变量;
- 引用赋值,使用这种赋值方法意味着新的变量引用了原始变量,改动其一都会影响另一方,这个过程中省略了复制操作,所有这种赋值方法效率更高;
- 实例代码:
<?php
$foo = 'Bob';
$bar = &$foo;
$bar = "My name is Tom";
echo "$bar";
echo "$foo";
$foo = "Your name is Jack";
echo "$foo";
echo "$bar";
- 还有一个很重要的点就是,只有有名字的变量才能赋值;且unset()函数释放其中一个,不会影响另一方,例如释放了上方
f
o
o
,
foo,
foo,bar不会收影响,只是互相取消值的关联。
三、PHP变量的数据类型
PHP支持8中原始类型,还有一些伪类型,如mixed、number和callback。
1.四种标量类型
1. 布尔型(boolen) 一般情况下,布尔型的值就是FALSE和TRUE,但是当运算符、函数或者流程控制需要一个布尔型参数时,任何类型的值都可以自动转化为布尔型的值。关于自动转换为布尔型的值,以下值被认为是FALSE,其他都被认为是TURE:
- 布尔值FALSE;
- 整型值0位假,是FALSE,-1和其他非零值都被认为是TRUE;
- 浮点型0.0;
- 空白字符串和字符串"0";
- 没有成员变量的数组,即空数组
- 没有单元的对象(仅使用于PHP4)
- 特殊类型NULL
2. 整型(integer)
- 十进制:$int = 123;
- 二进制:$int = 0b123(数字前面加上0b);
- 八进制:$int = 0123(数字前面加上0);
- 十六进制:$int = 0x123(数字前面加上0x);
- 对于32位系统的取值范围为:2 147 483 647 ~ -2 147 483 648,PHP不支持无符号整数不能将整数都变成整数,也不能将最大值翻一翻,超过最大值将会从整型变为浮点类型
- 对于64位系统的取值范围为:大约为9E18即9乘以10的18次方,最小值大约为最大值的相反数即-9E18;
- 系统常量PHP_INT_SIZE代表integer型的字长,就是一个integer型变量占用的字节数;
- 系统常量PHP_INT_MAX代表整型的最大值;
- 系统常量PHP_INT_MIN代表整型的最小值。
3. 浮点型(float,也称double)
- double和float是相同的,两个名称同时存在,通常用来表示整型无法表示的数据,如金钱值、距离值和速度值等;
- 取值范围为1.7E-38~1.7E+38,精确到小数点后15位;
- 浮点数只是一种近似值,永远不要相信浮点数精确到了最后一位,也不要尝试比较两个浮点数是否相等。
4. 字符串(string) (1)单引号字符串
- 单引号字符串中不能再包括单引号,如果要使用单引号就要就行转义’(反斜杠+单引号);
- 但引号字符串中只能转义单引号本身和反斜杠(转义字符)本身;
- 单引号不能解析变量,会将变量名原样输出;
- 定义简单字符串时,单引号效率更高,没有特殊要求,应使用单引号定义字符串。
(2)双引号字符串
- 双引号可以解析变量名、数组值和对象属性的方法;
- 遇到$符号,解析器会尽可能多地取得后面的字符以组成一个合法的变量名;
- 可以使用花括号把变量名括起来,方便解析。
(3)定界符
- 定界符(<<<)语法字符串,在“<<<”之后提供一个标识符开始,然后就是包含的字符串,最后一同样的标识符结束;
- 结束标识符必须从行的第一列开始,后面除了分号不能包含其它任何字符,空格和空格制表符都不行;
- 标识符和变量名的定义一样,不能由数组开头,且只能包含数字、字母和下划线。
- 定界符除了不笨初始化类成员,表现得和双引号字符串功能一样;界定符中变量也能被解析,通常用来输出文件和数据库中大段的文档;
- 可以为开始标识符加上单引号或者双引号,加上什么引号其功能就与其类型的字符串功能相似;
- 双引号和定界符字符串,支持使用“\u{xxxxx}”来解析Unicode字符
(4)实例代码
<?php
header('Content-type:text/html;charset=utf-8');
echo 'this is a simple string';
echo '<br/>';
echo 'this is a \'simple\' string';
echo '<br/>';
echo 'this \n is \r a \t \'simple\' string \\';
echo '<br/>';
$string = 'this';
echo '$string is a simple string';
echo "<br/><br/><br/>";
$beer = 'Jack';
echo "$beer is a bad boy";
echo "<br/>";
echo "${beer}s is a bad boy";
echo "<br/>";
echo "{$beer}s is a bad boy";
echo "<br/>";
$string0=<<<EOT
这里是包含在定界符中的字符串,指出了定界符的一些使用时的注意事项。
很重要的一点必须指出,结束标识符EOT所在的行不能包含任何其他字符。这意味着该标识符
不能被缩进,而且在结束标记的分号之前和之后都不能有任何空格或制表符。
同样重要的是,要意识到在结束标识符之前的第一个字符必须是你的操作系统中定义的换行符。
如果破坏了这条规则使得结束标识符不“干净”,则它不会被视为结束标识符,PHP将继续寻找下去。
如果在这种情况下找不到合适的结束标识符,将会导致一个语法错误。
EOT;
echo $string0;
echo "<br/>";
$name = 'Jack';
$string00=<<<EOT
My name is $name. I am printing a "string" \n.
\tnow, I am printing some new line \n \r.
\tThis should print a capital 'A'.
EOT;
echo $string00;
echo "<br/>";
$name1 = 'Tom';
$line1=<<<'EOT'
"$name1" is a good boy. \n I get grade:\x41
EOT;
$line2=<<<"EOT"
"$name1" is a good boy. \n I get grade: \x41
EOT;
echo $line1;
echo "<br/>";
echo $line2;
echo "<br/>";
echo "\u{4f5c} \u{8005} \u{5f88} \u{5e05}";
2.两种复合类型
- 数组(array)
- 数组可以存放多个数据,且可以是任何类型;实际上数组相当于一张有序图,把values映射到keys的类型,此类型在很多方面进行了优化,可以把它当成真正的数组或者列表(矢量)、散列表(图的一种实现)、字典、集合、栈、队列来使用,以及更多的可能性。用array()语言结构来新建一个array,它接受一定数量的用逗号分科的key=>value参数对;
- 实例代码:
<?php
$arr = array("foo" => "bar", 12 => true);
print_r($arr);
echo $arr["foo"];
echo $arr[12];
- 对象(object)
- 对象是一种比数组更高级的复合数据类型,一个对象变量由一组方法和一组属性值构成,方法表明对象的功能,属性表明对象的状态;初始化对象的方法,用new语句将对象实例化到一个变量中;
- 实例代码:
<?php
class Person{
var $name;
function say(){
echo "Doing foo.";
}
}
$p = new Person;
$p->name = "Tom";
$p->say();
3.两种特殊类型
- 资源(resource)
- 资源是一种特殊的变量,保存了到外部资源的一个引用;使用的资源类型变量包含:打开的文件、数据库连接、图形画布区域等的特殊句柄,有程序员创建和回收;
- 实例代码
<?php
$file_handle = fopen("info.txt","w");
var_dump($file_handle);
fclose($file_handle);
$dir_handle = opendir("C:\\WINDOWS\\Fonts");
var_dump($dir_handle);
$link_mysql = mysqli_connect("localhost", "root", "");
var_dump($link_mysql);
$im_handle = imagecreate(100,50);
var_dump($im_handle);
$xml_parser = xml_parser_create();
var_dump($xml_parser);
- NULL
- 特殊的NULL表示一个变量没有值,NULL类型唯一可能的值就是NULL。NULL不表示空格,不表示0,也不表示空字符串,而是表示一个变量的值为空,NULL不是空值,就是值为空;但不是空值,空值也是一种存在的值,而NULL表示值不存在;
- NULL不区分大小写,变量为NULL值的有:将变量直接赋值为NULL;声明的变量没有被赋值;被unset()函数销毁的变量;
- 实例代码:
<?php
$a = NULL;
$b = "value";
unset($b);
var_dump($a);
var_dump($b);
var_dump($c);
四、常量的声明与应用
常量是一个简单值的标识符,在脚本执行期间一个常量一旦被定义,就不能再改变或是取消定义,且常量的作用域是全局的,可以在脚本的任何地方声明和访问常量;常量只能是标量数据类型;
1.常量的定义和使用
- 第一种常量定义方法:使用define()函数定义;常量的定义不需要加$符号,且名称总是要大写;
- 第二种常量定义方法:使用const关键字(5.3.0版本后)
- 实例代码:
<?php
define("CON_INT", 100);
echo CON_INT;
define("GREETING", "hello world", true);
echo GREETING;
echo Greeting;
echo "<br/>";
const FOO = 'BAR';
for($i = 0; $i <32 ; ++$i){
define('YDMA_'.$i, 1 + $i);
}
echo YDMA_16;
echo "<br/>";
define("VAR0", "888");
echo constant("VAR0");
echo "<br/>";
const CONSTANT0 = 'test contant';
echo constant("CONSTANT0");
echo "<pre>";
print_r(get_defined_constants());
- 两种定义常量方法的区别:
- const是一个语言结构,define()是一个函数;const编译时要比define()快;
- define()声明常量是,常量名是一个字符串类型,可以动态拼接,可以用表达式做名称;const只能用普通的常量名称;
- const关键字定义的常量区分大小写,define()函数可以通过第三个参数决定是否区分大小写;
2.常量和变量的区别
- 常量前面没有美元符号;
- 常量只能用define()函数和const关键字定义,不能通过赋值语句定义;
- 常量可以不用理会变量范围的规则而在任何地方定义和访问;
- 常量一旦被定义,就不能重新定义或者取消定义,直到脚本运行结束自动释放;
- 常量的值只能是标量,可以是resource但是要经历避免,可能会出现问题。
五、PHP中的运算符号
1.算数运算符
算数运算符有 +(加)、-(减或取负)、*(乘)、/(除)、%(取余)、++(累加1)、–(递减1)、**(幂运算)
2.字符串运算符
字符串运算符只有一个,是英文的句号(.),也成为连接运算符;它是一个二元运算符,不仅可以将两个字符串连接起来,合并成新的字符串,还可以将一个字符串和任何标量数据类型相连接,合并成的都是新字符串。
3.赋值运算符
赋值运算符(=),它左边的操作数必须是变量,右边可以是表达式;赋值运算符的=号,并不是判断左右两边的操作数是否相等,而是要看作“复制”运算符,可以使用“=”运算符连续声明多个有相同值的变量;赋值运算符还有 +=、-=、*=、/=、%=、.=。
4.比较运算符
比较运算符有 >(大于)、<(小于)、>=(大于等于)、<=(小于等于)、==(等于)、 ===(全等于)、<>或!= (不相等)、 ! == (非全等于)、<=>(太空船运算符)、??(NULL合并操作符)。
- “= =”和“= = =”的区别在于,“= =”只比较值是否相等,无论类型是否相同;但实际上,“= =”是先将两个操作数转换为同一类型,在进行比较;如果不仅要比较操作数的值,还有比较类型,那么就用“= = =”;
- 太空船操作符“<=>”,也称组合比较符,当两边的操作是满足“<”时,返回-1,当满足“="时,返回0,当满足“>”时,返回1;
- null合并运算符(??)代替了三元运算符(?:)和isset()函数的组合使用,如果变量存在且值不为NULL就返回自身的值,否则返回第二个操作数,是三元运算符的改造,减少代码量。
5.逻辑运算符
逻辑运算符有:and或&&(逻辑与)、or或||(逻辑或)、not或!(逻辑非)、xor(逻辑异或)
- xor:逻辑异或,当作业两边操作数只有一个为TRUE时,返回TRUE,否则返回FALSE。
6.位运算符
位运算符有:&(按位与)、|(按位或)、^(按位异或)、~(按位非)、<<(左移)、>>(右移)
- 逻辑或||和逻辑与&&有短路问题,即当前面的表达式满足条件时,就停止往下运算;按位或|和按位与&则没有短路问题,两边的表达式都会执行。
7.其他预算符
- ?:(三元运算符,提供简单的逻辑判断);
- ``(反引号,是执行预算符,PHP尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回);
- @(错误抑制运算符,放到一个表达式之前,该由表达式产生的错误信息都会被忽视,实质上错误并没有被解决);
- =>(数组下标指定符号,通过此符号指定数组的键与值);
- ->(对象成员访问符号,访问对象中的成员属性或成员方法);
- instanceof(类型运算符,用来测定一个给定的对象是否来自指定的对象类);
内容都总结自《细说PHP》第四版
|