PHP语法
PHP 中的注释:
<?php
// 这是 PHP 单行注释
/*
这是
PHP 多行
注释
*/
?>
PHP 变量
- 变量名必须以字母或者下划线字符开始
- 变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )
- 变量名不能包含空格
- 变量名是区分大小写的($y 和 $Y 是两个不同的变量)
PHP变量作用域
局部作用域:
在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问
全局作用域:
在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字。
四大作用域:
-
global:在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上 global 关键字
-
static:当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。
-
local:函数内参数的作用域,表示只在此函数范围内可使用(此关键字不可使用 )
-
parameter:函数定义时形参的作用域,表示只在函数范围内(此关键字不可使用)
PHP EOF
作用:
- 1.PHP 定界符 EOF 的作用就是按照原样,包括换行格式什么的,输出在其内部的东西;
- 2.在 PHP 定界符 EOF 中的任何特殊字符都不需要转义;
- EOF 中是会解析 html 格式内容的,并且在双引号内的内容也有转义效果。
如何写:
-
- 1. 必须后接分号,否则编译通不过。
- 2. EOF 可以用任意其它字符代替,只需保证结束标识与开始标识一致。
- 3. 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)。
- 4. 开始标识可以不带引号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号。
- 5. 当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义,此处相当与q和qq的用法。
实例:
1 <?php 2 $name="runoob"; 3 $a= <<<EOF 4 "abc"$name 5 "123" 6 EOF; 7 // 结束需要独立一行且前后不能空格 8 echo $a; 9 ?>
PHP 5 数据类型
- String(字符串):点(.)用来连接字符串和变量。
- Integer(整型):可以用三种格式来指定:十进制, 十六进制( 以 0x 为前缀)或八进制(前缀为 0)。
- Float(浮点型)
- Boolean(布尔型):布尔型可以是 TRUE 或 FALSE,通常用于条件判断。
- Array(数组)
- Object(对象):类的实例化就是对象。
- NULL(空值):NULL 值表示变量没有值,可以通过设置变量值为 NULL 来清空变量数据。
PHP 5 常量
常量是一个简单值的标识符。该值在脚本中不能改变。
一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。
注意: 常量在整个脚本中都可以使用,且在使用常量时,不能在常量名前添加$ 符号,不然会将常量转换成新的未定义变量使用,会导致报错。
define()
设置常量,使用 define() 函数,函数语法如下:
1 bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
该函数有三个参数:
- name:必选参数,常量名称,即标志符。
- value:必选参数,常量的值。
- case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感。默认是大小写敏感的。
const
1.在定义时必须被初始值,
2.前面不加任何修饰符
3.变量名字母一般都大写
4.常量可以被子类继承
5.一个常量是属于一个类的,而不是某个对象的
作用:当某些值是固定不变的,就用const
1.const 定义的常量和define()定义的常量的区别?
希望一个成员变量不被修改 例如圆周率 3.1415926
定义:const 常量名=值; 没有$符
访问:类名 ::常量名 或 接口名::常量名
区别
用法一:const用于类成员变量,一经定义不可修改,define用于全局常量,不可用于类成员变量的定义,const可在类中使用,define不能。
用法二:const定义的常量大小写敏感,而define可通过第三个参数(为TRUE表示大小写不敏感)来指定大小写是否敏感。在运行时定义一个常量。define('TXE',100,TRUE);
用法三:const不能在条件语句中定义常量,而define函数可以。if($a>10){define('LE','hello');}
PHP逻辑语句:
在 PHP 中,提供了下列条件语句:
- if 语句 - 在条件成立时执行代码
- if...else 语句 - 在条件成立时执行一块代码,条件不成立时执行另一块代码
- if...elseif....else 语句 - 在若干条件之一成立时执行一个代码块
- switch 语句 - 在若干条件之一成立时执行一个代码块
PHP 数组:
数组是一个能在单个变量中存储多个值的特殊变量,在 PHP 中,array() 函数用于创建数组:
在 PHP 中,有三种类型的数组:
- 数值数组 - 带有数字 ID 键的数组
- 关联数组 - 带有指定的键的数组,每个键关联一个值
- 多维数组 - 包含一个或多个数组的数组
遍历数组:
-
遍历正常数值数组可使用for循环:
1 <?php 2 $cars=array("Volvo","BMW","Toyota"); 3 $arrlength=count($cars); 4 5 for($x=0;$x<$arrlength;$x++) 6 { 7 echo $cars[$x]; 8 echo "<br>"; 9 } 10 ?>
-
遍历并打印关联数组中的所有值,使用 foreach 循环
1 <?php 2 $age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43"); 3 4 foreach($age as $x=>$x_value) 5 { 6 echo "Key=" . $x . ", Value=" . $x_value; 7 echo "<br>"; 8 } 9 ?>
PHP 超级全局变量
PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。
PHP 超级全局变量列表:
- $GLOBALS:$GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
- $_SERVER:$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组
- $_REQUEST:$_REQUEST 用于收集HTML表单提交的数据。
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
PHP 循环
在您编写代码时,您经常需要让相同的代码块一次又一次地重复运行。我们可以在代码中使用循环语句来完成这个任务。
在 PHP 中,提供了下列循环语句:
- while - 只要指定的条件成立,则循环执行代码块
- do...while - 首先执行一次代码块,然后在指定的条件成立时重复这个循环
- for - 循环执行代码块指定的次数
- foreach - 根据数组中每个元素来循环代码块
PHP 魔术常量
PHP 向它运行的任何脚本提供了大量的预定义常量。
不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。
有八个魔术常量它们的值随着它们在代码中的位置改变而改变
-
__LINE__
文件中的当前行号。
-
__FILE__
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
-
__DIR__
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
-
__FUNCTION__
函数名称(PHP 4.3.0 新加)自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。 -
__CLASS__
类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。
-
__TRAIT__
Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。
Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
-
__METHOD__
类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
-
__NAMESPACE__
当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。
PHP 命名空间(namespace)
PHP 命名空间可以解决以下两类问题:
- 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
- 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
定义命名空间
如下:(注意:命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有除定义源文件编码方式的 declare 语句代码之前声明命名空间。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前)
1 <?php
//declare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码,可以写在最前面 2 namespace MyProject { 3 const CONNECT_OK = 1; 4 class Connection { /* ... */ } 5 function connect() { /* ... */ } 6 } 7 8 namespace AnotherProject { 9 const CONNECT_OK = 1; 10 class Connection { /* ... */ } 11 function connect() { /* ... */ } 12 } 13 ?>
以下代码会出现语法错误:
1 <html> 2 <?php 3 namespace MyProject; // 命名空间前出现了“<html>” 会致命错误 - 命名空间必须是程序脚本的第一条语句 4 ?>
子命名空间
定义:
命名空间的名字可以像文件夹一样分层次的方式定义,如:namespace MyProject\Sub\Level; //声明分层次的单个命名空间
命名空间的调用:
在一个文件中调用另一个文件中的命名空间下的东西,如:
1 <?php 2 include '2.namespace.php'; \\包含2.namespace.php下的代码 3 use \hello\person; \\使用\hello命名空间下的代码,person是\hello下的类名 4 $zzh=new person(); 5 $zzh->handsome(); 6 ?> 7 8 第二种情况若,当引入重复的类名在命名空间中时,可进行取别名进行区分,方便后面引用。 9 <?php 10 include '2.namespace.php'; \\包含2.namespace.php下的代码 11 use \hello\person as one; \\ 取 hello 空间下的person类命名为one 12 use \word\test\person as tow; \\ 取不同的别名把两个相同名字的类区别出来 13 $zzh=new one(); 14 zzh->handsome(); 15 ?> 16 或者这样使用 17 <?php 18 include '2.namespace.php'; 19 use \hello\person; 20 use \word\test\person; 21 $zzh= new \hello\person(); 22 $hzz=new \word\test\person(); 23 ?>
PHP 面向对象
在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。
定义
-
类名后的一对大括号({})内可以定义变量和方法。
-
类的变量使用 var 来声明, 变量也可以初始化值。
- 类使用 class 关键字后加上类名定义。
- 函数定义类似 PHP 函数的定义,但函数只能通过该类及其实例化的对象访问。
继承类
PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承,实例中 Child_Site 类继承了 Site 类,并扩展了功能,如下:
1 <?php 2 // 子类扩展站点类别 3 class Child_Site extends Site { 4 var $category; 5 6 function setCate($par){ 7 $this->category = $par; 8 } 9 10 function getCate(){ 11 echo $this->category . PHP_EOL; 12 } 13 }
访问控制
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
- public(公有):公有的类成员可以在任何地方被访问。
- protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
- private(私有):私有的类成员则只能被其定义所在的类访问。
属性的访问控制
类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有
方法的访问控制
类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。
常量
可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字(如 self,parent 或 static)
1 <?php 2 class MyClass 3 { 4 const constant = '常量值'; 5 6 function showConstant() { 7 echo self::constant . PHP_EOL; 8 } 9 }
关键字
-
Static 关键字
声明类属性或方法为 static(静态),就可以不实例化类而直接访问。
静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
静态属性不可以由对象通过 -> 操作符来访问。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。
1 <?php 2 class Foo { 3 public static $my_static = 'foo'; 4 5 public function staticValue() { 6 return self::$my_static; 7 } 8 } 9 10 print Foo::$my_static . PHP_EOL; 11 $foo = new Foo(); 12 13 print $foo->staticValue() . PHP_EOL; 14 ?>
在PHP中双冒号(::)操作符是一种范围解析操作符,又作用域限定操作符。它是对类中的方法的静态(static)引用,可以访问静态、const和类中重写的属性与方法。
php调用类的内部静态成员,或者是类之间调用就要用两个冒号(::)。
执行以上程序,输出结果为:
foo foo
-
Final 关键字
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
抽象类
定义:使用abstract关键字去修饰类。如何任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
注 意:抽象类的存在是为了让子类去继承的而且定义为抽象的类不能被实例化。继承一个抽象类的时候,子类必须定义父类中的所有抽象方法且所有抽象方法必须都要被使用;另外,这些方法的访问控 制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
如下代码是一个抽象类被继承的代码:
1 <?php 2 abstract class AbstractClass 3 { 4 // 强制要求子类定义这些方法 5 abstract protected function getValue(); 6 abstract protected function prefixValue($prefix); 7 8 // 普通方法(非抽象方法) 9 public function printOut() { 10 print $this->getValue() . PHP_EOL; 11 } 12 } 13 14 class ConcreteClass1 extends AbstractClass 15 { 16 protected function getValue() { 17 return "ConcreteClass1"; 18 } 19 20 public function prefixValue($prefix) { 21 return "{$prefix}ConcreteClass1"; 22 } 23 } 24 25 class ConcreteClass2 extends AbstractClass 26 { 27 public function getValue() { 28 return "ConcreteClass2"; 29 } 30 31 public function prefixValue($prefix) { 32 return "{$prefix}ConcreteClass2"; 33 } 34 } 35 36 $class1 = new ConcreteClass1; 37 $class1->printOut(); 38 echo $class1->prefixValue('FOO_') . PHP_EOL; 39 40 $class2 = new ConcreteClass2; 41 $class2->printOut(); 42 echo $class2->prefixValue('FOO_') . PHP_EOL; 43 ?>
执行以上代码,输出结果为:
ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
调用父类构造方法
PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct() 。
1 <?php 2 class BaseClass { 3 function __construct() { 4 print "BaseClass 类中构造方法" . PHP_EOL; 5 } 6 } 7 class SubClass extends BaseClass { 8 function __construct() { 9 parent::__construct(); // 子类构造方法不能自动调用父类的构造方法 10 print "SubClass 类中构造方法" . PHP_EOL; 11 } 12 } 13 class OtherSubClass extends BaseClass { 14 // 继承 BaseClass 的构造方法 15 } 16 17 // 调用 BaseClass 构造方法 18 $obj = new BaseClass(); 19 20 // 调用 BaseClass、SubClass 构造方法 21 $obj = new SubClass(); 22 23 // 调用 BaseClass 构造方法 24 $obj = new OtherSubClass(); 25 ?>
执行以上程序,输出结果为:
BaseClass 类中构造方法
BaseClass 类中构造方法 SubClass 类中构造方法 BaseClass 类中构造方法
PHP 异常处理
Try、throw 和 catch
要避免出现异常错误,我们需要创建适当的代码来处理异常。
适当的处理异常代码应该包括:
- Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
- Throw - 里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"。
- Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。
如下代码:
1 <?php 2 // 创建一个有异常处理的函数 3 function checkNum($number) 4 { 5 if($number>1) 6 { 7 throw new Exception("变量值必须小于等于 1"); 8 } 9 return true; 10 } 11 12 // 在 try 块 触发异常 13 try 14 { 15 checkNum(2); 16 // 如果抛出异常,以下文本不会输出 17 echo '如果输出该内容,说明 $number 变量'; 18 } 19 // 捕获异常 20 catch(Exception $e) 21 { 22 echo 'Message: ' .$e->getMessage(); 23 } 24 ?>
上面代码将得到类似这样一个错误:Message: 变量值必须小于等于 1