首页 > Web开发 > 详细

PHP基础知识总结(待更)

时间:2019-02-24 14:50:13      阅读:1849      评论:0      收藏:0      [点我收藏+]

                                                PHP
1丶PHP不是纯粹的面向对象,只是基于对象的面向过程语言,纯粹的面向对象必须是支持封装、继承,多态(集中包含重载)的类实现,
而PHP是不支持重载的。

2丶PHP 变量规则:
    变量以 $ 符号开始,后面跟着变量的名称
    变量名必须以字母或者下划线字符开始
    变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )
    变量名不能包含空格
    变量名是区分大小写的($y 和 $Y 是两个不同的变量)

3丶PHP 变量作用域
变量的作用域是脚本中变量可被引用/使用的部分。
PHP 有四种不同的变量作用域:
local   局部,仅在函数内部作用
global  global 关键字用于函数内访问全局变量。在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上 global 关键字:
static  当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。要做到这一点,请在您第一次声明变量时使用 static 关键字:
parameter  参数作用域
局部和全局作用域
在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,
需要使用 global 关键字。
在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问:
参数作用域
参数是通过调用代码将值传递给函数的局部变量。
参数是在参数列表中声明的,作为函数声明的一部分

4丶echo后面输出字符的话要用单引号连接‘ ‘
php接收html文本框里的类容用echo $_POST["name"] //name为input中name的属性的值

5丶PHP echo 和 print 语句
echo 和 print 区别:
echo - 可以输出一个或多个字符串
print - 只允许输出一个字符串,返回值总为 1
提示:echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。

6丶一维数组
$Hero=array("亚索","李青","劫");//定义一个一维数组
print("我玩的最好的英雄是{$Hero[0]}");//{$Hero[0]}取数值里的第一个元素

7丶PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有:
(int)、(integer):转换成整形
(float)、(double)、(real):转换成浮点型
(string):转换成字符串
(bool)、(boolean):转换成布尔类型
(array):转换成数组
(object):转换成对象
PHP数据类型有三种转换方式:
在要转换的变量之前加上用括号括起来的目标类型
使用3个具体类型的转换函数,intval()、floatval()、strval()
使用通用类型转换函数settype(mixed var,string type)

8丶PHP数据类型
String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值)。
PHP 字符串
一个字符串是一串字符的序列,就像 "Hello world!"。
你可以将任何文本放在单引号和双引号中:
String中      一个字母占1个长度,一个汉字占3个长度
PHP 整型
整数是一个没有小数的数字。
整数规则:
整数必须至少有一个数字 (0-9)
整数不能包含逗号或空格
整数是没有小数点的
整数可以是正数或负数
整型可以用三种格式来指定:十进制, 十六进制( 以 0x 为前缀)或八进制(前缀为 0)。
PHP 布尔型
布尔型可以是 TRUE 或 FALSE。
$x=true;
$y=false;
布尔型通常用于条件判断
PHP 数组
数组可以在一个变量中存储多个值。
在以下实例中创建了一个数组, 然后使用 PHP var_dump() 函数返回数组的数据类型和值:
对象数据类型也可以用于存储数据。
PHP对象
在 PHP 中,对象必须声明。
首先,你必须使用class关键字声明类对象。类是可以包含属性和方法的结构。
然后我们在类中定义数据类型,然后在实例化的类中使用数据类型:
PHP关键字this就是指向当前对象实例的指针,不指向任何其他对象或类。
PHP NULL 值
NULL 值表示变量没有值。NULL 是数据类型为 NULL 的值。
NULL 值指明一个变量是否为空值。 同样可用于数据空值和NULL值的区别。
可以通过设置变量值为 NULL 来清空变量数据:
** var_dump();//打印数据类型和值,并且该函数自带换行
PHP_EOL  //小空格字符
**在PHP中“::”这个叫范围解析操作符,又名域运算符  
“::”符号可以认为是与C语言中的“.”相似的,而它更像C++中(Perl)的::类范围操作符。
  php调用类的内部静态成员,或者是类之间调用就要用::

9丶PHP 常量
常量是一个简单值的标识符。该值在脚本中不能改变。
一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。
常量值被定义后,在脚本的其他任何地方都不能被改变。
注意: 常量在整个脚本中都可以使用。
设置 PHP 常量
设置常量,使用 define() 函数,函数语法如下:
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
该函数有三个参数:
    name:必选参数,常量名称,即标志符。
    value:必选参数,常量的值。
    case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感。默认是大小写敏感的。

10丶PHP 中的字符串变量
字符串变量用于包含有字符的值。
在创建字符串之后,我们就可以对它进行操作了。您可以直接在函数中使用字符串,或者把它存储在变量中。
在下面的实例中,我们创建一个名为 txt 的字符串变量,并赋值为 "Hello world!" 。然后我们输出 txt 变量的值:
字符串变量用于存储并处理文本。
PHP 并置运算符
在 PHP 中,只有一个字符串运算符。
并置运算符 (.) 用于把两个字符串值连接起来。
下面的实例演示了如何将两个字符串变量连接在一起:
PHP strlen() 函数
有时知道字符串值的长度是很有用的。
strlen() 函数返回字符串的长度(字符数)。
提示:strlen() 常常用在循环和其他函数中,因为那时确定字符串何时结束是很重要的。(例如,在循环中,我们需要在字符串中的最后一个字符之后结束循环。)
PHP strpos() 函数
strpos() 函数用于在字符串内查找一个字符或一段指定的文本。
如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE。
php substr()函数 语法
作用:截取字符串
语法:substr(string,start,length)
php strtoupper()函数 语法
作用:把所有字符转换为大写
语法:strtoupper(string)
php strtolower()函数 语法
作用:把所有字符转换为小写
语法:strtolower(string)

11丶PHP 算术运算符
运算符    名称    描述    实例    结果
x + y    加    x 和 y 的和    2 + 2    4
x - y    减    x 和 y 的差    5 - 2    3
x * y    乘    x 和 y 的积    5 * 2    10
x / y    除    x 和 y 的商    15 / 5    3
x % y    模(除法的余数)    x 除以 y 的余数    5 % 2
- x    取反    x 取反    - 2    -2
a . b    并置    连接两个字符串    "Hi" . "Ha"    HiHa
PHP7+ 版本新增整除运算符 intdiv()

12丶PHP 赋值运算符
在 PHP 中,基本的赋值运算符是 "="。它意味着左操作数被设置为右侧表达式的值。也就是说,"$x = 5" 的值是 5。
运算符    等同于    描述
x = y    x = y    左操作数被设置为右侧表达式的值
x += y    x = x + y    加
x -= y    x = x - y    减
x *= y    x = x * y    乘
x /= y    x = x / y    除
x %= y    x = x % y    模(除法的余数)
a .= b    a = a . b    连接两个字符串

13丶PHP 递增/递减运算符
运算符    名称    描述
++ x    预递增    x 加 1,然后返回 x
x ++    后递增    返回 x,然后 x 加 1
-- x    预递减    x 减 1,然后返回 x
x --    后递减    返回 x,然后 x 减 1

14丶PHP 比较运算符
比较操作符可以让您比较两个值:
运算符    名称    描述    实例
x == y    等于    如果 x 等于 y,则返回 true    5==8 返回 false
x === y    恒等于    如果 x 等于 y,且它们类型相同,则返回 true    5==="5" 返回 false
x != y    不等于    如果 x 不等于 y,则返回 true    5!=8 返回 true
x <> y    不等于    如果 x 不等于 y,则返回 true    5<>8 返回 true
x !== y    不恒等于    如果 x 不等于 y,或它们类型不相同,则返回 true    5!=="5" 返回 true
x > y    大于    如果 x 大于 y,则返回 true    5>8 返回 false
x < y    小于    如果 x 小于 y,则返回 true    5<8 返回 true
x >= y    大于等于    如果 x 大于或者等于 y,则返回 true    5>=8 返回 false
x <= y    小于等于    如果 x 小于或者等于 y,则返回 true    5<=8 返回 true

15丶PHP 逻辑运算符
运算符    名称    描述    实例x and y    与    如果 x 和 y 都为 true,则返回 true x=6 y=3 (x < 10 and y > 1) 返回 truex or y    或    如果 x 和 y 至少有一个为 true,则返回 true    x=6 y=3 (x==6 or y==5) 返回 true
x xor y    异或    如果 x 和 y 有且仅有一个为 true,则返回 true x=6 y=3 (x==6 xor y==3) 返回 false //*需要注意一下
x && y    与    如果 x 和 y 都为 true,则返回 true x=6 y=3 (x < 10 && y > 1) 返回 true
x || y    或    如果 x 和 y 至少有一个为 true,则返回 true    x=6 y=3(x==5 || y==5) 返回 false
! x    非    如果 x 不为 true,则返回 true    x=6 y=3 !(x==y) 返回 true
*boolean 型 值为
true 浏览器会输出1
false 浏览器不会输出

16丶PHP 数组运算符
运算符    名称    描述
x + y    集合    x 和 y 的集合
x == y    相等    如果 x 和 y 具有相同的键/值对,则返回 true
x === y    恒等    如果 x 和 y 具有相同的键/值对,且顺序相同类型相同,则返回 true
x != y    不相等    如果 x 不等于 y,则返回 true
x <> y    不相等    如果 x 不等于 y,则返回 true
x !== y    不恒等    如果 x 不等于 y,则返回 true

17丶PHP三元运算符
另一个条件运算符是"?:"(或三元)运算符 。
语法格式
(expr1) ? (expr2) : (expr3)
对 expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3。
自 PHP 5.3 起,可以省略三元运算符中间那部分。表达式 expr1 ?: expr3 在 expr1 求值为 TRUE 时返回 expr1,否则返回 expr3。

18丶在 PHP 中创建数组
在 PHP 中,array() 函数用于创建数组:
array();
在 PHP 中,有三种类型的数组:
数值数组 - 带有数字 ID 键的数组
关联数组 - 带有指定的键的数组,每个键关联一个值
多维数组 - 包含一个或多个数组的数组
PHP 数值数组
这里有两种创建数值数组的方法:
自动分配 ID 键(ID 键总是从 0 开始):
$cars=array("Volvo","BMW","Toyota");
人工分配 ID 键:
$cars[0]="Volvo";
$cars[1]="BMW";
$cars[2]="Toyota";
获取数组的长度 - count() 函数
count() 函数用于返回数组的长度(元素的数量):

19丶PHP 关联数组
关联数组是使用您分配给数组的指定的键的数组。
这里有两种创建关联数组的方法:
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
or:
$age[‘Peter‘]="35";
$age[‘Ben‘]="37";
$age[‘Joe‘]="43";
随后可以在脚本中使用指定的键:
遍历关联数组
遍历并打印关联数组中的所有值,您可以使用 foreach 循环,如下所示:
实例
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
?>

20丶PHP - 数组排序函数
在本章中,我们将一一介绍下列 PHP 数组排序函数:
sort() - 对数组进行升序排列
rsort() - 对数组进行降序排列
asort() - 根据关联数组的值,对数组进行升序排列
ksort() - 根据关联数组的键,对数组进行升序排列
arsort() - 根据关联数组的值,对数组进行降序排列
krsort() - 根据关联数组的键,对数组进行降序排列
-------------------------------------------------------
current()    返回数组中的当前元素。
each()    返回数组中当前的键/值对。//已经过时了

21丶PHP 超级全局变量
PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。
你不需要特别说明,就可以在函数及类中使用。
PHP 超级全局变量列表:
    $GLOBALS
    $_SERVER
    $_REQUEST
    $_POST
    $_GET
    $_FILES
    $_ENV
    $_COOKIE
    $_SESSION

22丶foreach 循环用于遍历数组。
语法
foreach ($array as $value)
{
 要执行代码;
}
每进行一次循环,当前数组元素的值就会被赋值给 $value 变量(数组指针会逐一地移动),
在进行下一次循环时,您将看到数组中的下一个值。
foreach遍历数组,as前面必须是已经定义并初始化了的数组,as后面是要被赋予值的变量

23丶PHP 函数
在本章中,我们将为您讲解如何创建自己的函数。
如要在页面加载时执行脚本,您可以把它放到函数里。
函数是通过调用函数来执行的。
你可以在页面的任何位置调用函数。
创建 PHP 函数
函数是通过调用函数来执行的。
语法
function functionName()
{
要执行的代码;
}
PHP 函数准则:
    函数的名称应该提示出它的功能
    函数名称以字母或下划线开头(不能以数字开头)
PHP 函数 - 添加参数
为了给函数添加更多的功能,我们可以添加参数。参数类似变量。
参数就在函数名称后面有一个括号内指定。
PHP 函数 - 返回值
如需让函数返回一个值,请使用 return 语句。

24丶PHP 向它运行的任何脚本提供了大量的预定义常量。
不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。
有八个魔术常量它们的值随着它们在代码中的位置改变而改变。
例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写,如下:
__LINE__
文件中的当前行号。
实例:
<?php
echo ‘这是第 “ ‘  . __LINE__ . ‘ ” 行‘;
?>
以上实例输出结果为:
这是第 “ 2 ” 行
__FILE__
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),
而在此之前的版本有时会包含一个相对路径。
实例:
<?php
echo ‘该文件位于 “ ‘  . __FILE__ . ‘ ” ‘;
?>
以上实例输出结果为:
该文件位于 “ E:\wamp\www\test\index.php ”
__DIR__
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)
实例:
<?php
echo ‘该文件位于 “ ‘  . __DIR__ . ‘ ” ‘;
?>
以上实例输出结果为:
该文件位于 “ E:\wamp\www\test ”
__FUNCTION__
函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
实例:
<?php
function test() {
echo  ‘函数名为:‘ . __FUNCTION__ ;
}
test();
?>
以上实例输出结果为:
函数名为:test
__CLASS__
类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。
在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。
注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。
实例:
<?php
class test {
function _print() {
echo ‘类名为:‘  . __CLASS__ . "<br>";
echo  ‘函数名为:‘ . __FUNCTION__ ;
}
}
$t = new test();
$t->_print();
?>
以上实例输出结果为:
类名为:test
函数名为:_print
__TRAIT__
Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。
Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。
其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
<?php
class Base {
    public function sayHello() {
        echo ‘Hello ‘;
    }
}
trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo ‘World!‘;
    }
}
class MyHelloWorld extends Base {
    use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
以上例程会输出:
Hello World!
__METHOD__
类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
实例:
<?php
function test() {
echo  ‘函数名为:‘ . __METHOD__ ;
}
test();
?>
以上实例输出结果为:
函数名为:test
__NAMESPACE__
当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。
实例:
<?php
namespace MyProject;
echo ‘命名空间为:"‘, __NAMESPACE__, ‘"‘; // 输出 "MyProject"
?>
以上实例输出结果为:
命名空间为:"MyProject"

25丶在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,
对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。
在现实世界里我们所面对的事情都是对象,如计算机、电视机、自行车等。
对象的主要三个特性:
    对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为。
    对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型。
    对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同。
比如 Animal(动物) 是一个抽象类,我们可以具体到一只狗跟一只羊,而狗跟羊就是具体的对象,
他们有颜色属性,可以写,可以跑等行为状态。
面向对象内容
    类 ? 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
    对象 ? 是类的实例。
    成员变量 ? 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,
    该变量即可称为对象的属性。
    成员函数 ? 定义在类的内部,可用于访问对象的数据。
    继承 ? 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。
    在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,
    并加入若干新的内容。
    父类 ? 一个类被其他类继承,可将该类称为父类,或基类,或超类。
    子类 ? 一个类继承其他类称为子类,也可称为派生类。
    多态 ? 多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。
    不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
    重载 ? 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,
    互相称之为重载函数或者方法。
    抽象性 ? 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。
    一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。
    任何类的划分都是主观的,但必须与具体的应用有关。
    封装 ? 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
    构造函数 ? 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
    析构函数 ? 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),
    系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

26丶变量 $this 代表自身的对象。
PHP 构造函数
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,
总与new运算符一起使用在创建对象的语句中。
PHP 5 允行开发者在一个类中定义一个方法作为构造函数,语法格式如下:
void __construct ([ mixed $args [, $... ]] )
在上面的例子中我们就可以通过构造方法来初始化 $url 和 $title 变量:
function __construct( $par1, $par2 ) {
   $this->url = $par1;
   $this->title = $par2;
}
析构函数
析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,其语法格式如下:
void __destruct ( void )
方法重写
如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
访问控制
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
    public(公有):公有的类成员可以在任何地方被访问。
    protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
    private(私有):私有的类成员则只能被其定义所在的类访问。
属性的访问控制
类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。
接口
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。
要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。
类可以实现多个接口,用逗号来分隔多个接口的名称。
常量
可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
自PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字(如 self,parent 或 static)。
抽象类
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
定义为抽象的类不能被实例化。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。
例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,
则两者的声明并无冲突。
Static 关键字
声明类属性或方法为 static(静态),就可以不实例化类而直接访问。
静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
静态属性不可以由对象通过 -> 操作符来访问。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。
Final 关键字
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
调用父类构造方法
PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct()

27丶 <select multiple="multiple" name="q[]">  multiple="multiple"设置下拉列表框可多选
表单验证
我们应该尽可能的对用户的输入进行验证(通过客户端脚本)。浏览器验证速度更快,并且可以减轻服务器的压力。
如果用户输入需要插入数据库,您应该考虑使用服务器验证。在服务器验证表单的一种好的方式是,
把表单的数据传给当前页面(异步提交的方式更好),而不是跳转到不同的页面。
这样用户就可以在同一张表单页面得到错误信息。用户也就更容易发现错误了。
什么是 htmlspecialchars()方法?
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体,一般用于GET,htmlspecialchars($_GET[""]) 。
预定义的字符是:
    & (和号) 成为 &amp;
    " (双引号) 成为 &quot;
    ‘ (单引号) 成为 &#039;
    < (小于) 成为 &lt;
    > (大于) 成为 &gt;
什么是 $_SERVER["PHP_SELF"] 变量?
$_SERVER["PHP_SELF"]是超级全局变量,返回当前正在执行脚本的文件名,与 document root相关。
所以, $_SERVER["PHP_SELF"] 会发送表单数据到当前页面,而不是跳转到不同的页面。
PHP表单中需引起注重的地方?
$_SERVER["PHP_SELF"] 变量有可能会被黑客使用!
当黑客使用跨网站脚本的HTTP链接来攻击时,$_SERVER["PHP_SELF"]服务器变量也会被植入脚本。
原因就是跨网站脚本是附在执行文件的路径后面的,因此$_SERVER["PHP_SELF"]的字符串就会包含HTTP链接后面的JavaScript程序代码。
Note    XSS又叫 CSS (Cross-Site Script) ,跨站脚本攻击。恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,
嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
指定以下表单文件名为 "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
现在,我们使用URL来指定提交地址 "test_form.php",以上代码修改为如下所示:
<form method="post" action="test_form.php">
这样做就很好了。
但是,考虑到用户会在浏览器地址栏中输入以下地址:
http://www.php.cn/test_form.php/%22%3E%3Cscript%3Ealert(‘hacked‘)%3C/script%3E
以上的 URL 中,将被解析为如下代码并执行:
<form method="post" action="test_form.php/"><script>alert(‘hacked‘)</script>
代码中添加了 script 标签,并添加了alert命令。 当页面载入时会执行该Javascript代码(用户会看到弹出框)。
 这仅仅只是一个简单的实例来说明PHP_SELF变量会被黑客利用。
$_SERVER["PHP_SELF"] 可以通过 htmlspecialchars() 函数来避免被利用。

function test_input($data)
{
   $data = trim($data);
   $data = stripslashes($data);
   $data = htmlspecialchars($data);
   return $data;
}
1. 使用 PHP trim() 函数去除用户输入数据中不必要的字符 (如:空格,tab,换行)。
2. 使用PHP stripslashes()函数去除用户输入数据中的反斜杠 (\)
注意我们在执行以上脚本时,会通过$_SERVER["REQUEST_METHOD"]来检测表单是否被提交 。
如果 REQUEST_METHOD 是 POST, 表单将被提交 - 数据将被验证。如果表单未提交将跳过验证并显示空白。
在以上实例中使用输入项都是可选的,即使用户不输入任何数据也可以正常显示。


$_GET 变量
预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值。
从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。
$_POST 变量
预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值。
从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。
何时使用 method="post"?
从带有 POST 方法的表单发送的信息,对任何人都是不可见的,并且对发送信息的量也没有限制。
然而,由于变量不显示在 URL 中,所以无法把页面加入书签。
PHP $_REQUEST 变量
预定义的 $_REQUEST 变量包含了 $_GET、$_POST 和 $_COOKIE 的内容。
$_REQUEST 变量可用来收集通过 GET 和 POST 方法发送的表单数据。

28丶一个数组中的值可以是另一个数组,另一个数组的值也可以是一个数组。依照这种方式,我们可以创建二维或者三维数组:
实例
<?php
// 二维数组:
$cars = array
(
    array("Volvo",100,96),
    array("BMW",60,59),
    array("Toyota",110,100)
);
print_r($cars);
?>

29丶PHP date() 函数用于格式化时间/日期。
PHP date() 函数
PHP date() 函数可把时间戳格式化为可读性更好的日期和时间。
Tip时间戳是一个字符序列,表示一定的事件发生的日期/时间。
语法
string date ( string $format [, int $timestamp ] )
参数    描述
format    必需。规定时间戳的格式。
timestamp    可选。规定时间戳。默认是当前的日期和时间。
PHP Date() - 格式化日期
date() 函数的第一个必需参数 format 规定了如何格式化日期/时间。
这里列出了一些可用的字符:
    d - 代表月中的天 (01 - 31)
    m - 代表月 (01 - 12)
    Y - 代表年 (四位数)
如需了解 format 参数中可用的所有字符列表,请查阅我们的 PHP Date 参考手册,date() 函数。
可以在字母之间插入其他字符,比如 "/"、"." 或者 "-",这样就可以增加附加格式了:
<?php
echo date("Y/m/d") . "<br>";
echo date("Y.m.d") . "<br>";
echo date("Y-m-d");
?>
上面代码的输出如下所示:
2016/05/11
2016.05.11
2016-05-11
格式字串可以识别以下 format 参数的字符串format 字符    说明    返回值例子
日    ---    ---
d    月份中的第几天,有前导零的 2 位数字    01 到 31
j    月份中的第几天,没有前导零    1 到 31
星期    ---    ---
W    ISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的)    例如:42(当年的第 42 周)
月    ---    ---
m    数字表示的月份,有前导零    01 到 12
M    三个字母缩写表示的月份    Jan 到 Dec
n    数字表示的月份,没有前导零    1 到 12
t    给定月份所应有的天数    28 到 31
年    ---    ---
Y    4 位数字完整表示的年份    例如:1999 或 2003
y    2 位数字表示的年份    例如:99 或 03
时间    ---    ---
a    小写的上午和下午值    am 或 pm
A    大写的上午和下午值    AM 或 PM
h    小时,12 小时格式,有前导零    01 到 12
s    秒数,有前导零    00 到 59>
u    毫秒 (PHP 5.2.2 新加)。需要注意的是            date() 函数总是返回            000000 因为它只接受 integer            参数, 而 DateTime::format() 才支持毫秒。    示例: 654321
时区    ---    ---
e    时区标识(PHP 5.1.0 新加)    例如:UTC,GMT,Atlantic/Azores
I    是否为夏令时    如果是夏令时为 1,否则为 0
O    与格林威治时间相差的小时数    例如:+0200
完整的日期/时间    ---    ---
c    ISO 8601 格式的日期(PHP 5 新加)    2004-02-12T15:19:21+00:00
r    RFC 822 格式的日期    例如:Thu, 21 Dec 2000 16:01:07 +0200
U    从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数    参见 time()
完整的 PHP Date 参考手册
如需查看所有日期函数的完整参考手册,请访问我们的 完整的 PHP Date 参考手册。
该参考手册提供了每个函数的简要描述和应用实例!
gettimeofday()    返回当前时间。

mktime(hour,minute,second,month,day,year)//时分秒月天年(Y-m-d h:i:sa)
下面的例子使用 mktime() 函数中的一系列参数来创建日期和时间:
实例
<?php
date_default_timezone_set("Asia/ShangHai");//设置默认位置
echo "现在时间是 " . date("Y.m.d.h:i:sa");//获取当前时间
$d=mktime(9, 12, 31, 6, 10, 2015);
echo "创建日期是 " . date("Y-m-d h:i:sa", $d);
?>

30丶PHP include 和 require 语句
在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。
include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。
include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:
    require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。
    include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。
因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。
否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。
这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。
包含文件省去了大量的工作。这意味着您可以为所有网页创建标准页头、页脚或者菜单文件。
然后,在页头需要更新时,您只需更新这个页头包含文件即可。
语法
include ‘filename‘;
或者
require ‘filename‘;

31丶打开文件
fopen() 函数用于在 PHP 中打开文件。
此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件:
<html>
<body>
<?php
$file=fopen("welcome.txt","r");
?>
</body>
</html>
文件可能通过下列模式来打开:
模式    描述
r    只读。在文件的开头开始。
r+    读/写。在文件的开头开始。
w    只写。打开并清空文件的内容;如果文件不存在,则创建新文件。
w+    读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。
a    追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。
a+    读/追加。通过向文件末尾写内容,来保持文件内容。
x    只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
x+    读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
注释:如果 fopen() 函数无法打开指定文件,则返回 0 (false)。
实例
如果 fopen() 函数不能打开指定的文件,下面的实例会生成一段消息:
<html>
<body>
<?php
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
?>
</body>
</html>
关闭文件
fclose() 函数用于关闭打开的文件:
<?php
$file = fopen("test.txt","r");
//执行一些代码
fclose($file);
?>
检测文件末尾(EOF)
feof() 函数检测是否已到达文件末尾(EOF)。
在循环遍历未知长度的数据时,feof() 函数很有用。
注释:在 w 、a 和 x 模式下,您无法读取打开的文件!
if (feof($file)) echo "文件结尾";
逐行读取文件
fgets() 函数用于从文件中逐行读取文件。
注释:在调用该函数之后,文件指针会移动到下一行。
实例
下面的实例逐行读取文件,直到文件末尾为止:
<?php
$file = fopen("welcome.txt", "r") or exit("无法打开文件!");
// 读取文件每一行,直到文件结尾
while(!feof($file))
  {
    echo fgets($file). "<br>";
  }
fclose($file);
?>
逐字符读取文件
fgetc() 函数用于从文件中逐字符地读取文件。
注释:在调用该函数之后,文件指针会移动到下一个字符。
实例
下面的实例逐字符地读取文件,直到文件末尾为止:
<?php
$file=fopen("welcome.txt","r") or exit("无法打开文件!");
while (!feof($file))
  {
    echo fgetc($file);
  }
fclose($file);
?>
PHP Filesystem 参考手册
如需查看 PHP 文件系统函数的完整参考手册,请访问我们的PHP Filesystem 参考手册。
注意:windows文件操作支持的是GBK格式,在PHP中对文件进行操作前要将非GBK文件通过iconv()函数进行转码操作;
$source = iconv("UTF-8","GBK//IGNORE",‘?F:\File\qaq.txt‘);

32丶cookie 常用于识别用户。
Cookie 是什么?
cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,
这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
如何创建 Cookie?
setcookie() 函数用于设置 cookie。
注释:setcookie() 函数必须位于 <html> 标签之前。
语法
setcookie(name, value, expire, path, domain);
实例 1
在下面的例子中,我们将创建名为 "user" 的 cookie,并为它赋值 "php"。我们也规定了此 cookie 在一小时后过期:
<?php
setcookie("user", "php", time()+3600);
?>
如何取回 Cookie 的值?
PHP 的 $_COOKIE 变量用于取回 cookie 的值。
在下面的实例中,我们取回了名为 "user" 的 cookie 的值,并把它显示在了页面上:
<?php
// 输出 cookie 值
echo $_COOKIE["user"];
// 查看所有 cookie
print_r($_COOKIE);
?>
**我们使用 isset() 函数来确认是否已设置了 cookie

33丶PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,
并且对于应用程序中的所有页面都是可用的。
PHP Session 变量
您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它。这很像一次对话(Session)。计算机知道您是谁。
它清楚您在何时打开和关闭应用程序。然而,在因特网上问题出现了:由于 HTTP 地址无法保持状态,
Web 服务器并不知道您是谁以及您做了什么。
PHP session 解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。
然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。
Session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,
或者通过 URL 进行传导。
开始 PHP Session
在您把用户信息存储到 PHP session 中之前,首先必须启动会话。
注释:session_start() 函数必须位于 <html> 标签之前
存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量
unset() 函数用于释放指定的 session 变量
注释:session_destroy() 将重置 session,您将失去所有已存储的 session 数据

34丶&这是引用符号,引用的意思是:不同的名字访问同一个变量内容。php的引用(就是在变量或者函数、对象等前面加上&符号)。
PHP 的引用允许你用两个变量来指向同一个内容.
<?
$a="AB";
$b =&$a;
echo $a;//这里输出:AB
echo $b;//这里输出:AB
$b="EF";
echo $a;//这里$a的值变为EF 所以输出EF
echo $b;//这里输出EF
?>
exit(),die()和trigger_error()区别?
首先die()同等于exit(),两者如果执行都会中止PHP程序,而且在死之前都可以留句遗言!
exit()和die()唯一不同的是exit()可以返回0--254状态值,0表示返回成功。trigger_error()生成一个用户警告来代替,
使程序更具有灵活性.例如:trigger_error("Cannotfindfile",E_USER_ERROR);
使用trigger_error()函数来替代die(),你的代码在处理错误上会更具优势,对于客户程序员来说更易于处理错误。

35丶PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入。
什么是 PHP 过滤器?
PHP 过滤器用于验证和过滤来自非安全来源的数据。
测试、验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。
PHP 的过滤器扩展的设计目的是使数据过滤更轻松快捷。
为什么使用过滤器?
几乎所有的 Web 应用程序都依赖外部的输入。这些数据通常来自用户或其他应用程序(比如 web 服务)。
通过使用过滤器,您能够确保应用程序获得正确的输入类型。
您应该始终对外部数据进行过滤!
输入过滤是最重要的应用程序安全课题之一。
什么是外部数据?
    来自表单的输入数据
    Cookies
    Web services data
    服务器变量
    数据库查询结果
函数和过滤器
如需过滤变量,请使用下面的过滤器函数之一:
    filter_var() - 通过一个指定的过滤器来过滤单一的变量
    filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
    filter_input - 获取一个输入变量,并对它进行过滤
    filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤
使用 Filter Callback
通过使用 FILTER_CALLBACK 过滤器,可以调用自定义的函数,把它作为一个过滤器来使用。
这样,我们就拥有了数据过滤的完全控制权。
您可以创建自己的自定义函数,也可以使用已存在的 PHP 函数。
将您准备用到的过滤器的函数,按指定选项的规定方法进行规定。在关联数组中,带有名称 "options"。
在下面的实例中,我们使用了一个自定义的函数把所有 "_" 转换为空格:
<?php
function convertSpace($string)
{
return str_replace("_", ".", $string);
}
$string = "www_php_cn!";
echo filter_var($string, FILTER_CALLBACK,
array("options"=>"convertSpace"));
?>
上面代码的结果如下所示:
实例解释
上面的实例把所有 "_" 转换成 "." :
    创建一个把 "_" 替换为 "." 的函数
    调用 filter_var() 函数,它的参数是 FILTER_CALLBACK 过滤器以及包含我们的函数的数组
36丶php--------对象(object) 与 数组(array) 的转换
/**
 * 数组 转 对象
 *
 * @param array $arr 数组
 * @return object
 */
function array_to_object($arr) {
    if (gettype($arr) != ‘array‘) {
        return;
    }
    foreach ($arr as $k => $v) {
        if (gettype($v) == ‘array‘ || getType($v) == ‘object‘) {
            $arr[$k] = (object)array_to_object($v);
        }
    }
 
    return (object)$arr;
}
 
/**
 * 对象 转 数组
 *
 * @param object $obj 对象
 * @return array
 */
function object_to_array($obj) {
    $obj = (array)$obj;
    foreach ($obj as $k => $v) {
        if (gettype($v) == ‘resource‘) {
            return;
        }
        if (gettype($v) == ‘object‘ || gettype($v) == ‘array‘) {
            $obj[$k] = (array)object_to_array($v);
        }
    }
 
    return $obj;
}

37丶PHP中echo,print(),print_r()的区别是什么?
echo
可以一次输出多个值,多个值之间用逗号分隔。echo是语言结构(language construct),而并不是真正的函数,
因此不能作为表达式的一部分使用。
print()
函数print()打印一个值(它的参数),如果字符串成功显示则返回true,否则返回false。
print_r()
可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示,并以Array开头。
但print_r()输出布尔值和NULL的结果没有意义,因为都是打印"\n"。因此用var_dump()函数更适合调试。

38丶Validating 和 Sanitizing
有两种过滤器:
Validiting 过滤器:
    用于验证用户输入
    严格的格式规则(比如 URL 或 E-Mail 验证)
    如果成功则返回预期的类型,如果失败则返回 FALSE
Sanitizing 过滤器:
    用于允许或禁止字符串中指定的字符
    无数据格式规则
    始终返回字符串
选项和标志
选项和标志用于向指定的过滤器添加额外的过滤选项。
不同的过滤器有不同的选项和标志。

39丶使用 Filter Callback
通过使用 FILTER_CALLBACK 过滤器,可以调用自定义的函数,把它作为一个过滤器来使用。
这样,我们就拥有了数据过滤的完全控制权。
您可以创建自己的自定义函数,也可以使用已存在的 PHP 函数。
将您准备用到的过滤器的函数,按指定选项的规定方法进行规定。在关联数组中,带有名称 "options"。
在下面的实例中,我们使用了一个自定义的函数把所有 "_" 转换为空格:
<?php
function convertSpace($string)
{
return str_replace("_", ".", $string);
}
$string = "www_php_cn!";
echo filter_var($string, FILTER_CALLBACK,
array("options"=>"convertSpace"));
?>
上面代码的结果如下所示:
实例解释
上面的实例把所有 "_" 转换成 "." :
    创建一个把 "_" 替换为 "." 的函数
    调用 filter_var() 函数,它的参数是 FILTER_CALLBACK 过滤器以及包含我们的函数的数组

40丶PHP连接数据库有两种方法
MYSQLi和PDO
我是该用 MySQLi ,还是 PDO?
如果你需要一个简短的回答,即 "你习惯哪个就用哪个"。
MySQLi 和 PDO 有它们自己的优势:
PDO 应用在 12 种不同数据库中, MySQLi 只针对 MySQL 数据库。
所以,如果你的项目需要在多种数据库中切换,建议使用 PDO ,这样你只需要修改连接字符串和部门查询语句即可。 使用 MySQLi, 如果不同数据库,你需要重新编写所有代码,包括查询。
两者都是面向对象, 但 MySQLi 还提供了 API 接口。
两者都支持预处理语句。 预处理语句可以防止 SQL 注入,对于 web 项目的安全性是非常重要的。

41丶使用 PDO:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
try {
    $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
    // 设置 PDO 错误模式为异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "CREATE DATABASE myDBPDO";
    // 使用 exec() ,因为没有结果返回
    $conn->exec($sql);
    echo "数据库创建成功<br>";
}
catch(PDOException $e)
{
    echo $sql . "<br>" . $e->getMessage();
}

$conn = null;
?>
提示: 使用 PDO 的最大好处是在数据库查询过程出现问题时可以使用异常类来 处理问题。
如果  try{ } 代码块出现异常,脚本会停止执行并会跳到第一个 catch(){ } 代码块执行代码。
 在以上捕获的代码块中我们输出了 SQL 语句并生成错误信息。
执行多条数据库操作时要用到事务
  $conn->beginTransaction();  // 开始事务
   /*要执行的数据操作  */
  $conn->commit();//提交事务
   $conn->rollback();// 如果执行失败事务回滚,如果没有执行开始事务的操作,那么事务回滚会失败

42丶PDO 中的预处理语句
以下实例我们在 PDO 中使用了预处理语句并绑定参数:
使用预编译更方便多条sql语句的操作
实例 (PDO 使用预处理语句)
$conn = new PDO("mysql:host=$server;dbname=test;charset=utf8", $name, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    $smt= $conn->prepare("insert into teacher(name,age) values (:name,:age)");//预处理
    $smt->bindParam(":name",$name);//绑定行
    $smt->bindParam(":age",$age);
    $name="亚索";//给参数赋值
    $age=17;
    $smt->execute();//执行预编译的sql语句
    $name="云韵";//给参数赋值
    $age=19;
    $smt->execute();//执行预编译的sql语句
   $sql="insert into teacher(name,age) value (‘剑姬‘,‘21‘)";//增
   $sql="delete from student where sno=‘31‘";//删
   $sql="update student set sname=‘寒冰‘,sage=‘18‘ where sno=‘32‘";//改
   $stm=$conn->prepare("select * from student where sage=:sage");/查
   $stm->bindParam(":sage",$sage);
   $sage=17;
   $stm->execute();
都采用预编译比较好,预处理语句对于防止 MySQL 注入是非常有用的。

43丶XML 是什么?
XML 用于描述数据,其焦点是数据是什么。XML 文件描述了数据的结构。

44丶DOM XML 解析器函数是 PHP 核心的组成部分。无需安装就可以使用这些函数。
XML 文件
下面的 XML 文件将应用在我们的实例中:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don‘t forget me this weekend!</body>
</note>
加载和输出 XML
我们需要初始化 XML 解析器,加载 XML,并把它输出:
实例
<?php
$xmlDoc = new DOMDocument();
$xmlDoc->load("note.xml");
print $xmlDoc->saveXML();
?>
以上代码将输出:
ToveJaniReminder Don‘t forget me this weekend!
如果您在浏览器窗口中查看源代码,会看到下面的 HTML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don‘t forget me this weekend!</body>
</note>
上面的实例创建了一个 DOMDocument-Object,并把 "note.xml" 中的 XML 载入这个文档对象中。
saveXML() 函数把内部 XML 文档放入一个字符串,这样我们就可以输出它。
遍历 XML
我们要初始化 XML 解析器,加载 XML,并遍历 <note> 元素的所有元素:
实例
<?php
$xmlDoc = new DOMDocument();
$xmlDoc->load("note.xml");
$x = $xmlDoc->documentElement;
foreach ($x->childNodes AS $item)
  {
  print $item->nodeName . " = " . $item->nodeValue . "<br>";
  }
?>
以上代码将输出:
#text =
to = Tove
#text =
from = Jani
#text =
heading = Reminder
#text =
body = Don‘t forget me this weekend!
#text =

45丶PHP SimpleXML 处理最普通的 XML 任务,其余的任务则交由其它扩展处理。
什么是 PHP SimpleXML?
SimpleXML 是 PHP 5 中的新特性。
SimpleXML 扩展提供了一种获取 XML 元素的名称和文本的简单方式。
与 DOM 或 Expat 解析器相比,SimpleXML 仅仅用几行代码就可以从 XML 元素中读取文本数据。
SimpleXML 可把 XML 文档(或 XML 字符串)转换为对象,比如:
    元素被转换为 SimpleXMLElement 对象的单一属性。当同一级别上存在多个元素时,它们会被置于数组中。
    属性通过使用关联数组进行访问,其中的索引对应属性名称。
    元素内部的文本被转换为字符串。如果一个元素拥有多个文本节点,则按照它们被找到的顺序进行排列。
当执行类似下列的基础任务时,SimpleXML 使用起来非常快捷:
    读取/提取 XML 文件/字符串的数据
    编辑文本节点或属性
然而,在处理高级 XML 时,比如命名空间,最好使用 Expat 解析器或 XML DOM。
安装
从 PHP 5 开始,SimpleXML 函数是 PHP 核心的组成部分。无需安装就可以使用这些函数。
PHP SimpleXML 实例
假设我们有如下的 XML 文件,"note.xml":
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don‘t forget me this weekend!</body>
</note>
现在我们想要输出上面的 XML 文件的不同信息:
实例 1
输出 $xml 变量(是 SimpleXMLElement 对象)的键和元素:
<?php
$xml=simplexml_load_file("note.xml");
print_r($xml);
?>
以上代码将输出:
SimpleXMLElement Object ( [to] => Tove [from] => Jani [heading] => Reminder
[body] => Don‘t forget me this weekend! )
实例 2
输出 XML 文件中每个元素的数据:
<?php
$xml=simplexml_load_file("note.xml");
echo $xml->to . "<br>";
echo $xml->from . "<br>";
echo $xml->heading . "<br>";
echo
$xml->body;
?>
以上代码将输出:
Tove
Jani
Reminder
Don‘t forget me this weekend!
实例 3
输出每个子节点的元素名称和数据:
<?php
$xml=simplexml_load_file("note.xml");
echo $xml->getName() . "<br>";
foreach($xml->children() as $child)
  {
  echo $child->getName() . ": " . $child . "<br>";
  }
?>
以上代码将输出:
note
to: Tove
from: Jani
heading: Reminder
body: Don‘t forget me this weekend!

46丶PHP AJAX
1. XMLHttpRequest 对象的相关方法
1.1 XHR创建对象
var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
1.2 向服务端发送请求
xmlhttp.open("GET","test1.txt",true);   //规定请求的类型、URL 以及是否异步处理请求。
xmlhttp.send();    //将请求发送到服务器。
方法参数解释如下:
open(method,url,async)
    method:请求的类型;GET 或 POST
    url:文件在服务器上的位置
    async:true(异步)或 false(同步)
send(string)
    string:仅用于 POST 请求
如果需要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法中规定您希望发送的数据:
xmlhttp.setRequestHeader("content-type","text/xml;charset=utf-8");    //向请求中添加 HTTP 头
方法参数解释如下:
setRequestHeader(header,value)
    header: 规定头的名称
    value: 规定头的值
1.3 服务器响应
如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。
    responseText 获得字符串形式的响应数据。
    responseXML 获得 XML 形式的响应数据。
1.4 onreadystatechange 事件
当请求被发送到服务器时,我们需要执行一些基于响应的任务。每当 readyState 改变时,就会触发 onreadystatechange 事件。
    readyState:存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
    status:响应的HTTP状态码。
通过之前的Ajax调用公网服务的代码可以具体的了解XMLHttpRequest对象的使用。
复制代码
var getXmlHttpRequest = function () {
    try{
     //主流浏览器提供了XMLHttpRequest对象
         return new XMLHttpRequest();
    }catch(e){
     //低版本的IE浏览器没有提供XMLHttpRequest对象,IE6以下
     //所以必须使用IE浏览器的特定实现ActiveXObject
         return new ActiveXObject("Microsoft.XMLHTTP");
    }
};
//创建XMLHttpRequest对象
var xhr = getXmlHttpRequest();
//打开连接
xhr.open("post","http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx",true);
//设置数据类型
xhr.setRequestHeader("content-type","text/xml;charset=utf-8");
//设置回调函数
xhr.onreadystatechange=function(){
//判断是否发送成功和判断服务端是否响应成功
if(4 == xhr.readyState && 200 == xhr.status){
    alert(xhr.responseText);
  }
}
//组织SOAP协议数据 篇幅原因,此处信息省略
var soapXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>····
   ····";        
//发送数据
xhr.send(soapXML);
2. xmlhttp.readyState==4 && xmlhttp.status==200解析
2.1 readyState(状态值)和status(状态码)的区别
readyState,是指运行AJAX所经历过的几种状态,无论访问是否成功都将响应的步骤,可以理解成为AJAX运行步骤,使用“ajax.readyState”获得
status,是指无论AJAX访问是否成功,由HTTP协议根据所提交的信息,服务器所返回的HTTP头信息代码,使用“ajax.status”获得
总体理解:可以简单的理解为state代表一个整体的状态。而status是这个大的state下面具体的小的状态。
2.2 什么是readyState
readyState是XMLHttpRequest对象的一个属性,用来标识当前XMLHttpRequest对象处于什么状态。
readyState总共有5个状态值,分别为0~4,每个值代表了不同的含义
0:初始化,XMLHttpRequest对象还没有完成初始化
1:载入,XMLHttpRequest对象开始发送请求
2:载入完成,XMLHttpRequest对象的请求发送完成
3:解析,XMLHttpRequest对象开始读取服务器的响应
4:完成,XMLHttpRequest对象读取服务器响应结束
2.3 什么是status
status是XMLHttpRequest对象的一个属性,表示响应的HTTP状态码
在HTTP1.1协议下,HTTP状态码总共可分为5大类
1xx:信息响应类,表示接收到请求并且继续处理
2xx:处理成功响应类,表示动作被成功接收、理解和接受
3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理
4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
5xx:服务端错误,服务器不能正确执行一个正确的请求
 
100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTTP协议版本
200——交易成功
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的GET请求
300——请求的资源可在多处得到
301——删除请求数据
302——在其他地址发现了请求数据
303——建议客户访问其他URL或访问方式
304——客户端已经执行了GET,但文件未变化
305——请求的资源必须从服务器指定的地址得到
306——前一版本HTTP中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除
400——错误请求,如语法错误
401——请求授权失败
402——保留有效ChargeTo头响应
403——请求不允许
404——没有发现文件、查询或URl
405——用户在Request-Line字段定义的方法不允许

406——根据用户发送的Accept拖,请求资源不可访问
407——类似401,用户必须首先在代理服务器上得到授权
408——客户端没有在用户指定的饿时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源且无进一步的参考地址
411——服务器拒绝用户定义的Content-Length属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器允许的大小
414——请求的资源URL长于服务器允许的长度
415——请求资源不支持请求项目格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求
500——服务器产生内部错误
501——服务器不支持请求的函数
502——服务器暂时不可用,有时是为了防止发生系统过载
503——服务器过载或暂停维修
504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长
505——服务器不支持或拒绝支请求头中指定的HTTP版本

2.4 思考问题:为什么onreadystatechange的函数实现要同时判断readyState和status呢?
第一种思考方式:只使用readyState
var getXmlHttpRequest = function () {
  if (window.XMLHttpRequest) {
    return new XMLHttpRequest();
  }
  else if (window.ActiveXObject) {
    return new ActiveXObject("Microsoft.XMLHTTP");
  }
};
var xhr = getXmlHttpRequest();
xhr.open("get", "1.txt", true);
xhr.send();
xhr.onreadystatechange = function () {
  if (xhr.readyState == 4) {
    alert(xhr.responseText);
  }
};

服务响应出错了,但还是返回了信息,这并不是我们想要的结果
如果返回不是200,而是404或者500,由于只使用readystate做判断,它不理会放回的结果是200、404还是500,只要响应成功返回了,就执行接下来的javascript代码,结果将造成各种不可预料的错误。所以只使用readyState判断是行不通的。
第二种思考方式:只使用status判断
var getXmlHttpRequest = function () {
  try{
    return new XMLHttpRequest();
  }catch(e){
    return new ActiveXObject("Microsoft.XMLHTTP");
  }
};
var xhr = getXmlHttpRequest();
xhr.open("get", "1.txt", true);
xhr.send();
xhr.onreadystatechange = function () {
    if (xhr.status == 200) {
        alert("readyState=" + xhr.readyState + xhr.responseText);
    }
};
事实上,结果却不像预期那样。响应码确实是返回了200,但是总共弹出了3次窗口!第一次是“readyState=2”的窗口,
第二次是“readyState=3”的窗口,
第三次是“readyState=4”的窗口。由此,可见onreadystatechange函数的执行不是只在readyState变为4的时候触发的,
而是readyState(2、3、4)的每次变化都会触发,所以就出现了前面说的那种情况。可见,单独使用status判断也是行不通的。
5. readyState和status的先后判断顺序
由上面的试验,我们可以知道判断的时候readyState和status缺一不可。那么readyState和status的先后判断顺序会不会有影响呢?
我们可以将status调到前面先判断,代码如 xhr.status == 200 && xhr.readyState == 4
事实上,这对于最终的结果是没有影响的,但是中间的性能就不同了。由试验我们知道,
readyState的每次变化都会触发onreadystatechange函数,假如先判断status,那么每次都会多判断一次status的状态。
虽然性能上影响甚微,不过还是应该抱着追求极致代码的想法,把readyState的判断放在前面。
xhr.readyState == 4 && xhr.status == 200

47丶PHP gettype() 函数
gettype() 函数用于获取变量的类型。
    注意:不要使用 gettype() 来测试某种类型,因为其返回的字符串在未来的版本中可能需要改变。
此外,由于包含了字符串的比较,它的运行也是较慢的。使用 is_* 函数代替。
版本要求:PHP 4, PHP 5, PHP 7
语法
string gettype ( mixed $var )
参数说明:
    $var:变量。
返回值
返回字符串,可能值为:
    boolean
    integer
    double
    string
    array
    object
    resource
    NULL
    unknown type
实例
实例
<?php
echo gettype(102) . PHP_EOL;
echo gettype(true) . PHP_EOL;
echo gettype(‘ ‘) . PHP_EOL;
echo gettype(null) . PHP_EOL;
echo gettype(array()) . PHP_EOL;
echo gettype(new stdclass());
?>
输出结果为:
integer
boolean
string
NULL
array
object

48丶Return
如果在一个函数中调用 return 语句,将立即结束此函数的执行并将它的参数作为函数的值返回。
return 也会终止 eval() 语句或者脚本文件的执行。
如果在全局范围中调用,则当前脚本文件中止运行。如果当前脚本文件是被 include 的或者 require 的,
则控制交回调用文件。此外,如果当前脚本是被 include 的,
则 return 的值会被当作 include 调用的返回值。如果在主脚本文件中调用 return,则脚本中止运行。
如果当前脚本文件是在 php.ini 中的配置选项 auto_prepend_file 或者 auto_append_file 所指定的,则此脚本文件中止运行。
更多信息见返回值。
    Note: 注意既然 return 是语言结构而不是函数,因此其参数没有必要用括号将其括起来。通常都不用括号,实际上也应该不用,
    这样可以降低 PHP 的负担。
    Note: 如果没有提供参数,则一定不能用括号,此时返回 NULL。如果调用 return 时加上了括号却又没有参数会导致解析错误。
    Note: 当用引用返回值时永远不要使用括号,这样行不通。只能通过引用返回变量,而不是语句的结果。如果使用 return ($a);
    时其实不是返回一个变量,而是表达式 ($a) 的值(当然,此时该值也正是 $a 的值)。

49丶PHP eval() 函数
PHP 杂项函数
定义和用法
eval() 函数把字符串按照 PHP 代码来计算。
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
语法
eval(phpcode)
参数     描述
phpcode     必需。规定要计算的 PHP 代码。
提示和注释
注释:返回语句会立即终止对字符串的计算。
注释:该函数对于在数据库文本字段中供日后计算而进行的代码存储很有用。
例子
<?php
$string = "beautiful";
$time = "winter";

$str = ‘This is a $string $time morning!‘;
echo $str. "<br />";

eval("\$str = \"$str\";");
echo $str;
?>
输出:
This is a $string $time morning!
This is a beautiful winter morning!

50丶语法:get_object_var($object),返回一个数组。获取$object对象中的属性,组成一个数组
实例:
<?php
class person{
 public $name="王美人";
 public $age = 25;
 public $birth;
}
$p = new person();
print_r(get_object_vars($p));
?>
输出结果:    
Array ( [name] => 王美人 [age] => 25 [birth] => )

51丶PHP is_array() 函数
PHP 可用的函数PHP 可用的函数
is_array() 函数用于检测变量是否是一个数组。
PHP 版本要求:PHP 4, PHP 5, PHP 7
语法
bool is_array ( mixed $var )
参数说明:
    $var:要检测的变量。
返回值
如果检测的变量是数组,则返回 TRUE,否则返回 FALSE。
实例
实例
<?php
$arr_site = array(‘Google‘, ‘Runoob‘, ‘Facebook‘);
if(is_array($arr_site)){
    echo ‘变量 $arr_site 是一个数组‘;
} else {
    echo ‘变量 $arr_site 不是一个数组‘;
}
?>
输出结果为:
变量 $arr_site 是一个数组



52丶 PHP 正则表达式匹配函数 preg_match 与 preg_match_all
preg_match()
preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。
语法:    
int preg_match( string pattern, string subject [, array matches ] )
参数说明:
参数    说明
pattern     正则表达式
subject     需要匹配检索的对象
matches     可选,存储匹配结果的数组, $matches[0] 将包含与整个模式匹配的文本,
$matches[1] 将包含与第一个捕获的括号中的子模式所匹配的文本,以此类推
例子 1:
<?php
if (preg_match("/php/i", "PHP is the web scripting language of choice.", $matches))
{
    print "A match was found:" . $matches[0];
}
else
{
    print "A match was not found.";
}
输出:    
A match was found:PHP
在该例子中,由于使用了 i 修正符,因此会不区分大小写去文本中匹配 php 。
注意:
preg_match() 第一次匹配成功后就会停止匹配,如果要实现全部结果的匹配,
即搜索到subject结尾处,则需使用 preg_match_all() 函数。
例子 2 ,从一个 URL 中取得主机域名 :    
<?php
// 从 URL 中取得主机名
preg_match("/^(http:\/\/)?([^\/]+)/i","http://blog.snsgou.com/index.php", $matches);
$host = $matches[2];
// 从主机名中取得后面两段
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
echo "域名为:{$matches[0]}";
输出:    
域名为:snsgou.com
preg_match_all()
preg_match_all() 函数用于进行正则表达式全局匹配,成功返回整个模式匹配的次数(可能为零),如果出错返回 FALSE 。
语法:
int preg_match_all( string pattern, string subject, array matches [, int flags ] )
参数说明:
参数    说明
pattern     正则表达式
subject     需要匹配检索的对象
matches     存储匹配结果的数组
flags     
可选,指定匹配结果放入 matches 中的顺序,可供选择的标记有:
    PREG_PATTERN_ORDER:默认,对结果排序使 $matches[0] 为全部模式匹配的数组,$matches[1] 为第一个括号中的子模式所匹配的字符串组成的数组,以此类推
    PREG_SET_ORDER:对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第二组匹配项的数组,以此类推
    PREG_OFFSET_CAPTURE:如果设定本标记,对每个出现的匹配结果也同时返回其附属的字符串偏移量

下面的例子演示了将文本中所有 <pre></pre> 标签内的关键字(php)显示为红色。    
<?php
$str = "<pre>学习php是一件快乐的事。</pre><pre>所有的phper需要共同努力!</pre>";
$kw = "php";
preg_match_all(‘/<pre>([\s\S]*?)<\/pre>/‘, $str, $mat);
for ($i = 0; $i < count($mat[0]); $i++)
{
    $mat[0][$i] = $mat[1][$i];
    $mat[0][$i] = str_replace($kw, ‘<span style="color:#ff0000">‘ . $kw . ‘</span>‘, $mat[0][$i]);
    $str = str_replace($mat[1][$i], $mat[0][$i], $str);
}
echo $str;
?>

53丶PHP filter_has_var() 函数
PHP Filter 参考手册 完整的 PHP Filter 参考手册
定义和用法
filter_has_var() 函数检查是否存在指定输入类型的变量。
如果成功则返回 TRUE,如果失败则返回 FALSE。
语法
filter_has_var(type, variable)
参数     描述
type     必需。规定要检查的类型。
可能的输入类型:
    INPUT_GET
    INPUT_POST
    INPUT_COOKIE
    INPUT_SERVER
    INPUT_ENV
variable     必需。规定要检查的变量。
实例
在本实例中,输入变量 "name" 被发送到 PHP 页面:
<?php
if(!filter_has_var(INPUT_GET, "name"))
{
echo("Input type does not exist");
}
else
{
echo("Input type exists");
}
?>
代码的输出如下所示:
Input type exists

53丶AJAX RSS 阅读器
在下面的实例中,我们将演示一个 RSS 阅读器,通过它,来自 RSS 的内容在网页不进行刷新的情况下被载入:
RSS-feed 数据列表...
实例解释 - HTML 页面
当用户在上面的下拉列表中选择某个 RSS-feed 时,会执行名为 "showRSS()" 的函数。该函数由 "onchange" 事件触发:
<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
<script>
function showRSS(str)
{
         if (str.length==0)
          {
                   document.getElementById("rssOutput").innerHTML="";
                   return;
          }
          if (window.XMLHttpRequest)
          {
                 // IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
                 xmlhttp=new XMLHttpRequest();
          }
          else
          {
               // IE6, IE5 浏览器执行代码
               xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
          }
          xmlhttp.onreadystatechange=function()
          {
                  if (xmlhttp.readyState==4 && xmlhttp.status==200)
                   {
                          document.getElementById("rssOutput").innerHTML=xmlhttp.responseText;
                   }
          }
          xmlhttp.open("GET","getrss.php?q="+str,true);
          xmlhttp.send();
}
</script>
</head>
<body>
<form>
<select onchange="showRSS(this.value)">
<option value="">选择一个 RSS-feed:</option>
<option value="rss">读取 RSS 数据</option>
</select>
</form>
<br>
<div id="rssOutput">RSS-feed 数据列表...</div>
</body>
</html>

showRSS() 函数会执行以下步骤:
    检查是否有 RSS-feed 被选择
    创建 XMLHttpRequest 对象
    创建在服务器响应就绪时执行的函数
    向服务器上的文件发送请求
    请注意添加到 URL 末端的参数(q)(包含下拉列表的内容)
PHP 文件
文件 rss_demo.xml。
上面这段通过 JavaScript 调用的服务器页面是名为 "getrss.php" 的 PHP 文件:
<?php
// rss 文件

$xml="rss_demo.xml";
$xmlDoc = new DOMDocument();
$xmlDoc->load($xml);
// 从 "<channel>" 中读取元素
$channel=$xmlDoc->getElementsByTagName(‘channel‘)->item(0);
$channel_title = $channel->getElementsByTagName(‘title‘)
->item(0)->childNodes->item(0)->nodeValue;
$channel_link = $channel->getElementsByTagName(‘link‘)
->item(0)->childNodes->item(0)->nodeValue;
$channel_desc = $channel->getElementsByTagName(‘description‘)
->item(0)->childNodes->item(0)->nodeValue;
// 输出 "<channel>" 中的元素
echo("<p><a href=‘" . $channel_link
  . "‘>" . $channel_title . "</a>");
echo("<br>");
echo($channel_desc . "</p>");
// 输出 "<item>" 中的元素
$x=$xmlDoc->getElementsByTagName(‘item‘);
for ($i=0; $i<=1; $i++) {
        $item_title=$x->item($i)->getElementsByTagName(‘title‘)
        ->item(0)->childNodes->item(0)->nodeValue;
        $item_link=$x->item($i)->getElementsByTagName(‘link‘)
        ->item(0)->childNodes->item(0)->nodeValue;
        $item_desc=$x->item($i)->getElementsByTagName(‘description‘)
        ->item(0)->childNodes->item(0)->nodeValue;
        echo ("<p><a href=‘" . $item_link
        . "‘>" . $item_title . "</a>");
        echo ("<br>");
        echo ($item_desc . "</p>");
}
?>
当 RSS feed 的请求从 JavaScript 发送到 PHP 文件时,将发生:
    检查哪个 RSS feed 被选中
    创建一个新的 XML DOM 对象
    在 xml 变量中加载 RSS 文档
    从 channel 元素中提取并输出元素
    从 item 元素中提取并输出元素



54丶一、onchange()
官方解释都是:在元素值改变时触发
可是天真的小编真的以为,只要是输入框的内容以改变就会触发onchange事件,最终发现,触发是有条件的。
条件:1、绑定onchange事件
           2、输入框当前的值与以前的值是不一致
           3、输入框焦点离开时,才会比较值是否一致(当时我就没有理解这里)
二、onkeyup()
onkeyup():按键弹起时触发
onkeydown():按键按下的时候发生,文字输入之前发生
onkeypress():事件会在键盘按键被按下并释放一个键时发生
按住按键不放,此时会不断的触发onkeydown,但是onkeyup、onkeypress只在按键抬起的时候触发一次。
整个过程是这样的:有键按下—>产生onkeydown事件—>如果是有ASCII码的按键—>产生onkeypress事件—>
有键释放——>产生onkeyup事件
三、总结
在做项目的时候可以看一下相关的类似事件,看看哪个是真正适合的,这样会避免很多错误的出现。

55丶 php中实现页面跳转的几种方式
PHP中实现页面跳转有一下几种方式,看了几个人写的不是很条理,自己整理一下
在PHP脚本代码中实现
 <?php  header("location:url地址") ?>   例如 <?php  header("location:helloworld.php")?>   
 页面会立即跳转,因为header执行了location重定向
   延迟跳转(比如登陆成功后会有几秒钟等待时间,然后跳转到了其他页面)
<?php  header("Refresh:秒数;url=地址")     ?> 例如 <?php   header("Refresh:3;url=helloworld.php")?> 会在3秒后执行跳转
<?php sleep(3); header("location:url地址")?>  调用了sleep()方法,效果也是x秒后执行跳转
在js脚本代码中实现
1.window.location.href方法
<script type="text/javascript">
  window.location.href="helloworld.php"          
</script>
  使用js方法实现延迟跳转
<script type="text/javascript">
  setTimeout("window.location.href=‘helloworld.php‘",3000);
</script>
2.window.location.assign方法  延迟跳转方法同上
<script type="text/javascript">window.location.assign("helloworld.php");
</script>
3.window.location.replace方法  (让新页面替换掉当前页面,不会保存在历史记录里,所有不能使用浏览器后退到原页面了)
<script type="text/javascript">
  window.location.replace("helloworld.php");
</script>
4.window.open方法 三个参数,第一个URL地址。第二个打开新页面方式
(比如新页面_blank,_new,自身跳转_self),第三个是新页面的方式,包括样式,位置等。
<script type="text/javascript">
  window.open("index.php",_blank,width=300px);
</script>
使用HTML脚本代码完成跳转
在<head>标签里执行代码
直接插入这句代码就可以
<meta http-equiv="refresh" content="3;url=‘helloworld.php‘">

56丶可使用CSS属性:
pointer-events: none;设置<a>标签的disable属性

57丶PHP设置时间随时变化
php的几种获取当前时间的函数
方法一date函数
echo date(‘y-m-d h:i:s’,time());
//2010-08-29 11:25:26
方法二 time函数
$time = time();
echo date("y-m-d",$time) //2010-08-29
方法三 $_server[‘server_time‘]
方法四 strftime
echo strftime ("%hh%m %a %d %b" ,time());
18h24 sunday 21 may
还有一个问题就是时区问题,php环境默认时差与北京时间相差8小时,我们要想获取正确的时间就必须设置
在php文件开始处 加上date_default_timezone_set(‘prc‘);
或在php.ini里面 date.timezone=prc;嗾。
记得修改了php.ini要重起apache

58丶PHP 单引号与双引号的区别(总结)
PHP 单引号与双引号的区别
原文地址:http://www.jb51.net/article/21035.htm
看好多代码有时候用单引号或双引号实现包含字符串的内容,其实简单个概括下双引号中的变量可以解析,单引号就是绝对的字符串。
1、定义字符串   
在PHP中,字符串的定义可以使用单引号,也可以使用双引号。但是必须使用同一种单或双引号来定义字符串,如:‘Hello"和“
Hello‘为非法的字符串定义。   
定义字符串时,只有一种引号被视为定义符,即单引号或双引号。于是,如果一个字符串由双引号开始,那么只有双引号被分析器解析。
这样,你就可以在双引号串中包含任何其他字符,甚至单引号。下面的引号串都是合法的:
Php代码
复制代码 代码如下:
$s = "I am a ‘single quote string‘ inside a double quote string";
$s = ‘I am a "double quote string" inside a single quote string‘;
$s = "I am a ‘single quote string‘ inside a double quote string";
$s = ‘I am a "double quote string" inside a single quote string‘;   
而串 "Why doesn‘t "this" work?" 则会被分为三段。如果在这个串中想要表示出双引号,则可以使用转义符"\"(反斜线),
变成 "Why doesn‘t \"this\" work?" 即可。
2、字符串变量中的单、双引号  
PHP允许我们在双引号串中直接包含字串变量,我们可以发现下面的两个字串的处理结果是相同的。
复制代码 代码如下:
$full_name = $first_name . ‘ ‘ . $last_name;
$full_name = "$first_name $last_name";   
单引号串和双引号串在PHP中的处理是不相同的。双引号串中的内容可以被解释而且替换,
而单引号串中的内容总被认为是普通字符。例如:
Php代码
复制代码 代码如下:
$foo = 2;
echo "foo is $foo"; // 打印结果: foo is 2
echo ‘foo is $foo‘; // 打印结果: foo is $foo
echo "foo is $foo\n"; // 打印结果: foo is 2 (同时换行)
echo ‘foo is $foo\n‘; // 打印结果: foo is $foo\n
$foo = 2;
echo "foo is $foo"; // 打印结果: foo is 2
echo ‘foo is $foo‘; // 打印结果: foo is $foo
echo "foo is $foo\n"; // 打印结果: foo is 2 (同时换行)
echo ‘foo is $foo\n‘; // 打印结果: foo is $foo\n   
正如你所看到的,在单引号串中甚至反斜杠也失去了他的扩展含义(除了插入反斜杠\\和插入单引号\‘)。所以,当你想在字串中进行变量代换和包 含\n(换行符)等转义序列时,你应该使用双引号。单引号串可以用在其他任何地方,脚本中使用单引号串处理速度会更快些,因为PHP语法分析器对单引号串 的处理方式比较单纯,而双引号的处理由于串内部也需要解析,因此更复杂些,所以处理速度略慢。   
在字符串中引用复杂的变量组合时,可能会产生一些问题,下面的代码会正常工作:
Php代码
复制代码 代码如下:
echo "value = $foo";
echo "value = $a[$i]";
echo "value = $foo";
echo "value = $a[$i]";   
而下面的代码却不能得到我们希望的结果:
echo "value = $a[$i][$j]"; //我们希望打印二维数组$a的某个元素。   
为避免这些字串使用中的潜在问题,我们通常把复杂的变量从字串中分离开来,就像这样:echo ‘value =
‘ . $a[$i][$j];//字符串的连接用点(.)   
还有一种办法是将复杂变量用花括号括起来,语法分析器就能正确辨认了:
echo "value = {$a[$i][$j]}" //打印二维数组$a的某个元素   
3、在SQL语句中  
这是会经常遇到的问题,在插入数据库的SQL语句是采用单引号来定义字符串,如果要将一个含有单引号的字符串插入数据库,
这个SQL语句就会出错。
如:$sql="insert into userinfo (username,password) Values(‘O‘Kefee‘,‘123456‘)"   
此时,处理的方法之一是在SQL语句中加入转义符反斜线,
即:……Values(‘O\‘Kefee‘,……   
当然也可以使用函数 addslashes(),该函数的功能就是加入转义符,
即:$s = addslashes("O‘Kefee") ……Values(‘".$s."‘,……   
还有一种方法是设置php.ini中的magic-quotes选项,打开该选项,则通过表单提交的信息中如果有单引号是,将会自动加上如转义符。因此不用使用其他函数了。
补充: 这就要从双引号和单引号的作用讲起: 双引号里面的字段会经过编译器解释然后再当作HTML代码输出,但是单引号里面的不需要解释,直接输出。
例如:
复制代码 代码如下:
$abc=‘I love u‘;
echo $abc //结果是:I love u
echo ‘$abc‘ //结果是:$abc
echo "$abc" //结果是:I love u
所以在对数据库里面的SQL语句赋值的时候也要用在双引号里面SQL="select a,b,c from ..." 但是SQL语句中会有单引号把字段名引出来
例如:select * from table where user=‘abc‘;
这里的SQL语句可以直接写成SQL="select * from table where user=‘abc‘"
但是如果象下面:
复制代码 代码如下:
$user=‘abc‘;
SQL1="select * from table where user=‘ ".$user." ‘ ";对比一下
SQL2="select * from table where user=‘ abc ‘ "
我把单引号和双引号之间多加了点空格,希望你能看的清楚一点。
也就是把‘abc‘ 替换为 ‘".$user."‘都是在一个单引号里面的。只是把整个SQL字符串分割了。 SQL1可以分解为以下3个部分
1:"select * from table where user=‘ "
2:$user
3:" ‘ "
字符串之间用 . 来连接,这样能明白了吧。
一、引号定义字符串
  在PHP中,通常一个字符串被定义在一对引号中,如:
‘I am a string in single quotes‘
"I am a string in double quotes"
  PHP语法分析器是用成对的引号来判断一个字符串的。因此,所有字符串必须使用同一种单或者双
引号来定义开始和结束。例如,下面的字串定义是不合法的:
"I am not a valid string since I have unmatching quote marks‘
‘Me neither!"
  定义字符串时,只有一种引号被视为定义符,即单引号或双引号。于是,如果一个字符串由双引
号开始,那么只有双引号被分析器解析。这样,你就可以在双引号串中包含任何其他字符,甚至单引
号。下面的引号串都是合法的:
$s = "I am a ‘single quote string‘ inside a double quote string";
$s = ‘I am a "double quote string" inside a single quote string‘;
  当PHP遇到与串的开头相对应的引号时,便认为已经到了字符串尾部,于是:
"Why doesn‘t "this" work?"
  实际上被PHP语法分析器分成三个部分:
"Why doesn‘t "——包含一个单引号的双引号串
this——多余的字符,分析器无法处理
" work?" ——普通字符串
  上面的这个例子企图在双引号串中包含双引号,而分析器在遇到第二个双引号时便认为字符串结
束了。要达到包含引号的目的,必须分析器在遇到串内普通引号的时候忽略它的原意,我们在引号的
前面加上一个反斜杠来告诉PHP:这个引号是字符串的一部分,正确的表示方法是这样:
"Why doesn‘t \"that\" work?"
  在英文字符串中一个常见的问题是撇号‘的使用,因为它就是一个单引号,而在英文串中十分常见
(英文所有格)。你必须小心处理这些字符:
‘You\‘d better escape your apostrophes‘
  可以看到反斜杠在字符串中有他的特殊含义,当我们需要在字符串中包含反斜杠本身时,需要在
该符号前面多加一个反斜杠。例如:
$file = "c:\windows\system.ini";
echo $file; // 打印结果为: c:windowssystem.ini
$file = "c:\\windows\\system.ini";
echo $file; // 打印结果为: c:\windows\system.ini
  另一种字符串定义方式,能够消除特殊字符的烦恼,而且便于引用较长的文本。该字符串定义方
法以<<<符号紧跟一个自定义字符串开头,最后一行以该自定义字符串结束,并且必须顶格。
二、字串的连接
  字串可以使用字串连接符(.)来连接,如:
$first_name = ‘Charlie‘;
$last_name = ‘Brown‘;
$full_name = $first_name . ‘ ‘ . $last_name;
  常见的用途是建立大块的HTML字串代码,赋值号 (=) 连接符 (.) 可以被简写合并为 (.=) 符
号,如:
$html = ‘<table>‘;
$html .= ‘<tr><td>number</td><td>square</td></tr>‘;
for ( $i=0 ; $i<10 ; $i++) {
$square = $i * $i;
$html .= ‘<tr><td>‘ . $i . ‘</td><td>‘ . $square . ‘</td></tr>‘;
}
$html .= ‘</table>‘;
三、在字串中使用变量
  这个功能让你无须使用连接符号来粘和大量的简单字符串。PHP允许我们在双引号串中直接包含字
串变量,我们可以发现下面的两个字串的处理结果是相同的。
$full_name = $first_name . ‘ ‘ . $last_name;
$full_name = "$first_name $last_name";
  单引号串和双引号串在PHP中的处理是不相同的。双引号串中的内容可以被解释而且替换,而单引
号串中的内容总被认为是普通字符。例如:
$foo = 2;
echo "foo is $foo"; // 打印结果: foo is 2
echo ‘foo is $foo‘; // 打印结果: foo is $foo
echo "foo is $foo\n"; // 打印结果: foo is 2 (同时换行)
echo ‘foo is $foo\n‘; // 打印结果: foo is $foo\n
  正如你所看到的,在单引号串中甚至反斜杠也失去了他的扩展含义(除了插入反斜杠\\和插入单
引号\‘)。所以,当你想在字串中进行变量代换和包含\n(换行符)等转义序列时,你应该使用双引
号。单引号串可以用在其他任何地方,脚本中使用单引号串处理速度会更快些,因为PHP语法分析器对
单引号串的处理方式比较单纯,而双引号的处理由于串内部也需要解析,因此更复杂些,所以处理速
度略慢。
  在字符串中引用复杂的变量组合时,可能会产生一些问题,下面的代码会正常工作:
echo "value = $foo";
echo "value = $a[$i]";
  而下面的代码却不能得到我们希望的结果:
echo "value = $a[$i][$j]"; //我们希望打印二维数组$a的某个元素。
  为避免这些字串使用中的潜在问题,我们通常把复杂的变量从字串中分离开来,就像这样:
echo ‘value = ‘ . $a[$i][$j];
  还有一种办法是将复杂变量用花括号括起来,语法分析器就能正确辨认了:
echo "value = {$a[$i][$j]}" //打印二维数组$a的某个元素
  这样,又出现新问题了。当我们想在字串中引用花括号字符本身时,就要记得使用转义符了:
$var = 3;
echo "value = {$var}"; // 打印结果 "value = 3"
echo "value = \{$var}"; // 打印结果 "value = \{3}"
由于转义字符对{}进行了其他处理\p{xx},不适用此例,可以如下代替:
var_dump("value = {".$var."}") ; // 打印结果 "value = {3}"
三、斜杠和SQL语句
  生成HTML代码或SQL查询语句是编写PHP程序时经常遇到而且是件有趣的事情。为什么这么说呢,
因为这涉及到生成另外一种类型的代码,你必须仔细地考虑和遵循这种代码所要求的编写语法和规
则。
  我们来看这样一个例子,假如你想查询数据库中名字是“O‘Keefe”的用户,通常SQL语句的形式
是这样的:
select * from users where last_name = ‘O\‘Keefe‘
  请注意SQL语句这个英文所有格(撇号)需使用反斜杠转义。PHP专门提供了一些函数来处理这样
的情况,函数AddSlashes($str)的用途就是自动在字串中对引号字符插入反斜杠转义符:
$last_name = "O‘Keefe";
$sql = "select * from users where last_name = ‘" . addslashes($last_name) . "‘";
  在这个例子中,你还要在last_name字串外面括上单引号(SQL语法要求),由于这里使用的是双
引号串,所以对这对单引号就无须使用转义了。下面的这个语句是使用单引号串的等价形式:
$sql = ‘select * from users where last_name = \‘‘ . addslashes($last_name) . ‘\‘‘;
  任何时候你要在数据库中写入字串,你都必须确保里面的引号正确使用了转义符号,这是很多PHP
初学者常犯的错误。
四、双引号和HTML
  与SQL语句不同,在标准HTML语言中双引号常被用来表示字串(现在很多浏览器具备较强的容错功
能,允许在HTML中用单引号甚至不用引号表示字符串),例如:
$html = ‘<a href="‘.$url.‘">‘.$link.‘</a>‘;
$html = "<a href=\"$url\">$link</a>";
  HTML语言不支持反斜杠转义,这一点在我们使用表单的hidden inputs来传输数据的时候就会有所
体会了。设置hidden inputs的值的最好办法,是使用htmlspecialchars()函数来编码。下面的语句可
以正常传输一个可能包含双引号的数据:
  <input type=hidden name=var value="<?php echo htmlspecialchars($var) ?>">
一、引号定义字符串。要达到包含引号的目的, 必须分析器在遇到串内普通引号的时候忽略它的原意,
我们在引号的 前面加上一个反斜杠来告诉PHP:这个引号是字符串的一部分,正确的表示方法是这样:单引号串可以用在其他任何地方,
脚本中使用单引号串处理速度会更快些,因为PHP语法分析器对 单引号串的处理方式比较单纯,
而双引号的处理由于串内部也需要解析,因此更复杂些,所以处理速 度略慢。
这个...双引号转义,单引号不转义
如:/r/n是换行,但是如果你用单引号写入文件,不会是换行,而是一个字符,如果用双引号写入文件,就是换行.
同意。

59.Jquery的parent和parents(找到某一特定的祖先元素)用法
parent是指取得一个包含着所有匹配元素的唯一父元素的元素集合。
parents则是取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素)。可以通过一个可选的表达式进行筛选。
parent取得很明确就是当前元素的父元素
parents则是当前元素的祖先元素

60. PHP类中self和$this的区别
1.self代表类,$this代表对象
2.能用$this的地方一定使用self,能用self的地方不一定能用$this
静态的方法中不能使用$this,静态方法给类访问的。
self调用的是类,而$this调用的则是实例化的对象

 

PHP基础知识总结(待更)

原文:https://www.cnblogs.com/lovefsq/p/10426125.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!