cndaqiang Web Linux DFT

PHP(一)基础语法

2017-08-13
cndaqiang
web
 
RSS

本来就是学习笔记,就不说废话了

参考

PHP 手册

陈惠贞 , 陈俊荣.PHP 7&MySQL跨设备网站开发[M].北京:清华大学出版社,2017

PHP 教程

PHP 教程

PHP中变量的作用范围

PHP中关于时间(戳)、时区、本地时间、UTC时间等的梳理

简介

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. 种类1和2总是可以用的,而且推荐使用
    <?php   PHP代码   ?>
    
  2. php标记和php代码之间最好以空格或回车隔开
  3. 短标记(种类3)仅在通过php.ini配置文件中的指令 short_open_tag打开后才可用,或者在 PHP 编译时加入了 --enable-short-tags选项。

  4. ASP风格标记(种类 4)仅在通过php.ini配置文件中的指令 asp_tags打开后才可用。

2.分号(指令分隔符)

同 C 或 Perl 一样,PHP 需要在每个语句后用分号结束指令。 注:

  1. 在一段php代码段(
    <?php 代码1;代码2;代码3;?>
    

    )最后一个代码后面的分号;可省略,即省略代码3后面的分号;

  2. 在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 单引号
'字母数字。。。等'

注:

  1. 除\‘代表引号,\\代表\,无其他转义字符
  2. 变量$X也不会被替换
  3. 可以录入多行,换行等于空格,如
echo 'hello
world'
4.2 双引号
"字符串 $变量名 等"

  1. 变量$X会被替换为变量本身值
  2. 支持转义字符
  3. 单引号不需要转义
序列 含义
\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 协议 ,转载请注明出处!


目录

访客数据