特点
- php是编译型语言
- 跨平台,支持windows与linux
- 弱类型
- 在PHP中 null和NULL是一样的,不区分大小写
基本规则
- 所有用户定义的函数、类和关键词都对大小写不敏感,但是变量大小写敏感
- 变量以 $ 符号开头,其后是变量的名称
- PHP语句必须以;结尾
界定符
- 短标记型(默认情况下不支持,需要在php配置文件中开启支持短标记)
作用域
- global关键词用于在函数内访问全局变量
- 当函数完成/执行后,会删除所有变量。不过,有时我们需要不删除某个局部变量,用static关键字
注释
输出
1 2 3 4 5 6 7 8 9 10 11
| <?php echo "x1lys\n"; print "x1lys\n"; echo "x1lys1",'x1lys2','x1lys3';
$arr = array("a" => "x1lys1", "b" => "x1lys2", "c" => "x1lys3"); print_r($arr); var_dump("x1lys"); var_dump(1); var_dump($arr);
|
常量
- 用define()函数定义常量
- 常量是自动全局的,而且可以贯穿整个脚本使用
1 2 3 4 5
| define(常量名,值,[是否区别大小写]) true表示不区分大小写,默认是false 常量名前没有$符 常量名推荐使用大写
|
1 2 3 4 5 6 7 8
| <?php
define("GREETING", "Welcome to W3School.com.cn!", true); echo GREETING; echo "<br>";
echo greeting; ?>
|
- 定义常量可以用特殊字符,但是在调用的时候必须用
constant
关键字调用
1 2
| define('%-%','tom'); echo constant('%-%');
|
预定义常量
1 2 3 4 5 6
| echo PHP_VERSION,'<br>'; echo PHP_OS,'<br>'; echo PHP_INT_MAX,'<br>';
重点 PHP_EOL:系统换行符,Windows是(\r\n),Linux是(\n),MAC是(\r)
|
魔术常量
LINE |
文件中的当前行号。 |
FILE |
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,FILE 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。 |
DIR |
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(FILE)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) = |
FUNCTION |
函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。 |
CLASS |
类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如Foo\Bar)。注意自 PHP 5.4 起 CLASS 对 trait 也起作用。当用在 trait 方法中时,CLASS 是调用 trait 方法的类的名字。 |
TRAIT |
Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。 |
METHOD |
类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。 |
NAMESPACE |
当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增) |
1 2 3
| echo __LINE__,'<br>'; echo __FILE__,'<br>'; echo __DIR__,'<br>';
|
变量
- 变量的本质就是内存中的一段空间
- 只能以下划线或数字开头
- 只能包含数字,字母,下划线
- 变量对大小写敏感
超全局变量
数据类型
整型
1 2 3 4 5 6 7 8
| <?php $num1=10; $num2=010; $num3=0x10;
echo $num1,'<br>'; echo $num2,'<br>'; echo $num3;
|
浮点型
1 2 3
| var_dump(0.9==(1-0.1)); echo '<br>'; var_dump(0.1==(1-0.9));
|
1 2 3 4 5
| var_dump(0.9==(1-0.1)); echo '<br>'; var_dump(0.1==(1-0.9)); echo '<br>'; var_dump(bccomp(0.1,1-0.9,5));
|
字符串、整数、浮点数、逻辑、数组、对象、NULL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| $a="aaa"; $a=343; $a=3.2; $a=true; $a=array("bob","qwq","fsd");
<?php class Car { var $color; function Car($color="green") { $this->color = $color; } function what_color() { return $this->color; } } ?>
|
布尔型
- 不能使用echo 和print输出布尔型,要使用var_dump()输出
1 2
| $flag=false; var_dump($flag);
|
字符串型
- 在PHP中单引号字符串和双引号字符串是有区别的
- 单引号字符串是真正的字符串
- 双引号字符串要解析字符串中的变量
1 2 3
| $name='tom'; echo '我的名字叫$name','<br>'; echo "我的名字叫$name",'<br>';
|
数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php
$stu=array('tom','berry','ketty'); print_r($stu); echo '<hr>'; echo $stu[0],'<br>'; echo $stu[1],'<br>'; echo $stu[2],'<hr>';
$stu=['tom','berry','ketty']; print_r($stu);
$emp=array('name'=>'李白','sex'=>'男','age'=>22); print_r($emp); echo '<hr>'; echo $emp['name'],'<br>'; echo $emp['sex'],'<br>'; echo $emp['age'];
|
类型转换
自动类型转换
- 当提供的类型和需要的类型不一致的时候会自动进行类型转换
1 2 3 4 5 6 7 8
| $num=10; if($num){ echo 'aa'; }else{ echo 'bb'; } --------------------------------- echo '20'-10;
|
强制类型转换
1 2 3
| <?php $num1='12'; var_dump($num1,(int)$num1,(float)$num1);
|
运算符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| <?php $x=17; $y=8; echo ($x + $y); echo ($x - $y); echo ($x * $y); echo ($x / $y); echo ($x % $y); ?> <?php $x=17; echo $x;
$y=17; $y += 8; echo $y;
$z=17; $z -= 8; echo $z;
$i=17; $i *= 8; echo $i;
$j=17; $j /= 8; echo $j;
$k=17; $k %= 8; echo $k; ?> <?php $a = "Hello"; $b = $a . " world!"; echo $b;
$x="Hello"; $x .= " world!"; echo $x; ?> <?php $x=17; echo ++$x;
$y=17; echo $y++;
$z=17; echo --$z;
$i=17; echo $i--; ?>
|
判断
循环
- while
- do-while
- for
- foreach
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?php $stu=['tom','berry','ketty']; foreach($stu as $v){ echo $v,'<br>'; }
echo '<hr>'; ----------------------------------------------------------- foreach($stu as $k=>$v){ echo "{$k}:{$v}<br>"; }
|
函数
1 2 3 4 5 6 7 8 9 10
| <?php function setHeight($minheight=50) { echo "The height is : $minheight <br>"; }
setHeight(350); setHeight(); setHeight(135); setHeight(80); ?>
|
作用域
- 全局变量:在函数外面
- 局部变量:在函数里面,默认情况下,函数内部是不会去访问函数外部的变量
- 超全局变量:可以在函数内部和函数外部访问
- $GLOBALS保存的是全局变量的所有的值
- global用于创建一个全局变量的引用
- 常量没有作用域的概念
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| <?php $num=10; function fun() { echo $num; } fun();
--------------------- <?php $_POST['num']=10; function fun() { echo $_POST['num']; } fun(); ---------------------------- <?php function fun() { $_GET['num']=10; } fun(); echo $_GET['num'];
<?php $num=10; function fun() { echo $GLOBALS['num']; } fun();
<?php $num=10; function fun() { global $num; echo $num; $num=100; } fun(); echo '<br>'; echo $num; ----------------------------------- <?php $num=10; function fun() { global $num; unset($num); } fun(); echo $num;
|
错误处理
1 2 3 4
| 1. error_reporting = E_ALL:报告所有的错误 2. display_errors = On:将错误显示在浏览器上 3. log_errors = On:将错误记录在日志中 4. error_log=’地址’:错误日志保存的地址
|
1 2
| 开发模式:错误显示在浏览器上,不要记录在日志中 运行模式:错误不显示在浏览器上,记录是日志中
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php $debug=false; ini_set('error_reporting',E_ALL); if($debug){ ini_set('display_errors','on'); ini_set('log_errors','off'); }else{ ini_set('display_errors','off'); ini_set('log_errors','on'); ini_set('error_log','./err.log'); }
echo $num;
|
类的命名
- 以字母、下划线开头,后面跟的是字母、数字、下划线
- 不能用PHP关键字做类名
- 类名不区分大小写(变量名区分,关键字、类名不区分大小写)
- 类名用帕斯卡命名法(大驼峰 单词的首字母大写)
对象的比较
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php
class Student { }
$stu1=new Student(); $stu2=new Student(); $stu3=$stu2;
var_dump($stu1==$stu2); echo '<br>'; var_dump($stu1===$stu2); echo '<br>'; var_dump($stu2===$stu3);
|
属性
属性本质就是变量
通过->
调用对象的成员 对象名->属性名 对象名->方法名()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?php
class Student { public $name; public $add='地址不详'; }
$stu=new Student();
$stu->name='tom'; $stu->add='北京';
echo '姓名:'.$stu->name,'<br>'; echo '地址:'.$stu->add,'<br>';
$stu->age=20; print_r($stu); echo '<br>';
unset($stu->add); print_r($stu);
|
方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php class Student { public function show() { echo '这是show方法<br>'; } function test() { echo '这是test方法<br>'; } } $stu=new Student; $stu->show(); $stu->test();
|
1、方法前面public是可以省略的,如果省略,默认就是public的。
2、属性前面的public不能省略
访问修饰符
修饰符 |
描述 |
public(公有的) |
在类的内部和外部都能访问 |
private(私有的) |
只能在类的内部访问 |
protected(受保护的) |
在整个继承链上访问 |
一般来说,属性都用私有的,通过公有的方法对私有的属性进行赋值和取值。
作用:保证数据的合法性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <?php
class Student { private $name; private $sex; public function setInfo($name,$sex) { if($sex!='男' && $sex!='女'){ echo '性别必须是男或女'; exit; } $this->name=$name; $this->sex=$sex; } public function getInfo() { echo '姓名:'.$this->name,'<br>'; echo '性别:'.$this->sex,'<br>'; } }
$stu=new Student; $stu->setInfo('tom','男'); $stu->getInfo(); echo '<hr>'; $stu2=new Student; $stu2->setInfo('berry','女'); $stu2->getInfo();
|
类和对象在内存中的分布
- 对象的本质是一个复杂的变量
- 类的本质是一个自定义的复杂数据类型
- 栈区:运行速度快,体积小,保存基本类型
- 堆区:运行速度稍慢,体积大,保存复杂类型
- 实例化的过程就是分配内存空间的过程
- 对象保存在堆区,将堆区的地址保存到栈区。
封装
封装就是有选择性的提供数据
通过访问修饰符来实现封装
构造方法
构造方法也叫构造函数,当实例化对象的时候自动执行。
1 2 3 4 5 6 7 8
| <?php class Student { public function __construct() { echo '这是构造方法<br>'; } } new Student(); new Student();
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?php class Student { private $name; private $sex; public function __construct($name,$sex) { $this->name=$name; $this->sex=$sex; } public function show() { echo "姓名:{$this->name}<br>"; echo "性别:{$this->sex}<br>"; } }
$stu=new Student('tom','男'); $stu->show();
|
注意:构造函数可以带参数,但不能有return。
析构方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php class Student { private $name; public function __construct($name) { $this->name=$name; echo "{$name}出生了<br>"; } public function __destruct() { echo "{$this->name}销毁了<br>"; } }
$stu1=new Student('tom'); $stu2=new Student('berry'); $stu3=new Student('ketty'); echo '<hr>';
|
留心:析构函数不可以带参数
继承
- 继承使得代码具有层次结构
- 子类继承了父类的属性和方法,实现了代码的可重用性。
- 使用extends关键字实现继承
- 父类和子类是相对的
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?php
class Person { public function show() { echo '这是人类<br>'; } }
class Student extends Person { }
$stu=new Student; $stu->show();
|
执行过程:
第一步:在Student类中查找show(),如果找到就调用,找不到就到父类中查找
第二步:在Person类中查询show()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?php
class Person { public function show() { echo '这是人类<br>'; } }
class Student extends Person { public function test() {
$this->show(); } }
$stu=new Student; $stu->test();
|
1、方法一:通过实例化父类调用父类的成员
2、方法二:通过$this关键字调用父类的成员
protect
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| <?php class A { protected $num=10; } class B extends A { public function getNum() { echo $this->num; } }
$obj=new B(); $obj->getNum();
<?php class A { public function getNum() { echo $this->num; } } class B extends A { protected $num=10; }
$obj=new B(); $obj->getNum();
<?php class A { public function getNum() { echo $this->num; } } class B extends A { protected $num=10; }
$obj=new A(); $obj->getNum();
|
1、如果子类有构造函数就调用子类的,如果子类没有就调用父类的构造函数。
2、子类的构造函数调用后,默认不再调用父类的构造函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?php class Person { public function __construct() { echo '这是父类<br>'; } } class Student extends Person { public function __construct() { Person::__construct(); parent::__construct(); echo '这是子类<br>'; } }
new Student();
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| <?php class Person { protected $name; protected $sex; public function __construct($name,$sex) { $this->name=$name; $this->sex=$sex; } } class Student extends Person { private $score; public function __construct($name,$sex,$score) { parent::__construct($name,$sex); $this->score=$score; } public function getInfo() { echo "姓名:{$this->name}<br>"; echo "性别:{$this->sex}<br>"; echo "成绩:{$this->score}"; } }
$stu=new Student('tom','男',88); $stu->getInfo();
|