《PHP and MySQL Web Development》 第5版中部分知识总结。
1.介绍
1.什么是PHP
PHP是专门为Web设计的服务端脚本语言。
PHP目前解释为PHP Hypertext Preprocessor.
PHP7包含了Zend引擎的重构。
2.使用PHP
PHP是不可见的,因为PHP解释器会提前运行脚本,并将PHP用脚本的输出代替。PHP在服务端被解释和运行,而JavaScript等其它客户端技术在用户机器上的浏览器中解释执行。所以使用PHP,可以产生纯净的HTML,被任何浏览器可见。
从安全的角度来说,从用户处获取数据并直接在浏览器上显示,是一个非常有风险的行为。需要经过函数htmlspecialchars()
再传递给浏览器。
变量显示的两种方式:
//1.使用单引号,用.连接字符串
echo htmlspecialchars($tireqty).' tires<br />';
//2.将变量放在双引号中
$tireqty = htmlspecialchars($tireqty);
echo "$tireqty tires<br />";
PHP的一个特性是,不需在使用之前声明变量。
PHP有三种特殊的类型:NULL,resource,callable
。
PHP是一种弱类型语言,它可以在任何时间,根据存储的内容,改变变量的类型。
PHP中变量的变量:
$varname = 'tireqty';
$$varname = 5;
//等同于
$tireqty = 5;
声明和使用常量:
define('TIREPRICE', 100);
echo TIREPRICE; //特点是没有$符号
PHP中关于变量范围的重要几点:
1.脚本中的全局变量在整个脚本中,除了函数内部,都可见。
2.函数中被声明为global
的变量,是指同名的全局变量。
3.在函数内部创建并声明为static
的变量从函数外部不可见,但是在函数的每次运行中会保存其数值。
超全局变量包括:$GLOBALS,$_SERVER,$_GET,$_POST,$_COOKIE,$_FILES,$_ENV,$_REQUEST(GET,POST,COOKIE),$_SESSION
赋值的返回值:
$b = 6 + ($a = 5)
中,$b
的值是11。
引用符:
$a = 5;
1. $b = $a;
//a的值会被复制,存储到另一块内存中。a的值改变,b的值不变。
2. $b = &$a;
//a和b指向同一块内存。a和b的值同时改变。
//但是a被销毁后,b的值仍然存在。(相当于别名,而非指针)
完全相同运算符===
,只有值相等,并且类型相同时才会返回true
。如果是两个数组,不仅需要有相同的键值对,还得顺序和类型相同。
<>
也可以表示不相同。
+
在数组中是并集运算。
运行运算符:
//1.Unix
$out = `ls -la`;
//2.Windows
$out = `dir c:`;
echo '<pre>'.$out.'</pre>';
PHP中的变量处理函数:
1.测试设置变量类型
string gettype(mixed var);
bool settype(mixed var, string type);
is_real() //是否是float类型
is_scalar() //是否是整数、布尔、string或浮点数类型
is_numeric() //是否是数字或数字串
is_callable() //是否是一个有效函数的名字
2.测试变量状态
bool isset(mixed var[,mixed var[,...]])
void unset(mixed var[,mixed var[,...]])
bool empty(mixed var) //变量不存在或者为0或者为空
//如果是false,显示为空;如果是true,显示为1。
3.重新解释变量
int intval(mixed var[, int base=10])
float floatval(mixed var)
string strval(mixed var)
变量的变量与for
循环结合:
//对name1,name2,name3这样的变量进行迭代
for($i=1;$i<=$numnames;$i++) {
$temp = "name$i";
echo htmlspecialchars($$temp).'<br />';
}
停止当前脚本运行语句:exit
。在错误检查时常用。
3.PHP存储和提取数据
$_SERVER['DOCUMENT_ROOT']
打开服务器的Web文档根目录。
文件模式中,为获得最大的可移植性,一般建议加上b
。Windows系统区分二进制文件和文本文件,Unix系统不区分。
操作文件:
1.打开文件
$fp = fopen("$document_root/../orders/orders.txt",'ab');
//如果php.ini中,allow_url_open是打开的,那么可以通过FTP和HTTP打开文件
2.写文件
fwrite($fp, $outputstring, strlen($outputstring)); //fputs等同
3.关闭文件
fclose($fp);
4.一次读一行文件
while(!feof($fp)) {
} //使用while循环读文件,直到文件末尾
$order = fgets($fp); //fgets读到\n或EOF停止
string fgetss(resource fp[, int length[, string allowable_tags]]) //默认剔除PHP和HTML标签
array fgetcsv(resource fp, int length[, string delimiter[, string enclosure[, string escape]]]) //可以设定分解符,length设置为0可以不限制长度
5.一次读整个文件
//自动打开文件,输出内容,关闭文件
int readfile(string filename,[bool use_include_path[, resource context]]);
//将文件读入数组中
$filearray = file(string filename);
//返回文件全部内容
file_get_contents(string filename);
//需要fopen,将指针位置处的内容输出,成功返回true
fpassthru($fp);
6.
fgetc($fp); //一次读一个字符,返回EOF
string fread(resource fp, int length); //读任意大小
file_exits(string filename);
filesize(string filename);
unlink(string filename);
rewind($fp); ftell($fp);
int fseek(resource fp, int offest[, int whence]);
//whence默认为SEEK_SET开始位置,还可以为SEEK_CUR,SEEK_END。
处理并发:对文件上锁
bool flock(resource fp, int operation[, int &wouldblock]);
//如果当前进程阻塞,第三个参数将返回true
LOCK_SH //读锁
LOCK_EX //写锁
LOCK_UN //释放锁
flock()
不支持NFS等网络文件系统,也不支持一些不允许锁操作的文件系统如FAT。在一些操作系统上,它在进程级实施,在使用多线程API时无法正常工作。
用@
符号抑制该函数的任何错误提示,可以用对用户更友好的方式显示错误信息。
@$fp = fopen("$document_root/../orders/orders.txt",'ab');
if(!$fp) {
echo "<p><strong> Your order could not be processed at this time.
.Please try again later.</strong></p></body></html>";
exit; //如果错误退出脚本
}
使用fwrite
时,在Unix系统中,需要给apache用户组可写的权限:
1.查看配置文件apache2.conf,搜索User,可以看到
# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
2.然后查看/etc/apache2/envvars,看到:
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
所以apache用户组的名字为www-data
3.然后创建目录,并授予权限:
sudo mkdir path/to/orders
sudo chgrp apache path/to/orders
sudo chmod 775 path/to/orders
4.PHP数组
PHP中数组可以动态调整大小。
1.创建数组:
$products = array( 'Tires', 'Oil', 'Spark Plugs' );
$products = ['Tires', 'Oil', 'Spark Plugs'];
$odds = range(1, 10, 2);
$letters = range('a', 'z');
2.使用自定义的索引:
$prices = array('Tires'=>100, 'Oil'=>10, 'Spark Plugs'=>4); //隐式创建
$prices['Tires'] = 100;
3.遍历数组:
//默认索引
foreach($products as $current) {
echo $current.' ';
}
//自定义索引
foreach($prices as $key => $value) {
echo $key.'-'.$value.'<br />';
}
while($element = each($prices)) {
//或者list($product, $price) = each($prices)
echo $element['key'].'-'.$element['value'];
echo '<br />';
}
//each返回4个键值对,'key'和0等价,'value'和1等价。
//注意,数组会记录当前元素的位置,如果使用each()方法两次遍历数组,需要在第二次调用前reset($prices)。
//二维数组的遍历,自定义索引可以采用while循环
for ($row = 0; $row < 3; $row++) {
while (list( $key, $value ) = each( $products[$row])){
echo '|'.$value;
}
echo '|<br />';
}
4.数组排序:
sort(); //对默认索引的数组排序
asort(); //对自定义索引的值排序