2 ;//空格与跳位键
four =
2
+
2;//多行式
把Enter键的行结束符号做为空白是很方便使用的方式,因为这意味着不必确保语法一定位于单一行上,这样在编写程序上能方便很多。
PHP有时会区分大小写
前面已经讲到过PHP并不会过分吹毛求疵,读者可能感到惊讶它有时还是会区分大小写的(即区分英文字母大小写之间的差别)。这一点尤其是在所有变量设定上要注意。如果在HTML页中嵌入这样的程序代码:
capital=67;
Print(“Variable capital is capital
”);
Print(“Variable CaPiTaL is CaPiTaL
”);
?>
输出结果则是
Variable capital is 67
Variable CaPiTaL is
这是因为变量采用不同的大小写,因此就分成二个不同的变量。(令人讶异的是,在预设的除错设置下,类似这样的程序代码片段并不会产生PHP错误。请参见本章后面「未指定的变数」一节。)
另一方面,PHP与C语言不同的是,它的函式名称并不区分大小写,基本语法结构(if、then、else和while等)也是如此。
记述语句是以分号做为结尾
以下是PHP中的一个典型的语句,它把字符串指定给了greeting变量:
greeting=“Welcome to PHP!”;
这个小节的其余内容要介绍的是如何更小的组件来建构这样的语句,以及介绍PHP直译程序如何进行表示的求值运算(如果已很熟悉这些语句和表达式,可以跳过这些内容)。
PHP的最小构造算是不可分的标记(token),例如数字(3.14159)、字符串(〝tow〞)、变量(tow) 、常数(TRUE)和构成PHP本身语法的特殊单字(if、else等),它们相互之间的分隔靠的是空白和其它特殊字符(如图括号和大括号)。
PHP中最复杂的构造是表达式,表达式是具有[值]的标记之任何组合。单一个数字是表达式,单一个变数也是表达式。简单的表达式还可以组合起来构成更为复杂的表达式,通常是透过在表达式之间加上运算子(例如,2+(2+2)),或者把表达式当成函式呼叫的输入(例如,pow(2*3,3*2))。带两个输入的表达式数字当成输入,这样带输入的函式把输入放在函式名称后的括号中,各输入(称为参数)之间会以逗号分隔。
表达式求值运算
无论何时PHP直译器在程序代码中遇到表达式,这个表达式都全被立即进行评估求值。这意谓PHP从表达式最小元素的值开始计算,然后继续组合这些由运算子或函式连接在一起的值,直到生成表达式的整个值。举例说明,求什判断过程中的各步骤在想象中应该如下所示:
result=2*2+3*3+5;
(=4+3*3+5)//想象的估算过程
(=4+9+5)
(=13+5)
(=18)
结果会在result变量中储存了数字18。
优先级、结合性和评算求值的顺序
在PHP表达式评算求值中可能有两类问题:如果对子表达式进行组合或结合,评算求值的顺序是什么?例如,在刚显示过的评算求值过程中,乘法比加法的结合性更高更紧密些,这对最终结果是有影响的。
运算了结合表达式的特定方式称为优先级规则,高优先级的运算子会先取得其它周围的表达式来进行运算。如果需要,请记住这些规则,例如[*]总是比[+]的优先级高(后续各章中会详细讲解这些规则)。或者使用这条首要规则来判断:在不确定的时候,使用圆括号把表达式结合在一起。
例如:
resultl=2+3*4+5//结果是19
result2=(2+3)*(4+5)//结果是45
运算子优先级规则会拿掉关于表达式如何结合的模棱两可性,但当运算子具有同样的优先级时又会如何呢?以下机的表达式为例想一想:
how_much=3.0/4.0/5.0;
这个表达式等于0.15还是等于3.75将取决于哪个除法运算子先处理数字4.0。在线上说明中有个详尽的结合性规则列表,但最要记住的规则就是结合性通常是从左到右的顺序,也就是说,上面的表示式评算求值的结果为0.15,因为两个除法运算子中靠左边的那个具有优先权。
最后的问题的评算求值的顺序,它和结合性并不同一回事。举例来说,下面的算术表达式:
3*4+5*6
我们知道乘法应该发生在加法之前,但这并不等于知道了PHP会先执和行哪个乘法运算。一般来说,使用者无须关心求值次序,因为绝大多数情况下这对结果没有什么影响。我们可以建造一些古怪的例子,让结果与求值次序有关,通常这是因为对表达式其它部分中进行了子表达式的指定。例如,
hun=(this=that+5)+(that+this+3);//不良例子
但是请你不要这样写,好吗。PHP可能设有…依赖它,我们将不会告诉你它的结果(依赖由左向右求值次序的唯一合理应用是在Boolean表达式的「简短路径」方式中,我们将会在第七章进行讲解)。
表达式和型别
通常程序设计师会很小心地配合表达式的类型和将它们组合在一起的运算子或函式。常见的表达式是数学的表达式(用数学运算子结合数字)、Boolean表达式(用and或or结合true或false的语句)或字符串连算式(用运算子和函式来建构字符串)。与PHP的其余部分一样,对类型的处理会很宽松。例如,下面有表达式范例,很明显地它将两个运算试很不恰当地混合在一起使用了:
2 + 2 * 〝nonsense〞 + TRUE
这个表达式不会产生错误,而是求值为数字「3」(你可以暂时把这个范例当作猜谜,下一章将解释为什么会出现这样的结果)。
指定表达式
最常见的表达式类型是指(assignment),在表达式中,把一个变数设置为等于某表达式的评算求值结果。表达式的形式是,先有一个变量名(是以「$」开头),后面是一个等号,然后是要评算求值的表达式。例如,
eight=2 * (2 * 2)
eight」将按照所我们所希望的方式被指定。
有一件要记住的重要事项是,指定表达式也是一种表达式,因此它们本身是有「值」的!运算工指定的对象无论是变量或值都是相同的。这意谓着可以在更复杂的表达式中间使用表达式。如果对下面的表达式求值:
ten=(two = 2)+(eight = (2 * 2))
每个变量都将被指定为等于其名称的数值。
总而言之,PHP中的叙述语句(statement)可以是最后带带着分号(;)的任何表达式。如果把表达式看成是词组,则叙述语句则算是「整个句子」了,分号就算是句子结尾处的句号。任何括在PHP标记内有效PHP叙述语句都算是PHP的有效程序代码。
使用表达式和语句的理由
通常只有两个理由需要在PHP中编写表达式:为了取得它的值(value),或者为了取得次作用(side effect)。表达式的值传递给包含它的更复杂表达式;而次作用是除求值结果以外发生的任何事情。最典型的次作用包括指定或更改变量,在使用者屏幕是显示某些内容,或者对程序环境的一些其它持久性改变(诸如与数据库的互动)。
仅管叙述语句是表达式,但它们本身不能包含在更复杂的表达式中,这意味着使用叙述语句的唯一理由就是它的「次作用」!这也意味着可以编者编写一些合法但完全无用的语句,例如下面的第二条语句:
Print(“Hello”);//副加效应为输出显示至屏幕
2 * 3 + 4;//无用,没有效应产生
value_num= 3 * 4 + 5;//副加效应为指定
Store_in_database(49.5);//副加效应到数据库
大括号的使用
虽然叙述句不能像表达式那样合并,但可以在能够使用语句的位置放入一串语句,把它们括在大括号中即可。
例如,PHP中的if结构有个测试条件(在圆括号中),条件后面是如果判断结果为真则应该执行的语句。如果在判断为真时要执行多条语句,可以使用大括号括住的这一堆叙述语句。下面的二个if程序代码段是相等的(都是判断一个恒真的叙述并印出相同讯息):
if(3==2+1)
print(“Good – I haven′t totally lost my mind.
”);
if(3 ==2+1)
{
Print(“Good – I haven′t totally ”);
Print(“lost my mind.
”);
}
在大括号包围住的中央可放置任何语句,其中包括本身带有大括号区块的if叙述。这表示if语句可包含另一个if叙述,这种巢状嵌套可依需要套入任意层。
注释
注释是程序的一部分,就是我们人类用来解释说明程序而使用,目的是帮助说明解释程序代码。程序执行器对程序代码做的第一件事情就是剔除注释,因此注释对程序的功能没有任何作用。但它对于帮助其它人在阅读程序代码时,更能理解原设计者在编写程序时的想法,因此注释也可算是无价的,即使就是程序设计师自己编写了一段时间之后,再回头看自己的程序也是如此。
PHP算是从几种不同程序设计语言(包括C、Perl和UNIX的shell script)获取灵感。因而PHP支持所有这些语言的注释风格,并且这些风格可在PHP程序代码中自由混合使用。
属于C语言风格的多行注释
多行的注释风格和C中的相同:注释从字符对「/*」开始,以字符对「*/」当作结束。例如:
* This is
A comment in
PHP */
关于多行注释,要记住的最重要一点是,注释不能巢状嵌套方式编写。不能在一个注释内放另一个注释。如果试图这样做,注释将在第一个「*/」字符对后结束,原本要作为注释的其余部分将被解释为程序代码,可能会导致错误的结果。例如:
/* This comment will /* fail horribly on the
Last word of this */sentence
*/
这是一种很容易造成的无心错误,通常发生在试图「注释」一段已经有注释语言的程序时,是常遇到的,请读者小心。
单行注释:「#」和「//」
除了/*…*/这种多行注释之外,PHP还支持两种在给单行使用的不同注释方式,一种是从C和Java继承来的,另一种是则后Perl和shell script继承来的。Shell script风格的注释以「#」符号开始,而C++风格的注释以双斜线「//」开始。这两种方法都会将加注的该行叙述的剩余部分当成注释对待,如下所示的范例:
# This is a comment ,and
# this is the second line of the comment
//This is a comment too.Each style comments only
//one line so the last word of this sentence will fail horribly.
非常机灵的读者认为单行注释与我们前面所介绍到的空白不敏感性并不相容。这是对的,如果采用单行注释并用Enter行结束符号替换了其中一个空格,结果全是不同的。以更精确的讲法是,PHP在从程序代码中剔除了注释后,程序代码才是对空白不敏感的。
变数
在PHP程序中间储存信息的主要方式是透过使用「变量」,这是取一个名称然后保存发后要使用的任意值的方式。
关于PHP中的变量,以下有几点正是要注意知道(后面会有更详细的讲解):
◆ PHP中的所有变量都要在最前面加上「$」符号标示。
◆ 变数中的值是它最近被指定的值。
◆ 变量用「=」运算子进行指定,变量在左边,要评算求值的表达式在右边。
◆ 变量不需用要在指定之前进行宣告。
◆ 除了目前值的型别之外,变量没有固有的型别。
◆ 指定前就被使用的变量有其默认值。
PHP变数是像Perl风格的
PHP中所有变量都以$符号为前导,就像Perl语言中的scalar变量,在其它方面它们也有相似性(不需要宣告型别、在被指定前可能会被参照引用……等特性)。Perl高手们就可以直接跳过下面的内容,但对初学者却是真正要好好学习的内容。
在初始的「$」之后,变量名必须由英文字母?(大写或小写的)、数位(0-9)和底线字符(_)组成。而且,「$」之后的第一个字符不能是数字。
宣告变量
列出这个子标题只是因为其它语言的程序设计师可能正在寻找它(在例如C、C++和Java之类的语言中,程序设计师必须在利用变量前宣告它的名称和型别),但是,因为PHP中的型别号是与值相关、而与变量无关,所以不需在这样宣告,使用变量的第一步就是给它指定。
变数指定
变量的指定很简单,只需写下变量的名称,然后是一个等号(=),接下来写出厂要指定的表达式。
pi = 3 + 0.14159;//近似值
请注意,指定给变量的是表达式评算求值的结果,而不是表达式本身。一旦上面的叙述语言句被评算求值后,就不会知道「pi」的值是由两个数值相加而产生的。
变量重新指定
在PHP中,给变量首次指定和再次改变它的值没有什么区别,即便被指定的值型不同也是如此。举例来说,下面的示范语句是完全合法的:
my_num_var = “This shonld be a number – hope it′s reassigned”;
my_num_var = 5;
就算第二条叙述语句立即在第一条语句之后也一样有效,只是第一条语句实质上没有什么作用,因为马上就被指定「5」进去。
未指定的变数
许多程序设计语言都会拒绝在我们试图对变量指定之前使用它,但有一些则允许这样做,不过会得到某个内存中储存的随机内容。在PHP内,预设的错误报告(error-reporting)设定可允许使用指定变量,所以不会出现错误,PHP确保了它们有合理的默认值。
如果希望对没有指定的变量提出警告,应该将error-reporting的等级由预设的等级更改为E_ALL(尽可能调到最高),你可以藉由在程序最上方含括error-reporting(E_ALL)叙述,或是调整php.ini档案的预设等级。(参见第三十七章)
默认值
PHP中的变量没有固有的型别,变量无法预先知道它会用来储存一个数字还是字符串。因此它是如何在还未指定之前就知道了默认值的型别呢?
答案是,就你已指定变量一样,变量的型别是根据套用它的上下文来解释的。在需要数字的情况中,将产生一个数字,对字符串也是如此的作法。在把变量当成数字对待任何情况中,未指定的变量会设为「0」;在任何需要取得字符串的情况中,未指定的变量则会是个空字符串(长度为「0」的字符串)。
用lsSet检查指定情况
因为变量在使用前没有被指定,在某些情况下,实际上可以透过有选择地设定或不设定变量来达到传递数据的目的!PHP提供于名为IsSet的函式,用来测试某个变量是否已经被指定值。
如下所示的程序代码,未指定的变数甚至可与已被带出默认值的变量区分开来:
set_var = 0;//set _var 已有指定值
//never _set 没有指定值
print(“set_var print value:set_var
”);
print(“never_set print value:never_set
”);
if (set_var==never_set)
print(“set_var is equal to never_set!
”);
if (IsSet(set_var))
print(“set_var is set.
”);
else
print(“set_var is not set.
”);
if(IsSet(never_set))
print(“never_set is set .
”);
else
print(“never_set is not set.”);
never_set变量从未被指定,因此当需要字符串时它制造一个空字符串(如print语句所示),当需要数字时它制造「0」的数值(如此较测试所示,结论是两个变炸毁相同)。另外IsSet能够区分set_var和never_set。
虽然指定动作是不可挽回的,但函式unset()会把变量还原到未指定状态(例如「unset/(set_var)」,无论它以前的指定是什么都会set_var成为没有界限的变量)。
变数作用域
作用域(scope,也有人译为「范围生存空间」,算是关于一些规则的专业术语,这些规则包括什么时候某个名称(是指变量或函式名称)在两个不同的地方含义相同,在什么情况下两个并写完全相同的名字,在实际上指的是不同的内容。
没有在函式内的任何PHP变量都具有全域(global)的作用范围,并且延伸于给定执行的「执行绪」中。换句话说,如果在接近PHP档案的顶端指定变量,该变量名称在档案的其余部分也都有相同的含义,如果它没有被重新指定,在其余程序代码执行部分(函式之内除外)它的值都会保持不变。
变量的指定不影响其它PHP档案中同名变量的值,甚至不会影响到同一个档案再次使用时的变量值。举例来说,假设没有两个档案startup.php和next_thing.php,使用者常依序取这些档案。假设在接近startup.php档案顶部有这样一行程序代码:
username = “Jane Q.User”;
该叙述语句只在某些情况下执行。现在,读者可能希望在startup.php中设定了该变量后,客观存在会自动在存取next_thing.php时也同样重设,不过实际上没这么便宜的事。每次执行一个PHP页面时,,它都要指定和重新指定变量,在页面生面结束时这些变量也就「消失」了,一个档案中的变量指定不会影响不同档案中的同样名字的变量,甚至于就算对同一档案的其它请求时所用的也是同名变量都不会有所影响。
很显然地,有许多情况下会希望信息保留的时间比产生特定Web网页的时间更长些。有各种不同的方法可做到这一点,本书其余部分讲解了许多不同的技术。例如,可以使用GET和POST变量(参见第九章)把信息从一个页面传递到另一个页面,把信息永久地储存在数据库中,(参见本书的第二部分),或者使用PHP4里新的session机制把它与某个使用者的session结合起来?(参见第二十七章)或者透过cookie把它储存在使用者的硬盘上(参见第二十七章)。
函式和变数作用域
除了在函式本体内,PHP中的变量作用范围相当简单:在任何PHP给予档案的执行内,指定一个变量后,它的价值就可供使用。我们还没谈到如何定义自己的函式,但在这里得先提前谈一下:在函式内指定的变量是局限于该函式的区域中,除非在函式内进行了专门的宣告,否则该函式将不能存取在函式外定义的全域变量,即使这些数是在同一个档案内定义的也是相同(在第八章讲解函式定义时将深入讨论函式内变量的作用范围)。
模式的切换
第一次看到PHP程序代码时,有个作用域范围的问题会在脑中浮现,那就是变量作用范围在各标记间是否能维持?也就是说,如果有类似下面的单一个档案时:
username = “Jane Q.User”;
?>
Print(“username
”);
?>
在两个PHP标记间,我们能期望username持续存在发生作用吗?答案是可以的,变量在PHP同一执行绪中可以持续存在发生作用(换句话说,是使用者发出请求到响应的整个Web网页的处理过程都有作用)。这算是PHP的一般规则,对标记来说会有所影响的只是让PHP引擎决定你要直译的程序代码,或是直接不管它即以HTML形式传出去。在使有PHP标记上你可以更自由活用地切换于这个模式,一切都以你的方便为主。
常数
除了变量可以用来指定值之外, PHP也提供了常数用来在它们的储存期之内保有一个固定值,常数的命名不需要以$开头,而且依照惯例通常全部以大写字母命名,常数只可以存放纯量数值(数字或文字)。常数拥有全域的范畴,所以你可以在定义它之后在程式的任何地方使用它,甚至在函式之内。
例如,内建的确良E_ALL用来指示一个意指error_reporting()函式所用到将所有错误与警告回报的数值,呼叫error_reporting()的方式如下:
error_reporting(E_ALL);
这个方式与使用E_ALL的整数数值来呼叫error_reporting()的方式是一样的,但是使用E_ALL较好,因为E_ALL的真实值可能经由PHP的版本有所异动。
你也可以使用define()来建立你的常数,虽然比起内建常数这是比较少用到的:
Define(MY_ANSWER,42);
将会使得MY_ANSWER在你的程式任何地方计算为42,但是你不能在它定义后更改它的内容。
输出
PHP中的大多数结构是安静地执行的,它并不显示任何输出。嵌入的PHP程式码在使用者浏览器中显示资讯的方式不是利用print输出的语法,就是呼叫包含了print语句呼叫的函式。
echo和print
输出显示的两种最基本方式是echo和print。因为它们是PHP的基本概念但又不是函式,它们在使用上也许有些混淆。结论是它们既可以带括弧,也可以不用(函式呼叫必须首先叫出函式名,后接圆括号出的参数例表)。
echo
echo 的最简单用法是输出显示用来当作参数的字串,例如:
echo“This will print in the user′s browser window.”;
也等于:
echo(“This will print in the user′s browser window.”);
这两条语法都可成功将句子显示出来,但不显示引号(给C程式设计师一点提醒:把连接到使用者的HTTP输出想成以「标准输出串流」的概念)
你也可以不用括弧但用逗号分隔多个引号括住的参数,例如:
echo“This will print in the user′s browser window.”;
如果加上括弧在外面也是可以:
echo(“This will produce a ”,“PARSE ERROR!”);
print
print指令与echo非常类似,但有两点不同:
? print只可接受一参数。
? print传回一个值,用以表print语句是否成功。
如果print成功,print传回的值为「1」如果不成功则传回「0」。(语法上正确的print极少会出划,但理论是这种回传值的测试还是有意义的,例如:使用者自己的浏览器关掉连接时,回传值测试就有意义了。)
Echo和print通常都附有字串参数,但PHP在类型使用上很有弹性,所以可以提供它们相当多的参数类型,而且不会发生错误。例如,下面的两行程式虽不同但输出显示结果却是同样:
Print(“3.14159”);//输出显示字串
Print(3.14159);//输出显示数字
从技术上来说,第二行的意思是因为print希望取得字串参数,在print输出显示该数字前,它的浮点数版本被转化成一个字串值。其效果是echo和print都可靠地输出显示出数字和字串参数。
为了简单和一致性起见,我们在例子中一般使用print带括弧的用法,而不使用echo。
除了这里所讨论的输出函式之外,尚有两个主要用来除错的输出函式:print_r()与var_dump(),这些函式的功能可以使你输出复合性质资料的值,例如阵列,所以我们会在第十一章详细讨论阵列。
变数与字串
C程式设计师可能习惯于呼叫print函式,该函式能够把值和运算式处理成特定格式的输出显示字串。PHP有同类的函式(在第九章中会介绍),但我们也可以使有print(或echo)的带引号的字串实现同样的功能。
例如,看下面的程式码片段:
animal=“antelope”;
animal_heads=1;
animal_legs=4;
Print(“The animal has animal_heads(s).
”;
Print(“The animal has animal_legs leg(s).
”);
在浏览器中产生下面的输出:
The antelope has 1 head(s).
The antelope has4 leg(s).
我们含在字串内给变数的值已经被并接到输出显示的输出中。这是个非常棒而且有用的特性,这种特性易于快速产生由于变数的不同设置而内容变化多样的Web网页。这并不是因为print的有什么神奇的属性,但奇妙之处就在于带引号的字串本身的直译。
单引号与双引号
在构造字串本身的值之前,PHP对双引号括起来的字串(类似「〝this〞」)进行了某种预设处理。首先变数会被它们的值取代(如前面的例子所示)。为了看到实际的带引号字串,而不是print结构,可有下面的程式码来思考:
animal =“antelope”;//第一次指定
saved_atring= “The animal is animal
”;
animal =“zebra”;//重新指定
Print(“The animal is animal
”);//第一行显示
Print(saved_string);//第二行显示
这里希望看到什么输出呢?浏览器将结果显示出如下二行:
The animal is zebra
The animal is antelope
这时因为在animal变数重新指定前,「antelope」被并接到字串saved_string中。
处理把变数值并接到带有双引号的字串中,PHP还可用单字元值取代一些特殊的多重字元「跳脱序列」。最常见的是像下面这样的字串中加入使用的行结束符号(
):
“The frist line
The fourth line”
PHP首先把每个「
」取代成单个的行结束符号。如果查看这一行产生的HTML原始程式码,会看到在输出中间有两个空行(在浏览器视窗中可能所有内容都在同一行上,请参阅本章后面的「HTML和换行符号」)。
单引号字串(类似「ˋthisˊ」)的作法则又不同,PHP产东风有对它们有什么变动的插补,它只关注两个跳脱序列(透过把「‵」以「‵」方式置入字串中,就可以在字串中是「‵」单引号的符号呈现出来,另外把「」则要以「\」方式在字串中表示)。除了这两处例外,PHP把其它单引号字串当作为键入的普通单引号字串。如果在这样的字串中键入一个「$」字元,并且把它以print方式发送给输出,则会在浏览器视窗中看到「$」。
除了单引号与双引之外,还有一种非常有用的方法来控制文字输出,称为heredoc语法,这种用法如同双引号也可以内嵌变数在文字内使用,但是不需要额外使用跳脱字元不显示特殊文字,我们会在第十章介绍。
HTML和换行符号
PHP程式设计新手(尤其是具有C语言程式设计背景的人)常犯的一个错误是,试图透过在输出显示的字串中加入行结束符号(
),想让浏览器中的文字换行。为了理解这样做为什么行不通,要把PHP的输出(通常是HTML程式码,准备透过Internet传送到浏览器中)和使用者浏览器显示该输出的方式区别开来。大多数浏览器程式会自己做出选择,自行决定如何分割HTML文字行,除非在语法中有强制以
标记换行。字串中的换行符号会在PHP发送给使用者浏览器的HTML原始程式码中也置入换行,但通常到了Web页面中呈现时又有不同,原因就在它不是强制的
标记。
摘要
PHP程式码遵循一系列基本语法的规则,其中大多数是从诸如C或Perl之类的程式设计语言中借镜而来的。PHP的语法需求算是最少的,一般来说,只要能够做到,PHP都会尽最大努力产生结果,而不是只会跑出一堆错误。
PHP程式码对空白并不敏感,尽管变数名称是有区分大小写的,但基本的语言构造和函式名称则没有。简单元的PHP运算可以透过使用运算子的函式呼叫方式组合成更大的运算式,叙述语句则以分号(;)当作结尾。变数是透过前置字元「$」来标识的,使用「=」运算子则用来进行指定,我们不需要进行类型宣告,并且如果在指定前被使用,也会有合理的预设值。变数作用域是全域地,除非明确地宣告为其它形式的变数。
产生输出到使用者最简单方式是使用echo或print,这样会输出字串参数。这两个方式与括在双引号内的字串组合在一起时尤其有用,带双引号的字串能够自动将嵌入的变数替换成相应的值。
出处:南方Linux
赞
If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
QQ:154298438
QQ:417480759