20170812PHP学习(一)基础语法

PHP(一)基础语法

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

参考

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


1.php标记

当解析一个文件时,PHP 会寻找起始和结束标记,例如 ,而标记之外的内容会被PHP解析器忽略,例如PHP与html混写时,被PHP解析器忽略的部分直接输给浏览器,由浏览器表达

开始和结束的种类

1
 

2.  


3.  


4.  
<%
php代码
 %> 

注:

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

2.分号(指令分隔符)

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

  1. 在一段php代码段()最后一个代码后面的分号;可省略,即省略代码3后面的分号;
  2. 在php文件的末尾,最后一个php结束标记可不写,但最后一个代码后面的分号必须写
    例如a.php内所有内容
 

3.注释

PHP 支持 C,C++ 和 Unix Shell 风格(Perl 风格)的注释

  • 单行注释
#注释内容
//注释内容
  • 多行注释
/*注释内容
注释*/

注:

  • 单行注释仅仅注释到行末或者当前的 PHP 代码块结束标志,也就是说单行注释 #与//能识别php结束标记,即如果注释所在行出现?>则意味着注释结束,同时该php段结束
    不过, 标记在单行注释中不会跳出 PHP 模式。
  • 多行注释不支持嵌套,注释在遇到第一个*/就结束注释,例如

  • 注释方式仅在php标记内有效,如果混写html代码时,php外用html注释方式

4.备注

4.1 php与html的混写

因为php只解释php标记内的内容,因此可以使 PHP 嵌入到 HTML 文档中去,由浏览器解释html标签

  • 混写示例
    index.php


    
        标题
    
    
        
    

  • 使用条件的高级分离术
    PHP 将跳过条件语句未达成的段落,即使该段落位于 PHP 开始和结束标记之外,因此 PHP 会根据条件来忽略html代码。
    例pp.php


    
        标题
    
    
        
        
成立部分会显示
不成立的部分不显示

输出为

20170812PHP学习(一)基础语法_第1张图片
  • 在浏览器上查看网页源端代码时,不会查看到php的源代码,例如上述pp.php生成网页,在浏览器上右键查看源代码为


   
       标题
   
   
               
成立部分会显示

4.2 php Manual的建议

  • 如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记。这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图
  • 如果将 PHP 嵌入到 XML 或 XHTML 中则需要使用 标记以保持符合标准。

数据类型

如果想查看某个表达式的值和类型,用 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=<<
4.4 nowdoc语法

即在heredoc基础上在开始定界符EOF两侧加上单引号
语法与单引号'一样

$y=<<<'EOF'
hello
EOF;
4.5 大括号{}的用法

在双引号的语法中,可以替换变量$x的值

  • 当字符串和变量名相接时可以使用字符串${变量名}字符串结构或者字符串{$变量名}字符串
  • 但是 echo "hello${a}world"不会报错 echo hello${a}world会报错,所以加上引号
  • 只有$紧挨着{时才会被识别,否则正常输出{,可以用{\$来表达{$
$f='hello';
echo "{$f}
"; echo "{ $f}
"; //{与$之间有空格 echo "{\$f}
"; // \$转义

结果为

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 $变量名

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
    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 "
"; var_dump($b); echo "
"; var_dump($c); echo "
"; 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语言结构体的人马上就懂了


20170812PHP学习(一)基础语法_第2张图片

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 "
hello明
"; } 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}的对象
"; } 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."
"; } function fun2() { echo hello2."
"; } } echo lei::$hel; echo lei::$he; //会报错,不能使用非static变量 lei::fun(); lei::fun2();

3.4 接口(不知道干什么用的?)

  • 使用接口(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 使用/切换命名空间格式

分号法


大括号法


全局命名空间

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 路径\命名空间/类,用逗号隔开多个别名语句

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 — 格式化一个本地时间/日期

20170812PHP学习(一)基础语法_第3张图片
返回格式


结果

UTC20170822 Tuesday 12:01:50 PM

显示的时UTC的时间,而我们处在东八区
可以


结果

CST20170822 Tuesday 8:10:24 PM

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

你可能感兴趣的:(20170812PHP学习(一)基础语法)