都说PHP是世界上最好的语言,我今天就要来领教一下,这篇文章主要记录PHP比较奇特的语法。

大小写问题

PHP语言中,变量名称是大小写敏感的,而对于函数,方法,类名是大小写不敏感的。

局部变量和全局变量

PHP的变量首先需要再前面加上资本主义的符号: $ ,这样才会被识别为变量,并且它不需要声明,使用方法和Python是一样的。

1
2
3
4
5
<?php
$X=123456;
$y=123456;
echo $x+$y;
?>

这里在函数里面声明的局部变量是没有办法被其他函数或者全局命令使用的,但是全局变量可以被各种函数里面使用,但是再函数里面调用全局变量的时候,就需要使用关键词 global 才可以。

1
2
3
4
5
6
7
8
<?php
$x=123;
function text()
{
global $x;
echo $x;
}
?>

Static作用域

当我们在函数内部申明了一个局部变量的时候,一旦这个函数执行完毕,那么这个局部变量的内存就会被释放,也就是这个变量消失了。如果你想要记录下来这个局部变量的值来供下次使用,除了使用全局变量以外,还有另外一种更加方便的使用方法,就是在函数内部声明局部变量的时候使用 static 语句,这样在第二次调用这个函数的时候,它能保留上一次这个函数里面记录的值,很好的保证了封装性。

echo 语句

这个东西是PHP的输出语句,和print用法一样,什么都能输出,输出的时候,变量可以加在字符串里面(这大概就是资本主义符号的作用了吧),并且可以同时输出多个变量,加上逗号就可以了,注意同时输出的两个变量:

1
2
3
4
<?php
$name="Xorex";
echo "MY name is $name"," readlly!";
?>

EOF 字符串

在Python里面,有一个'''符号是用来原封不动的保存一个多行字符串,非常方便,PHP里面也有这种功能,不过激活码是:<<<EOF 结束码是:EOF

这里面的EOF可以换成其他字符,不过我建议还是使用EOF吧,毕竟 End Of File 挺适合这里的,其次这里面是可以加入变量的,又是资本主义符号的好处。

1
2
3
4
5
6
7
8
9
<?php
$KM="katou Megumi";
$name= <<<EOF
Tempest
Xorex
$KM
EOF;
echo $name;
?>

里面可以解析 THML 的相关符号,比如换行啥的,挺方便。

条件语句

这里的IF条件语句和C++的语句使用方法是完全相同的。

数据类型

  1. 字符串(String):

    单引号双引号均可,可解析HTML元素。

  2. 整形(Integer):

    可以使用十进制,十六进制(0x),八进制(0) 来赋值运算,不内置高精度。

  3. 浮点型(Float):

    和C++的浮点型是一样的,没什么可说的。

  4. 布尔型(Boolean):

    使用的是小写的 true 或者 false

  5. 数组(Array):

    需要使用函数array()来创建一个数组。

    1
    2
    3
    4
    <?php
    $a=array("gg",12312,false,12312.232);
    echo $a[0],$a[1],$a[2],$a[3];
    ?>

    后面会有更多内容。

  6. 对象(Object):

    同样是大家伙,使用的是class 关键字,里面可以声明各种变量和函数,很有面向对象的感觉!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    class Xorex
    {
    $ID="Tempest Xorex";
    $High=185;
    function jump()
    {
    $High+=20;
    $High-=20;
    }
    }
    ?>
  7. 空值(NULL):

    故名思意,就是没有值的意思,可以用来清除变量里的数据:

    1
    2
    3
    4
    <?php
    $Xorex="Strong";
    $Xorex=NULL;
    ?>

比较符号

主要是PHP有两个概念,一个是松散比较:==,一个是严格比较:=== 松散比较是不比较类型的,比如1和ture和’1’,0和’0’和NULL和false,在松散比较里都是相等的,但是如果是严格比较,那么必须是同类型才能满足相等,也就是完全相等。

注意的是数组也可以比较是否相等,如果是 == 的话,是比较数组里面是否有相同的键/值对,不需要保证顺序相等就可以返回True,但是如果是 === 的话,就需要键/值对的顺序也要严格的相等了。

同样,!= 是不等于, !== 这种是绝对不等于。其他就没有了。

常量

这里和C++的常量 define 用法是差不多的,具体的格式如下:

1
2
3
4
<?php
define("Tempest",123,true);
echo Tempest;
?>

第一个参数是字符串,表使常量名称,不需要资本主义符号,第二个参数是常量的实际数值,可以是任何类型,最后一个可填可不填,默认是true,表示的是常量名称是否大小写敏感。

字符串

PHP中字符串的运算只有一种就是:. ,这个点的计算就是将两个字符串连接起来,这种运算适用于所有的变量类型。

1
2
3
4
5
<?php
$Last_Name="Tempest";
$First_Name="Xorex";
echo $First_Name . " " . $Last_Name;
?>

里面还有几种比较方便的函数,strlen(string) 可以返回字符串string的字节数(ASCII对应的就是长度),strpos(text,string) 函数,用来匹配text文本里面是否有string文本,如果有的话返回true,如果没有返回false。

数组

可以使用count(array)函数来返回数组array的长度。

  1. 数值数组:

这个数组和C++中的数组是一样的,只不过在创建的时候需要使用array()函数或者手动下标赋值,使用下标来访问里面存储的元素,可以同时存储不同类型的元素。

1
2
3
4
5
6
<?php
$a=array(1,2.0);
$a[2]=true;
$a[3]="hahaha";
echo $a[0],$a[1],$a[2],$a[3];
?>
  1. 关联数组:

关联数组是指带有指定的键的数组,每个键关联一个值,这和Pyhon里面的字典类似,赋值同样有两种:

1
2
3
4
5
<?php
$a=array("Xorex"=>955,12345=>true);
$a[8989]='Tempest';
echo $a[8989],$a["Xorex"],$a[12345];
?>

如果遍历关联数组则需要foreach 函数;

1
2
3
4
5
6
7
8
9
<?php
$a=array("Xorex"=>955,12345=>true);
$a[8989]='Tempest';
foreach($a as $x_name=>$x_value)
{
echo "Key=" . $x_name . ", Value=" . $x_value;
echo "<br>";
}
?>
  1. 多维数组:

简单来说就是数组套数组,赋值的时候将一个数组赋值给一个数组的元素就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$sites = array
(
"runoob"=>array
(
"菜鸟教程",
"http://www.runoob.com"
),
"google"=>array
(
"Google 搜索",
"http://www.google.com"
),
"taobao"=>array
(
"淘宝",
"http://www.taobao.com"
)
);
print("<pre>"); // 格式化输出数组
print_r($sites);
print("</pre>");
?>

数组排序

下面是排序方法,用到再查:

对于普通数组:

  • sort(array) - 对数组进行升序排列

  • rsort(array) - 对数组进行降序排列

对于关联数组:

  • asort(array) - 根据关联数组的值,对数组进行升序排列
  • ksort(array) - 根据关联数组的键,对数组进行升序排列
  • arsort(array) - 根据关联数组的值,对数组进行降序排列
  • krsort(array) - 根据关联数组的键,对数组进行降序排列

超级全局变量

  1. $GLOBALS

这个东西其实是个数组,里面记录了所有被使用(声明)的全局变量,变量名字就是数组里的键,这个东西在PHP的任何地方都可以进行访问,在函数里面创建一个全局变量的方法中,除了使用global关键词以外,还可以直接将这个变量添加到 $GLOBALS 数组里面。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$a=1;
$b=2;
function add()
{
global $a,$b;
$GLOBALS['c']=$a+$b;
global $c;
echo $c;
}
add();
echo $c;
?>
  1. $_SERVER

这个超级全局变量数组里面包括头,路径,以及脚本位置等等信息数组,这是由web服务器创建的,很多关于服务器的信息都在里面可以访问。

下面是一个 $_SERVER 数组里面包含的内容。

元素/代码 描述
$_SERVER[‘PHP_SELF’] 当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://example.com/test.php/foo.bar 的脚本中使用 $SERVER[‘PHP_SELF’] 将得到 /test.php/foo.bar。__FILE_ 常量包含当前(例如包含)文件的完整路径和文件名。 从 PHP 4.3.0 版本开始,如果 PHP 以命令行模式运行,这个变量将包含脚本名。之前的版本该变量不可用。
$_SERVER[‘GATEWAY_INTERFACE’] 服务器使用的 CGI 规范的版本;例如,”CGI/1.1”。
$_SERVER[‘SERVER_ADDR’] 当前运行脚本所在的服务器的 IP 地址。
$_SERVER[‘SERVER_NAME’] 当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。(如: www.runoob.com)
$_SERVER[‘SERVER_SOFTWARE’] 服务器标识字符串,在响应请求时的头信息中给出。 (如:Apache/2.2.24)
$_SERVER[‘SERVER_PROTOCOL’] 请求页面时通信协议的名称和版本。例如,”HTTP/1.0”。
$_SERVER[‘REQUEST_METHOD’] 访问页面使用的请求方法;例如,”GET”, “HEAD”,”POST”,”PUT”。
$_SERVER[‘REQUEST_TIME’] 请求开始时的时间戳。从 PHP 5.1.0 起可用。 (如:1377687496)
$_SERVER[‘QUERY_STRING’] query string(查询字符串),如果有的话,通过它进行页面访问。
$_SERVER[‘HTTP_ACCEPT’] 当前请求头中 Accept: 项的内容,如果存在的话。
$_SERVER[‘HTTP_ACCEPT_CHARSET’] 当前请求头中 Accept-Charset: 项的内容,如果存在的话。例如:”iso-8859-1,*,utf-8”。
$_SERVER[‘HTTP_HOST’] 当前请求头中 Host: 项的内容,如果存在的话。
$_SERVER[‘HTTP_REFERER’] 引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。)
$_SERVER[‘HTTPS’] 如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。
$_SERVER[‘REMOTE_ADDR’] 浏览当前页面的用户的 IP 地址。
$_SERVER[‘REMOTE_HOST’] 浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。
$_SERVER[‘REMOTE_PORT’] 用户机器上连接到 Web 服务器所使用的端口号。
$_SERVER[‘SCRIPT_FILENAME’] 当前执行脚本的绝对路径。
$_SERVER[‘SERVER_ADMIN’] 该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。(如:someone@runoob.com)
$_SERVER[‘SERVER_PORT’] Web 服务器使用的端口。默认值为 “80”。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
$_SERVER[‘SERVER_SIGNATURE’] 包含了服务器版本和虚拟主机名的字符串。
$_SERVER[‘PATH_TRANSLATED’] 当前脚本所在文件系统(非文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。
$_SERVER[‘SCRIPT_NAME’] 包含当前脚本的路径。这在页面需要指向自己时非常有用。FILE 常量包含当前脚本(例如包含文件)的完整路径和文件名。
$_SERVER[‘SCRIPT_URI’] URI 用来指定要访问的页面。例如 “/index.html”。
  1. $_REQUEST

这个数组用来收集HTML表单调教的数据,比如和Post传过来的信息什么的。

  1. $_POST

这个数组用来收集HTML表单调教的数据,比如和Post传过来的信息什么的。

  1. $_GET

这个数组用来收集HTML表单调教的数据,比如和Get传过来的信息什么的。

魔术常量

魔术常量使用前后两个下划线包裹比如:__LINE__ 就保存着它在第几行,你把它写在第几行,它的值就是几。

其他的就不一一介绍了。

面向对象

和C++是一样的,使用Class 关键字来进行声明一个 类 其中这里面有一个自身变量,可以在函数里面代替外部声明的类名称使用,就是 $this

如果不想声明变量就使用的话,是没有问题的,变量将被默认创建为 public 类型的变量,但是如果要声明变量或者给变量赋初始值的时候,就必须为其标记 public / private 或者 protected 来表明变量的访问权限。

类中的方法不可以声明属性,但是可以声明变量,其仅能在方法中使用。

其次如果要使用Class里面的变量或者函数的话,C++里面是使用 . 来进行引用的,而php是使用 -> 来进行引用,eg:

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 OIer{

public $NOIP_score=0;
public $Live=True;

function NOIP($score)
{
$this->NOIP_score=$score;
if($score<200)
{
$Live=False;
return;
}
}
}

$Xorex=new OIer;
$Xorex->NOIP(400);
echo $Xorex->NOIP_score;

?>
  • 构造函数

类中支持一个构造函数,那就是 __construct() ,可以给类中的变量赋初值,是在创建一个变量的时候就可以使用的。

我们在new 一个对象的时候,可以同时使用 __construct() 直接在类的名字后面把初始化参数传进去。

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
<?php

class OIer{

public $NOIP_score;
public $Live;

function __construct($var1,$var2)
{
$NOIP_score=$var1;
$Live=$var2;
}

function NOIP($score)
{
$this->NOIP_score=$score;
if($score<200)
{
$this->Live=0;
return;
}
}
}

$Xorex=new OIer(0,1);
$Xorex->NOIP(100);
echo $Xorex->Live;
echo $Xorex->NOIP_score;

?>
  • 继承

php也有继承模式,继承就是这个这个类获得另外一个类的所有属性的方法。

当我们访问一个对象的属性或者方法的时候,首先会先从这个类的本身去寻找,如果找不到的话,发现有一个继承关系,然后就会从父类里寻找属性或者方法。所谓重写方法,其实就是在子类中找到了这个方法之后,就停止检索父类了,所以看起来就是重写了方法。

当我们对一个继承了其他类的对象进行序列化的时候,会同时序列化子类和父类的所有属性,并列在一起,无法区分。当然如果父子类里面又名称相同属性的时候,就会有 “重写” 的效果。

  • 类中的静态属性

使用 static 关键字,处于权限声明和属性名称之间,作用和前面的静态变量是相同的。不同的是在这个属性可以在不同的类中共同使用,就和