本来就是学习笔记,就不说废话了
参考
陈惠贞 , 陈俊荣.PHP 7&MySQL跨设备网站开发[M].北京:清华大学出版社,2017
简介
PHP(”PHP: Hypertext Preprocessor”,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 web 开发。
PHP 能做很多事。PHP不仅是生成网页,了解更多参考PHP 手册,我主要用来开发网站。
搭建环境: 网页服务器Apache+PHP7+数据库MySQL 搭建方法:WAMP
PHP文件
- PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码
- PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器,用户看不到php代码
- PHP 文件的默认文件扩展名是 “.php”
用文本编辑器创建,拓展名为php的文件,浏览器打开127.0.0.1/…
例 创建hello.php
<?php
echo hello world
?>
1.php标记
当解析一个文件时,PHP 会寻找起始和结束标记,例如 <?php 和 ?>,而标记之外的内容会被PHP解析器忽略,例如PHP与html混写时,被PHP解析器忽略的部分直接输给浏览器,由浏览器表达
开始和结束的种类
1
<?php
php代码
?>
2.
<script language="php">
php代码
</script>
3.
<?
php代码
?>
4.
<%
php代码
%>
注:
- 种类1和2总是可以用的,而且推荐使用
<?php PHP代码 ?>
- php标记和php代码之间最好以空格或回车隔开
-
短标记(种类3)仅在通过php.ini配置文件中的指令 short_open_tag打开后才可用,或者在 PHP 编译时加入了
--enable-short-tags
选项。 -
ASP风格标记(种类 4)仅在通过php.ini配置文件中的指令 asp_tags打开后才可用。
2.分号(指令分隔符)
同 C 或 Perl 一样,PHP 需要在每个语句后用分号结束指令。 注:
- 在一段php代码段(
<?php 代码1;代码2;代码3;?>
)最后一个代码后面的分号;可省略,即省略代码3后面的分号;
- 在php文件的末尾,最后一个php结束标记可不写,但最后一个代码后面的分号必须写
例如a.php内所有内容
<?php echo hello; echo hello ?> <?php echo hello; echo hello;
3.注释
PHP 支持 C,C++ 和 Unix Shell 风格(Perl 风格)的注释
- 单行注释
#注释内容 //注释内容
- 多行注释
/*注释内容 注释*/
注:
- 单行注释仅仅注释到行末或者当前的 PHP 代码块结束标志,也就是说单行注释 #与//能识别php结束标记,即如果注释所在行出现?>则意味着注释结束,同时该php段结束 不过,</script> 标记在单行注释中不会跳出 PHP 模式。
- 多行注释不支持嵌套,注释在遇到第一个*/就结束注释,例如
<?php echo hello; echo hello; /* 注释1/* 注释2*/注释 3 */ #注释有效范围在第一个*/之间,也就是说注释1和注释2有效,注释3*/会被php解释器当作代码解释,极易发生错误 ?>
- 注释方式仅在php标记内有效,如果混写html代码时,php外用html注释方式
<!--注释-->
4.备注
4.1 php与html的混写
因为php只解释php标记内的内容,因此可以使 PHP 嵌入到 HTML 文档中去,由浏览器解释html标签
- 混写示例 index.php
<!doctype html>
<html>
<head>
<title>标题</title>
</head>
<body>
<?php
echo hello
?>
</body>
</html>
- 使用条件的高级分离术 PHP 将跳过条件语句未达成的段落,即使该段落位于 PHP 开始和结束标记之外,因此 PHP 会根据条件来忽略html代码。 例pp.php
<!doctype html>
<html>
<head>
<title>标题</title>
</head>
<body>
<?php
if(1) #if (1)一定成立
{
?>
<h6>成立部分会显示</h6>
<!--php标记外,用html注释方式-->
<!--分代码两侧为php执行的部分,所以,这部分的html代码会被浏览器接收到-->
<?php
}
else #else肯定不成立了
{
?>
<h6>不成立的部分不显示</h6>
<!--php代码执行的部分,html代码也不会被浏览器接收-->
<?php
}
?>
</body>
</html>
输出为
- 在浏览器上查看网页源端代码时,不会查看到php的源代码,例如上述pp.php生成网页,在浏览器上右键查看源代码为
<!doctype html>
<html>
<head>
<title>标题</title>
</head>
<body>
<h6>成立部分会显示</h6>
<!--php标记外,用html注释方式-->
<!--分代码两侧为php执行的部分,所以,这部分的html代码会被浏览器接收到-->
</body>
</html>
4.2 php Manual的建议
- 如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记。这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图
- 如果将 PHP 嵌入到 XML 或 XHTML 中则需要使用 <?php ?> 标记以保持符合标准。
数据类型
如果想查看某个表达式的值和类型,用 var_dump()
标量型
1整数int
- 十进制0或者非0开头, 十六进制( 以 0x 为前缀)或八进制(前缀为 0)
2浮点数float
- 小数,例
1.5
- 指数,例
1.5e5
1.5e5
3布尔bool
- TRUE或者true,False或flase
4 字符串
4.1 单引号
'字母数字。。。等'
注:
- 除\‘代表引号,\\代表\,无其他转义字符
- 变量$X也不会被替换
- 可以录入多行,换行等于空格,如
echo 'hello
world'
4.2 双引号
"字符串 $变量名 等"
注
- 变量$X会被替换为变量本身值
- 支持转义字符
- 单引号不需要转义
序列 | 含义 |
---|---|
\n | 换行(ASCII 字符集中的 LF 或 0x0A (10)) |
\r | 回车(ASCII 字符集中的 CR 或 0x0D (13)) |
\t | 水平制表符(ASCII 字符集中的 HT 或 0x09 (9)) |
\v | 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起) |
\e | Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起) |
\f | 换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起) |
\\ | 反斜线 |
\$ | 美元标记 |
\” | 双引号 |
\[0-7]{1,3} | 符合该正则表达式序列的是一个以八进制方式来表达的字符 |
\x[0-9A-Fa-f]{1,2} | 符合该正则表达式序列的是一个以十六进制方式来表达的字符 |
4.3 heredoc 句法结构
类似bash中的一样,如下,注结束定界符EOF所在行除了EOF(或者后面有个分号;)外不能有任何其他字符。 其他语法与双引号”一样
$y=<<<EOF
hello
EOF;
4.4 nowdoc语法
即在heredoc基础上在开始定界符EOF两侧加上单引号 语法与单引号’一样
$y=<<<'EOF'
hello
EOF;
4.5 大括号{}
的用法
在双引号的语法中,可以替换变量$x
的值
- 当字符串和变量名相接时可以使用
字符串${变量名}字符串
结构或者字符串{$变量名}字符串
- 但是
echo "hello${a}world"
不会报错echo hello${a}world
会报错,所以加上引号 - 只有
$
紧挨着{
时才会被识别,否则正常输出{
,可以用{\\$
来表达{$
例$f='hello'; echo "{$f}</br>"; echo "{ $f}</br>"; //{与$之间有空格 echo "{\$f}</br>"; // \$转义
结果为
hello { hello} {$f}
特殊类型
1. NULL
UNLL表示一个变量没有值,下列情况的变量被认为是NULL 被赋值为NULL,尚未被赋值,被 unset()
var_dump(null);
var_dump(NULL);
var_dump($no_define); //随便写的一个没定义的函数
结果为NULL NULL NULL
只有类型没有值
NULL不区分大小写
2. 资源
对象
在后面专门讲
变量&数组
1.变量
- 变量名是区分大小写的
- 不必向 PHP 声明该变量的数据类型,PHP 会根据变量的值,自动把变量转换为正确的数据类型,而且可以随时改变变量的数值、类型
$this 是一个特殊的变量,它不能被赋值
1.1定义使用
$变量名=值
- 变量赋值使用过程中必须有$,即
$变量名
&$变量名
代表变量的地址$$变量1
代表以变量1的的值为变量名的变量,例$b1=hello; $$b1=world; echo $hello; #显示为world,$$b1即为$hello
1.2作用范围
全局,局部在函数部分细说
1.3 系统变量
$this代表当前对象 魔术变量,后面讲
1.4 常量
- 常量使用const 定义,
const 常量名=值
,定义和使用过程中都没有$,常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用
2数组
- 数组大小无须声明
- 数组元素类型不用相同
2.1定义使用
- 数组结构
key | key1 | key2 | key3 | … | keyN |
---|---|---|---|---|---|
值 | 值1 | 值2 | 值3 | … | 值N |
默认key为0,1,2,3,…,N,与C语言相同$数组名[N]
,PHP可以自定义key$数组名[key]
,key为整数或字符串
- 定义一维数组
#使用array()函数定义
$数组名=array(值1,值2,值3);
$数组名=array(key1=>值1,key2=>值2,key3=>值3);
#直接赋值
$数组名[key]=值
//例
$myarray=array('shandong'=>'济南','beijing'=>'北京');
$myarray['jiangsu']='南京';
- 定义高维数组
以二维为例
$数组名=array(KEY1=>array(key1=>值11,key12=>值2,key13=>值3),KEY2=>array(key1=>值21,key2=>值22,key3=>值23))
2.2 数组函数
查表就好了,略
2.3 备注
对于高维数组,例如二维数组$myarray[0][1]
与变量等价,$myarray[0]
与数组等价,因此
$darray[0][0]='hello';
$darray[1]=100;
$darray[1][0]=100; //这行是在编辑器里是第39行
报错Warning: Cannot use a scalar value as an array in C:\AppServ\www\ar.php on line 39
因为$darray[1]=100;
这条代码说$darray[1]
与变量等价了,那么就不能再利用$darray[1][0]
,应该和地址之类的有关吧,c语言的东西忘记了
运算
算数运算符
直接算就好了。。。
字符串运算符
连接字符串.(就是这个点)
$a=字符串a.字符串b
.
和数字之间要用空格隔开
比较运算符
位元算符
注意& |
一个是位运算符,&& ||
两个的是逻辑运算符
逻辑运算符
条件运算符
条件表达式 ? 表达式1 : 表达式2
条件表达式位true时返回表达式1的值,false为表达式2
错误控制运算符@
@命令
就不会显示错误信息了 但是@不能加在函数定义,类定义或流程控制等语句前面
执行运算符-重音符
`
类似bash里面的`
格式 `shell命令`
例
$a=`ping 127.0.0.1`;
echo $a;
流程控制
if
表达式两端必须为括号(),即使表达式只有一个数字
if (表达式)
{
命令;
}
elseif (表达式) //elseif可以有很多次,也可无
{
命令;
}
else //最后为else,也可无
{
命令;
}
switch
表达式两端必须为括号(),即使表达式只有一个数字 注意每个case都跟着一个break,不然会执行到break为止
switch (表达式)
{
case 值1:
命令;
break;
case 值2:
命令;
break;
case 值3:
命令;
break;
default:
命令;
}
for
for (初始条件;判断表达式;循环一次后操作)
{
命令;
}
foreach
结合数组使用
foreach ($一维数组名 as $value)
{
命令
}
value会依次取遍一维数组里面的值,若是二维数组名,则value每次循环都为字符串Array value可自定义为其他变量名
foreach ($数组名 as $key => $value)
{
命令
}
key和value会依次取一维数组里的key和值,key和值可自定义为其他变量名
while
while (表达式)
{
命令;
}
do..while
while(表达式)最后别忘了分号;
do
{
命令;
}
while(表达式);
break continue exit()或者die()
- break 结束循环
- continue 返回循环开头
- exit() 结束循环并返回,同时结束整个程序的执行,后面的代码也不继续执行了
exit()参数为0~254的整数时,终止网页上不显示信息,整数代表错误码
exit()参数为字符串时,终止并在网页上显示信息,’8’表示字符串,’表示数字
例
exit('文件打开失败')
- die()与exit()用法一样
函数
- 函数名是大小写无关的,不过在调用函数的时候,使用其在定义时相同的形式是个好习惯
1.定义
function 函数名 ( 输入参数1,输入参数2):返回值类型
//可无输入参数,可不写返回值类型
{
命令;
return; // 或return 返回值;
}
- 输入参数例
$x,$y
类似matlab,也可为地址&$z
,类似c语言 - 返回值类型(PHP7新功能),不写则默认返回return后面的值,如果写返回值类型,则进行格式转换
- 函数默认执行到大括号结束处,如果要提早离开函数,可以早使用return语句
例
function nam() :bool //返回类型设置为bool型
{
return (int)1; //函数内部返回int型1
}
$han=nam();
echo var_dump($han);
//var_dump()函数返回输入参数的类型和值
//结果为bool(true)返回值类型已由int转为bool
2. 函数的位置
正常情况下,函数的定义和函数的调用是没有位置要求的 但是当函数在一些可能不会被执行或者还没执行的{}内时:
2.1 在函数内定义的函数
- PHP 中的所有函数和类都具有全局作用域,可以在函数1内定义函数2,然后在其他地方调用这个函数,在函数1外定义函数2,也可以在函数1内调用函数2
- 在函数1内定义函数2时,只有函数1被执行过一次,才能使用函数2,而且如果函数2的定义前已执行return命令,则依然无法定义
也就是说,得让系统在执行函数1时”看到“函数2
例
//此处可以调用函数nam,不能调用函数nam1 $han=nam(10); //已执行过nam,系统已知道有个nam1函数,可以执行nam1函数了 $han1=nam1(20); function nam($b) { function nam1($a) { return $a; } return (int)$b; }
2.1 在条件内定义函数
- 当函数在条件判断的语句内定义式,只有在函数定义所在处被执行,才能调用函数,同时函数的调用也必定是在函数定义之后
例
//此时系统没见过han1和han2都不可以调用 if (false) {function han1() {return 'han1'; } } else {function han2() {return 'han2'; } } echo han1();//han1函数定义所在处未被执行,系统不认识han1(),执行失败 echo han2();//han2函数的定义被系统看见了,调用正常
3. 参数
3.1 传值调用
function han($a,$b);
3.2 传址调用
function han(&$a,&$b)
//&为取地址符
很类似c语言里的传值传址调用
3.3 设置参数默认值
即如果调用函数时未提供参数,默认的参数
function han($a=默认参数)
3.4 可变长参数列表
- PHP5.6以后可以,不指定参数个数,输入的参数,变成一个数组,在函数内调用数组的每个元素,即可使用每个参数
function han(...$a) //a为传入的所有参数构成的数组名 //注意仅多了三个点...
4. 变量的作用域,生存期
4.1 局部变量
- 在函数内定义和使用的变量,一般函数调用结束后就释放掉了,下次再调用函数跟第一次调用一样
- 传递给函数的参量,调用后释放
- 静态变量,函数调用后,静态变量的值不被释放,下次调用函数使用上次的值,定义语句
static $a=值
只在第一次调用函数时有效,变量的值一直保存 例function han() {static $a=0; //定义静态变量 $a=$a+1; echo $a; } han(); //显示1 han(); //显示2,说明静态变量a的值再调用后没有释放
4.2 全局变量
- 在函数外定义的变量
- 在函数内调用全局变量 ` global $变量名 `
例
<?php $a="hello,world"; //定义全部变量$a function hello() {global $a; //调用全局变量$a echo $a;} hello(); ?>
5. 备注
5.1 匿名函数
从PHP5.3开始支持匿名函数 格式
$han = function($a)
{
echo $a;
}; //注意这个分号;别漏了,这算是对变量han的定义,所以要有分号;结束
$han('apple'); //使用$han调用
猜测han指定为函数的地址之类的了,c语言地址的知识忘记了,不是很确定
5.2 可变函数
当某个变量后面跟着小括号()时,PHP会找出这个变量所代表的值,然后执行同名的函数 例
function han()
{echo 'hello';
}
$test="han";
$test(); //注意因为$test才能说明test是变量,所以必须要有$
内建函数
查表吧
常用函数
echo
- 格式
echo 字符串
或echo(字符串)
- echo 是语言结构,没有返回值,不能作为表达式
- echo 可以输出一个或多个字符串,例
echo "hello","world";
,但是echo()括号内好像只能接受一个字符串 - 字符串里可包含html代码,例
echo "hello<br>world"
,注意html代码要在字符串内部,或者两边有引号
print
- 格式
print 字符串
或print(字符串)
- print是函数,字符串成功显示返回true,失败返回false,可以作为表达式
- print 只允许输出一个字符串,例
print "hello"."world";//而不能print "hello","world"
- 字符串里可包含html代码
var_dump()
输出变量的类型、长度、数值 长度为1的例如整数就不显示个数了 如果是数组,则展示数组,元素数,key和值
例
$a="hello";
$b=array(1,2,3,4);
$c=10;
$e=array(array(1,2),array(3,4));
var_dump($a);
echo "<br>";
var_dump($b);
echo "<br>";
var_dump($c);
echo "<br>";
var_dump($e);
结果为
histring(5) "hello"
array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) }
int(10)
hiarray(2) { [0]=> array(2) { [0]=> int(1) [1]=> int(2) } [1]=> array(2) { [0]=> int(3) [1]=> int(4) } }
include'文件'
和 require'文件'
引入文件,等价于把引入文件的源代码复制粘贴到此处(在服务器执行它之前)
include 和 require 语句是相同的,除了错误处理方面:
- require 会生成致命错误(E_COMPILE_ERROR)并停止脚本
- include 只生成警告(E_WARNING),并且脚本会继续
包含文件省去了大量的工作。可以为所有页面创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,只需更新这个页头包含文件即可。
对象
类似c语言的结构体
- 类 是对象的格式(模板),规定了具体哪些属性(变量)和方法(函数)
- 对象 类的具体化,基于类创建的一种类型
如果以汽车对比的话如图,不过我感觉学过c语言结构体的人马上就懂了
1.类
1. 1 格式
定义
class 类名 //子类的定义为 class 子类名 extends 父类名
{
属性的访问级别 $变量名=值; //也可只定义不赋值
方法的访问级别 function 函数名()
{
函数体
}
const 常数名=值; //定义常数的方法,注意常数名前没有$,常数名习惯大写,使用时也没有$
//还可以有构造函数,析构函数
}
1.2 说明
-
class 用于定义类
- 属性 就是存放数据的变量
- 方法 就是类内的函数
- 类内的函数和类外的函数一样,变量也有局部和全局变量之分
- 可在类外或者其他类内调用类内定义的变量/函数,使用::进行调用,能否调用由访问级别决定
例
类名::函数名()
- 访问级别 就是变量或者函数的作用域 有
访问级别 | 作用域 |
---|---|
public或者var | 任何程序代码访问 |
protected | 能被其所在类内访问,子类可以访问 |
private | 只能被其所在类内访问,子类不能访问 |
变量必须指明访问级别,函数不指明则默认为public
-
常量使用const 定义,
const 常量名=值
,定义和使用过程中都没有$,常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用 - 继承 在定义一个新类的时,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容,称这个新类继承了旧类
- 父类 一个类被其他类继承,可将该类称为父类,或基类,或超类
- 子类 一个类继承其他类称为子类,也可称为派生类
- 一个类可以是一个类的父类,另一个类的子类
- 子类可以继承父类的非私有(private)变量/函数
- 如果子类对父类中出现的变量/函数重新定义,则使用子类的定义,称为覆盖,调用被覆盖的变量/函数可以
父类名::变量/函数
或parent::变量/函数
,就是正常的调用方法 - PHP中子类最多只能继承一个父类
定义方法
class 子类名 extends 父类名 { }
- 特殊的类名
自身 self
父类 parent 例调用类自身中的函数除了上述方法还可以parent::函数名()
- 例
class lei { public $a=1; function han() //类内函数,访问级别默认public { echo "</br>hello明</br>"; } function test() { echo lei::PI; //调用类lei内的PI常数,也可以self::PI self::han(); //调用自身的han()函数 echo lei::$a;//函数体内没有变量$a,需要lei::$a或者self::$a来调用类内的变量 } } class zilei extends lei //创建继承lei的子类zilei { function test() //重写test函数,使用zilei类时,以重定义的为准,不影响父类中的定义使用 { echo hello; each parent::$a; //调用父类中的$a,也可以lei::$a } lei::test() //调用lei内的test()函数
2. 对象
2.1 格式
定义
$对象名=new 类名(); //如果有输入参数在()内输入
匿名定义,和匿名函数一样
$对象名=new class(输入参数)
{
类语句;
}; //这里的分号;要有,和匿名函数一样嘛
也有类似可变函数,字符串()表示相应函数,new 字符串表示创建对象的定义方法
使用
$对象名->变量名=值; //注意变量名前没有$
$对象名->函数名();
特殊的对象名:$this代表当前对象,可在类内使用
3. 更多内容
3.1 构造函数&析构函数
- 构造函数是用来将对象初始化的函数,在创建对象时自动执行
有无参数都可,参数是在
__construct()
里面定义的,不是在类名后面,没有返回值
function __construct (输入参数) //注意是两个下划线和construct
{
}
- 析构函数是在释放对象时自动执行的函数
没有参数,没有返回值
function __destruct () //注意是两个下划线和construct { }
- 例
class lei
{
public $name;
function __construct($str)
{
$this->name=$str; //$this代表当前对象
echo "已成功创建名字为{$this->name}的对象</br>";
}
function __destruct()
{
echo "已成功释放对象";
}
}
$duix=new lei("小明");
$duix=NULL;
运行结果
已成功创建名字为小明的对象
已成功释放对象
3.2 抽象方法/抽象函数
- 抽象类,如果类内定义了一个抽象函数,则他必须也定义为抽象类
abstract class 抽象类名
- 定义为抽象的类不能用于定义对象,会报错
Fatal error: Uncaught Error: Cannot instantiate abstract class 抽象类名
- 抽象类内的抽象函数只能说明参数,不能有函数具体形式,即只能写
abstract funtion 函数名(输入参数)
后面不能再有{}包含的函数体,否则报错Abstract function 抽象类::抽象函数() cannot contain body
- 抽象类内非抽象函数不受限制
- 子类继承抽象类,子类内必须定义父类中的抽象函数,而且输入参数必须与抽象函数,访问级别和父类相同或着比父类更宽松,可以简单理解为写父类抽象函数的函数体
例
abstract class chou //定义抽象类
{
abstract function fun1($a,$b); //抽象函数,不能有函数体
}
class zichou extends chou //定义子类,父类是抽象类chou
{
function fun1($a,$b) //必须定义与抽象函数相同的函数
{
echo "$a"."$b";
}
}
3.3 final
PHP 5 新增了一个 final 关键字。
- 如果父类中的方法(函数)被声明为 final,则子类无法覆盖该方法
final republic function 函数名() //函数名前单词较多,别忘记了
{函数体
}
- 如果一个类被声明为 final,则不能被继承。
3.4 static
- 在类内定义 static 变量便可以在类外访问,否则会报错
- 函数无论是否static 都可被访问 定义方法
static 访问级别 $变量名
static 访问级别 function 函数名()
{
}
例
class lei
{
static public $hel=5; //变量前参数多,容易漏写
public $he=6;
static function fun()
{
echo hello1."<br>";
}
function fun2()
{
echo hello2."<br>";
}
}
echo lei::$hel;
echo lei::$he; //会报错,不能使用非static变量
lei::fun();
lei::fun2();
3.5 接口(不知道干什么用的?)
- 使用接口(interface),可以在接口中指定类必须包含的方法(函数)
- 不能在接口内定义函数体,而且访问级别只能是public型,这是接口的特性
- 只能在类中定义函数体,访问级别必须与接口内相同,因此只能public
接口格式
interface 接口名
{
public function 函数名(); //public可省略
}
使用接口的类
class 类名 implements 接口1,接口2,接口3... //可以有1到多个接口
{
function 函数名() //必须有每个接口的函数
{
echo hello;
}
其他接口函数
}
例
interface jiekou //定义接口jiekou
{
public function fun(); //接口函数
}
interface jiekou2 //定义接口jiekou2
{
function fun2(); //接口函数类型只能public或不写(就代表public)
}
class lei implements jiekou,jiekou2 //定义类lei,接口有jiekou,jiekou2
{
function fun()
{
echo hello;
}
function fun2()
{
echo world;
}
}
命名空间 namespace
变量、数组不受命名空间的影响 类/函数/常量 须使用命名空间前缀(不带前缀表示当前命名空间)
1. 简单认识命名空间
1.1 文件夹&文件 命名空间&类/函数/常量
- 命名空间和类/函数/常量的关系类似与文件夹和文件的关系,同一文件夹(命名空间)内文件(类/函数/常量)不能重名,而不同文件夹(命名空间)下可以重名
- 我们可以通过 目录+文件名来使用某一文件如
C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
同样,我们也可以使用命名空间+类/函数/常量来使用某一命名空间的类/函数/常量
- 如下代表根命名空间(全局空间)中的命名空间1中命名空间2内的类/函数/常量,与目录的绝对路径类似
\命名空间1\命名空间2\类/函数/常量
- 如下代表当前命名空间下面的命名空间1下的类/函数/常量,与目录的相对路径类似
命名空间1\类/函数/常量
- 如下代表当前命名空间下面的类/函数/常量
类/函数/常量
- 进入命名空间就像进入文件夹一样(不存在这一命名空间则自动创建),然后在这个命名空间(文件夹)下进行各种操作,例如创建类/函数/常量等
1.2 PHP中的namespace 与 shell 里的 cd
-
默认情况下(不使用namespace时),所有变量、数组,常量,类和函数,等都放在全局空间(理解为根命名空间)下
- namespace类似与shell中的cd命名,可以使用namespce 切换命名空间,例进入某一目录
cd \home\chen
,对于命名空间namespace 命名空间路径
, - 相对于cd而言 namespace 后面只能是绝对路径(命名空间的绝对地址),而且根目录(全局空间)不写斜杠\,默认开头就是全局空间下,不同于:命名空间中的类/函数/常量支持相对路径和绝对路径,而且使用类/函数/常量时根目录(全局空间)要加\
namespace 命名空间1;
# 代表进入全局空间下的命名空间1,绝对路径
namespace 命名空间1\命名空间2;
# 代表进入全局空间下的命名空间1下的命名空间2
命名空间1\类/函数/常量 ,绝对路径
# 当前命名空间下面的命名空间1下的类/函数/常量,相对路径类似
\命名空间1\命名空间2\类/函数/常量
# 根命名空间(全局空间)中的命名空间1中命名空间2内的类/函数/常量,绝对路径
- 要么不用namspace,所有类/函数/常量全在全局空间下面
- 要么用namespace,则必须在文档的开头就使用namespace表示所在命名空间,且无法切换到全局空间创建使用类/函数/常量
2. 语法
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句,例declare(encoding='UTF-8')
,其他所有代码包括空白符,html标签都不能出现在命名空间的声明之前。
2.1 使用/切换命名空间格式
分号法
<?php
namesapce 命名空间名1;
php代码。。。
namesapce 命名空间名2;
php代码。。。
?>
大括号法
<?php
namesapce 命名空间名1
{
php代码。。。
}
namesapce 命名空间名2
{
php代码。。。
}
?>
全局命名空间
namespace
{
}
- 使用大括号{表示或者分号;表示,两种方法不能混用,所以要使用全局命名空间只能使用大括号{表示法
2.2 使用命名空间中的类/函数/常量
注意:变量,数组不受命名空间影响
格式:路径\类/函数/常量
2.2.1 不写路径,表当前
例如 $a=new foo();
或 foo::staticmethod();
。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\foo,
如果当前空间没有则为全局空间下类/函数/常量,即\类/函数/常量
2.2.2 相对路径,当前下
例如 $a = new subnamespace\foo();
或 subnamespace\foo::staticmethod();
。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo
2.2.3 绝对路径,\开头
例如, $a = new \currentnamespace\foo();
或 \currentnamespace\foo::staticmethod();
,foo 被解析为\currentnamespace\foo
3.别名/导入命名空间
可以理解为建立了一个快捷方式,不过该快捷方式仅在该命名空间下有效 仅支持给命名空间和类建立别名
3.1 语法
- user 路径\命名空间/类 as 别名
- user 路径\命名空间/类,别名默认为命名空间/类的名字
- user 路径\命名空间/类 as 别名,user 路径\命名空间/类,用逗号隔开多个别名语句
例
<?php namespace hello\hi { $a=1; function han1() { echo hello; } } namespace { use \hello\hi; //别名,默认为hi hi\han1(); //使用hi替代\hello\hi } ?>
3. 备注
特殊的关键字
namespace
即可以切换命名空间,也表示当前命名空间的路径
__NAMESPACE__
魔术变量表示当前命名空间的名称(字符串)
魔术变量
__LINE__
文件中的当前行号。
__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.0 起,PHP 实现了代码复用的一个方法,称为 traits。
Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
###__METHOD__
类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
###__NAMESPACE__
当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。
显示时间
1. 时间 date()
date() 函数用于格式化时间/日期
1.1 格式
date("返回格式",指定时间戳)
date()返回值类型为字符串,返回UNIX时间戳,从1970/1/1到当前或者指定的时间戳 返回格式为单个字母,可连续写可用符号隔开 指定时间戳,不写默认为当前时间
1.2 返回格式
参见date — 格式化一个本地时间/日期
例
<?php
echo date("TYmd l g:i:s A")
?>
结果
UTC20170822 Tuesday 12:01:50 PM
显示的时UTC的时间,而我们处在东八区 可以
<?php
date_default_timezone_set('Asia/Shanghai');
echo date("TYmd l g:i:s A")
?>
结果
CST20170822 Tuesday 8:10:24 PM
更多参考PHP中关于时间(戳)、时区、本地时间、UTC时间等的梳理
本文首发于我的博客@cndaqiang.
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!