PHP基础语法

标记

当解析一个文件时,PHP 会寻找起始和结束标记,也就是 <?php 和 ?>,这告诉 PHP 开始和停止解析二者之间的代码。此种解析方式使得 PHP 可以被嵌入到各种不同的文档中去,而任何起始和结束标记之外的部分都会被 PHP 解析器忽略。

PHP 也允许使用短标记 <? 和 ?>,但不鼓励使用。只有通过激活 php.ini 中的 short_open_tag 配置指令或者在编译 PHP 时使用了配置选项 --enable-short-tags 时才能使用短标记。

PHP代码可以嵌入到html代码中任何位置,并且可以嵌入任意多个。
如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记。这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图。
    1. <!DOCTYPE html>
    1. <html lang="zh-CN">
    1. <head>
    1. <meta charset="GBK" />
    1. <title>PHP脚本程序<?php echo '--包青天';?></title>
    1. </head>
    1. <body>
    1. <?php echo '卧槽<br />';?>
    1. <br />
    1. </body>
    1. </html>
    1. <?php echo '泥煤';
    1. // 脚本至此结束,并无 PHP 结束标记

凡是在一对开始和结束标记之外的内容都会被 PHP 解析器忽略,这使得 PHP 文件可以嵌入到 HTML 文档中去。
但是对于处于条件语句中间的PHP语句, PHP 解释器会根据条件判断来决定哪些输出,哪些跳过。
    1. <?php $expression=false; ?>
    1. <?php if ($expression == true): ?>
    1. This will show if the expression is true.
    1. <?php else: ?>
    1. Otherwise this will show.
    1. <?php endif; ?>

指令分隔符

同 C 或 Perl 一样,PHP 需要在每个语句后用分号结束指令。一段 PHP 代码中的结束标记隐含表示了一个分号;在一个 PHP 代码段中的最后一行可以不用分号结束。如果后面还有新行,则代码段的结束标记包含了行结束。

空格、tab制表符、换行,在PHP中都是无意义的,可以将一个语句展开成任意行,或者紧缩在一行

文件末尾的 PHP 代码段结束标记可以不要,有些情况下当使用 include 或者 require 时省略掉会更好些,这样不期望的空白符就不会出现在文件末尾,之后仍然可以输出响应标头。在使用输出缓冲时也很便利,就不会看到由包含文件生成的不期望的空白符。

注释

PHP 支持 C,C++ 和 Unix Shell 风格(Perl 风格)的注释
    1. <?php
    1. echo "This is a test"; // This is a one-line c++ style comment
    1. /* This is a multi line comment
    1. yet another line of comment */
    1. echo "This is yet another test";
    1. echo 'One Final Test'; # This is a one-line shell-style comment
    1. ?>

PHP常量

常量的值不能改变(除了所谓的魔术常量,它们其实不是常量),传统上常量标识符总是大写的。
和 superglobals(超全局数组) 一样,常量的范围是全局的,不用管作用区域就可以在脚本的任何地方访问(如函数、类、文件等)。

一个常量一旦被定义,就不能再改变或者取消定义。
自定义常量应该避免以__开头,以免与PHP将来定义的魔术常量冲突。
如果常量名是动态的,也可以用函数 constant() 来获取常量的值。

常量和变量有如下不同:
  • 常量前面没有美元符号($);
  • 常量只能用 define() 函数定义,而不能通过赋值语句;
  • 常量可以不用理会变量的作用域而在任何地方定义和访问;
  • 常量一旦定义就不能被重新定义或者取消定义;
  • 常量的值只能是标量。

在 PHP 5.3.0 以后,可以使用 const 关键字在类定义之外定义常量。
和使用 define() 来定义常量相反的是,使用 const 关键字定义常量必须处于最顶端的作用区域,因为用此方法是在编译时定义的。这就意味着不能在函数内,循环内以及 if 语句之内用 const 来定义常量。

常量相关方法

1、定义常量 bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
参数
  • name:常量名
  • value:常量的值,仅允许标量和 null。标量的类型是 integer, float,string 或者 boolean。也能够定义常量值的类型为 resource ,但并不推荐这么做,可能会导致未知状况的发生
  • case_insensitive:如果设置为 TRUE,该常量则大小写不敏感,默认是大小写敏感的。大小写不敏感的常量以小写的方式储存
返回值:成功时返回 TRUE, 或者在失败时返回 FALSE。

2、获得所有已定义的常量列表 array get_defined_constants ([ bool $categorize = false ] )
返回当前所有已定义的常量名和值,这包含 define() 函数所创建的,也包含了所有扩展所创建的。
可选参数 categorize:让此函数返回一个多维数组,分类为第一维的键名,常量和它们的值位于第二维。

3、检查某个名称的常量是否存在 bool defined ( string $name )
如果该名称的常量已定义,返回 TRUE;未定义则返回 FALSE。
defined() 函数仅对常量有效,检查一个变量是否设置并且不是 NULL时使用 isset(),检测一个函数是否存在时使用 function_exists()。

4、返回一个常量的值 mixed constant ( string $name )
通过 name 返回常量的值。如果常量未定义则返回 NULL,并产生一个 E_WARNING 级别的错误。
当你不知道常量名,却需要获取常量的值时,constant() 就很有用了。也就是常量名储存在一个变量里,或者由函数返回常量名。
    1. define ( "CONSTANT", "白乾涛" );
    1. const NAME = '包青天'; // 在 PHP 5.3.0 后可以使用 const 关键字在类定义之外定义常量
    1. echo CONSTANT; // 不应该在常量前面加上 $ 符号
    1. echo constant ( "NAME" ); // 返回一个常量的值
    1. echo Constant; // 输出 "Constant" 并发出一个E_WARNING级别错误信息
    1. echo defined ( "CONSTANT" );//结果为【1】
    1. const CONSTANT = '会报错,Notice: Constant CONSTANT already defined'; // 不能被重新定义

8个魔术常量

PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。

有八个魔术常量,它们的值随着它们在代码中的位置改变而改变。例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写。

  • __LINE__:文件中的当前行号。
  • __FILE__:文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__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 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
  • __METHOD__:类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
  • __NAMESPACE__:当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。

PHP变量

PHP脚本语言是一种弱类型语言,PHP的特性之一就是它不要求在使用变量之前声明变量,当第一次给一个变量赋值时,你才创建了这个变量
PHP中变量使用一个美元符号 $ 后面跟着变量名来表示。
变量名称区分大小写,一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。
按照正常的正则表达式,它将被表述为【'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'】。PS: 这里所说的字母是 a-z,A-Z,以及 ASCII 字符从 127 到 255(扩展字符)。

PHP中有一些标示符是系统定义的,也称为关键字,是PHP语言的组成部分,不能使用它们中的任何一个作为常量函数名或类名。
但是和其他语言不同的是,PHP中的关键字可以作为变量名使用,不过这样容易混淆,所以最好还是不要用PHP的关键字作为变量名称。
PS:$this 是一个特殊的变量,它不能被赋值。

传值赋值和引用赋值

变量默认总是传值赋值。当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。
PHP 也提供了另外一种方式给变量赋值:引用赋值。这意味着新的变量简单的引用(换言之,"成为其别名" 或者 "指向")了原始变量。改动新的变量将影响到原始变量,反之亦然。引用赋值可以简单的理解为给变量起了个别名。

虽然在 PHP 中并不需要初始化变量,但对变量进行初始化是个好习惯。未初始化的变量具有其类型的默认值 - 布尔类型的变量默认值是 FALSE,整形和浮点型变量默认值是零,字符串型变量默认值是空字符串,数组变量的默认值是空数组。
    1. $a=1;
    1. $aa=$a;//传值赋值
    1. $b=&$a;//引用赋值
    1. $aa=2;
    1. echo $a;//1
    1. $b=2;
    1. echo $a;//2
    1. $bar = &(24 * 7); // 非法,只有有名字的变量才可以引用赋值

变量相关方法

1、销毁指定的变量 void unset ( mixed $var [, mixed $... ] )
可以同时销毁多个变量 unset($foo1, $foo2, $foo3);
unset() 在函数中的行为会依赖于想要销毁的变量的类型而有所不同。
  • 如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。
  • 如果您想在函数中 unset() 一个全局变量,可使用 $GLOBALS 数组来实现。
  • 如果在函数中 unset() 一个通过引用传递的变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。
  • 如果在函数中 unset() 一个静态变量,那么在函数内部此静态变量将被销毁。但是,当再次调用此函数时,此静态变量将被复原为上次被销毁之前的值。
注意:(unset) 类型强制转换常常和函数 unset() 引起困惑,为了完整性,(unset) 是作为一个 NULL 类型的强制转换,它不会改变变量的类型。

2、检测变量是否已被初始化 bool isset ( mixed $var [, mixed $... ] )
如果 var 存在并且值不是 NULL 则返回 TRUE,否则返回 FALSE。
如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。
若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节("\0")并不等同于 PHP 的 NULL 常数。

全局变量

大部分的 PHP 变量只有一个单独的范围,这个单独的范围跨度同样包含了 include 和 require 引入的文件。
PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖。而在PHP 中,全局变量在函数中使用时必须声明为【global】,任何用于函数内部的变量缺省情况将被限制在局部函数范围内。

在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组。$GLOBALS 是一个【超全局变量】,在全局范围内存在。$GLOBALS 的元素中,键名对应变量名,值对应变量的内容。
注意,PHP中全局变量和超全局数组的区别:全局变量在类中并不能直接访问。
    1. <?php
    1. $a = 1; // global scope
    1. $b = 2;
    1. function Test() {
    1. echo "这是一个局部变量【{$a}】<br />"; // 这里的 $a 是一个局部变量,由于在这个范围内,它并没有被赋值,所以会报错
    1. }
    1. function Sum() {
    1. global $a, $b; // 在【函数中】声明了【全局变量】$a 和 $b 之后,对变量的【所有引用】都会指向其全局版本
    1. $b = $a + $b;
    1. echo "全局变量在函数中使用时必须声明为global【{$b}】<br />";
    1. }
    1. function Sum2() {
    1. $GLOBALS ['b'] = $GLOBALS ['a'] + $GLOBALS ['b']; // 使用 $GLOBALS 替代 global
    1. echo "使用 \$GLOBALS 替代 global【{$GLOBALS ['b']}】<br />";
    1. }
    1. Test ();
    1. Sum ();
    1. echo "方法内对全局变量操作后,会影响所有的引用【{$b}】<br />";
    1. Sum2 ();
    1. ?>

静态变量

静态变量仅在【局部函数域】中存在,但当程序执行离开此作用域时,其值并不丢失。
    1. function test() {
    1. static $a = 0; // 变量 $a 仅在第一次调用 test() 函数时被初始化,之后每次调用 test() 函数时都是使用之前保留的值
    1. echo "$a <br />";
    1. $a ++;
    1. }
    1. test (); // 0
    1. test (); // 1
静态变量也提供了一种处理递归函数的方法。递归函数是一种调用自己的函数。写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来中止递归。
    1. //递归函数
    1. function test() {
    1. static $count = 0;
    1. $count ++;
    1. echo $count;//12345
    1. if ($count < 5) {//写递归函数时要确保有充分的方法可以中止递归,因为可能会无穷递归下去
    1. test ();//递归函数是一种会调用自己的函数
    1. }else echo "<br />";
    1. echo $count;
    1. $count --;//
    1. }
静态声明是在编译时解析的,如果在声明中用表达式的结果对其赋值会导致解析错误。
static $int = 1+2;// wrong  (as it is an expression)

可变变量

有时候使用可变变量名是很方便的,就是说,一个变量的名字可以动态的设置和使用。
    1. $abc = 'test'; // 定义了一个变量$abc,里面存了值test
    1. $$abc = '包青天'; // 使用两个美元符号$以后,就可以作为一个可变变量的变量了
    1. echo $$abc; // 包青天
    1. echo $test; // 包青天
要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下 $$a[1] 时,解析器需要知道是想要 $a[1] 作为一个变量呢,还是想要 $$a 作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种情况用 ${$a[1]},对第二种情况用 ${$a}[1]。

类的属性也可以通过可变属性名来访问。可变属性名将在该调用所处的范围内被解析。例如,对于 $foo->$bar 表达式,则会在本地范围来解析 $bar 并且其值将被用于 $foo 的属性名。对于 $bar 是数组单元时也是一样。

也可使用花括号来给属性名清晰定界。最有用是在属性位于数组中,或者属性名包含有多个部分或者属性名包含有非法字符时(例如来自 json_decode() 或 SimpleXML)。

PS:在 PHP 的函数和类的方法中,超全局变量不能用作可变变量。$this 变量也是一个特殊变量,不能被动态引用。

PHP 基础语法 常量 变量的更多相关文章

  1. JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)

    Java基础语法(变量.常量.数据类型.运算符与数据类型转换) 1.变量 Java中.用户能够通过指定数据类型和标识符来声明变量.其基本的语法为: DataType identifier; 或 Dat ...

  2. JAVA_SE基础——7.常量&变量

    上一篇,我讲了标识符&关键字    这篇我来解释下变量&常量~~~ 变量与常量这两个概念相信大家都不会感到陌生,在数学中就已经涉及了变量与常量.理解变量与常量,可以举这样一个例子: 例 ...

  3. Java基础语法(2)-变量

    title: Java基础语法(2)-变量 blog: CSDN data: Java学习路线及视频 1.什么是变量? 变量的概念 内存中的一个存储区域 该区域的数据可以在同一类型范围内不断变化 变量 ...

  4. Java基础语法01——变量与运算符

    本文是对Java基础语法的第一部分的学习,包括注释:标识符的命名规则与规范:变量的数据类型分类以及转换:以及六种运算符(算术.赋值.比较.逻辑.三元和位运算符).

  5. javascript基础语法备忘录-变量和数据类型

    //javascript基础语法备忘录-变量和数据类型 // 定义变量使用var关键字 后面跟变量名,不要使用eval 和arguments为变量名 var message = "hi&qu ...

  6. 前端学习笔记--js概述与基础语法、变量、数据类型、运算符与表达式

    本篇记录js的概述与基础语法.变量.数据类型.运算符与表达式 1.概述与基础语法 2.变量 举例: 3.数据类型 4.运算符与表达式

  7. python基础语法(变量与数据类型)

    python基础语法(变量与数据类型) 一.python变量 python中的变量不需要声明.每个变量在使用钱都需要赋值,变量赋值以后,该变量才会被创建 在python中,变量就是变量,它没有类型,我 ...

  8. swift 2.0 语法 常量变量

    import UIKit /*: 常量变量 * 常量: let * 变量: var 完整格式: * 修饰符(let/var) 常量/变量名称: 数据类型 */ let number: Int var ...

  9. swift基础语法之——变量和常量

    swift使用let关键字来定义常量,使用var来定义变量,变量在使用前必须初始化(赋初始值) swift是类型安全语音,即不同类型的变量不能一起运算,必须转成同一类型才可以 变量的类型在声明时不必给 ...

随机推荐

  1. ANDROID_MARS学习笔记_S03_005_Geocoder、AsyncTask

    一.代码1.xml(1)AndroidManifest.xml <uses-permission android:name="android.permission.ACCESS_FIN ...

  2. springboot + devtools(热部署)

    技术介绍 devtools:是boot的一个热部署工具,当我们修改了classpath下的文件(包括类文件.属性文件.页面等)时,会重新启动应用(由于其采用的双类加载器机制,这个启动会非常快,如果发现 ...

  3. 根据指定的commit查找对应的log

    find commit by hash sha in git 问题: I need to find a commit in Git by given hash SHA. For example, if ...

  4. 关于Azure Auto Scale的高级属性配置

    Auto Sacle是一种自动化管理云服务负载的功能,系统可以根据预先制定的规则,在满足条件的情况下对计算实例的数量进行增减从而可以用来优化使用Azure的计算资源,可以适用于Cloud Servic ...

  5. C#入门经典学习笔记一

    这篇主要讲C#的一些语法. 1.委托 委托类型声明的格式如下: public delegate void TestDelegate(string message); delegate 关键字用于声明一 ...

  6. 国外成熟的程序交易系统的思路 z

    波涛(1998)在<系统交易方法>中提出,一个设计良好的交易系统,必须对投资决策的各个相关环节做出相应明确的规定,同时还必须符合使用者的心理特征.投资对象的统计特征以及投资资金的风险特征. ...

  7. HDU-2547 无剑无我

    无剑无我 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. Using OpenCV with gcc and CMake

    Using OpenCV with gcc and CMake Note We assume that you have successfully installed OpenCV in your w ...

  9. Java内存区域 - 深入Java虚拟机读后总结

    Java虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,有各自的创建时间和销毁时间,有的区域随着虚拟机进程的启动而存在,有的区域则是依赖用户线程的启动 ...

  10. JavaScript效果之选项卡

    拼了命学习js,想把学到的Javascript效果,可以记在博客里,在记录过程中,加深理解. gogogo,第一个效果,选项卡. 一.选项卡效果的实现思路 选项卡效果的应用很广泛,几乎所有的网站都会用 ...