PHP语法特点

我的主攻是C, C++,之前也学过 Python, Lua 脚本语言,没有接触过PHP。这几天在学习PHP,做个笔记。 
感觉PHP在语法上与C++特别相似。只要会C++,PHP基本上不用记什么。 

语法上有这些特点: 

1. 数据类型

    null, bool, string, float, integer, array, object

    object 是 new 出来的对象

    转换类型与 C 一样。

2. PHP里所有的变量名都是以 $ 开头 

    在Shell里,只有获取变量的时候才需要加$符号,在PHP里,所获取还是设置都要加 $ 符号

$str = "hello";
echo $str;

3. PHP里变量名区分大小写,函数名不分

$str = "String\n";
$STR = "This is STR\n";
echo $str;
ECho $str;
echo $STR;

    结果输出:

String
String
This is STR

4. PHP里的注释除了C++有的 // /**/ 外,还有脚本常用的 #

// 注释
/*
 * 注释
 */
# 注释

5. 定义变量时无需指明类型

    这点与 python, lua一样,这也是大多数据脚本的共性。

6. 数据组是 array

    用作数组时:

$arr = array("C++", "C", "Java", "PHP");

    用作映射表时:

$map = array("John"=>"M", "Lily"=>"F");

  

如果不指定键值,那么它就是数字 0,1,2,3...为键。如果指定了键值,那就以指定的键值为键。

    其功能非常类似于Lua的表。Lua的如下:

w = {x=0, y=0, label="console"}

  不过 Lua 的有点怪异,非得从1开始计数。

7. 逻辑语句与C++一样

    if .. else if .. else, for, while, continue, break等与C++一样。只不过,PHP还支持用 : ... endXXX 来代替 { ... }

if ($num == 0) {
    echo "num = " . $num;
}
# 也可以写成如下
if ($num == 0) :
    echo "num = " . $num;
endif

    有 ++$i 与 $i++,与C++一样。

8. 字符串用 . 进行连接

    这一点跟 Lua 类似,Lua 是用 .. 进行字符串拼接的。

9. 字符串用单引号或双引号界定

$name = 'Peter';
echo 'My name is $name\n';
echo "My name is $name\n";
echo "===="

My name is $name\nMy name is Peter
====

    在单引号里 $name 与 \n 都没有被重新计算。而双引号则会被替代。这点跟shell一样。

10. 有 === (恒等)与 !== (不恒等)比较。恒等的意思是不仅值相等,类型还一样

11. 函数的定义

function PrintName($name = "Unknow") {
    if (is_string($name)) {
        echo "My name is $name\n";
        return TRUE;
    }
    return FALSE;
}
PrintName("Hevake");

    与 Lua 类似,也可以带默认值

12. 常量

define("NAME", "hevake_lcj");    # 定义常量
echo constant("name");    # 取常量
if (defined("name")) {    # 检查是否定义了常量 name
    echo "定义了 name";
}

13. 可变变量

<?php
$text="My Name";
$a = "text";
echo $$a;
echo '<br>';
$b = 'a';
echo $$$b;
?>

   

    $text, $$a, $$$b的结果都是“My Name”。

    函数也可以这样引用:

<?php
function come() {
    echo "I am coming. <br/>";
}
function back() {
    echo "I am back. <br/>";
}
$func = "come";
$func();
$func = "back";
$func();
?>

14. 预定义环境变量

    $_SERVER, $_COOKIE, $_SESSION, $_POST, $_GET, $GLOBALS

15. 函数可以以引用传参

<?php
function example(&$m) {
    $m = $m * 5 + 10;
}
$m = 1;
example($m);
echo "<p>在函数外:\$m = $m</p>";
?>

16. foreach循环

<?php
$map = array('john'=>18, 'licy'=>22);
foreach ($map as $key=>$value) {
    echo "$key=>$value, ";
}
echo '<br/>';
?>

17. 面向对象与Java类似

<?
#示例学生类
class Student
{
    #构造函数,没有指定public, protected, private,默认为public
    function __construct($Name = "Unknow", $Age = 0)
    {
        $this->mID = static::$sCount++; #注意静态成员的引用方法
        echo "Student $this->mID construct<br/>";
        $this->mName = $Name;    #注意:是$this->mName,而不是$this->$mName
        $this->mAge = $Age;
    }

    function __destruct()
    {
        echo "Student $this->mID destruct<br/>";
    }

    function __clone()
    {
        $this->mID = static::$sCount++;
        echo "Student $this->mID cloned.<br/>";
    }

    function __get($name)
    {
        if ($name == 'Name') {
            return $mName;
        } else if ($name == 'Age') {
            return $mAge;
        } else {
            return null;
        }
    }

    function __set($name, $value)
    {
        if ($name == 'Name') {
            if (is_string($value)) {
                $this->mName = $value;
            }
        } else if ($name == 'Age') {
            if (is_int($value)) {
                $this->mAge = $value;
            }
        } else {
            throw new Exception("No attribute $name");
        }
    }

    function __ToString()
    {
        $ret = '<hr/>Class: ' . __CLASS__ . '<br/>' .
            "\tName: " . $this->mName . '<br/>' .
            "\tAge: " . $this->mAge . '<br/><hr/>';
        return $ret;
    }

    static private $sCount = 0;
    private $mID;
    private $mName;
    private $mAge;
}

function foo($s) {
    $s->Age = 30;
}

$s = new Student(); #实例化对象要加new,这不像Python,否则就被当成Student()函数了。
                    #在构造的过程中,Student::__construct()会被自动调用

$s->Name = "John";

try {
    $s->Sex = "male";   #Student并没有Sex属性,会抛异常
} catch (Exception $e) {
    echo 'Exception occur!!<br/>';
    echo $e;
}

foo($s);    /*将对象作为实参传给函数时,其实转的是这个对象的句柄,就像传的是指针一样。
              在foo()中对$s对象的修改是有效的*/
echo $s;    #自动调用Student::__toString()

$s1 = clone $s; //clone对象
unset($s);

$s1->Name = "LiChunjun";
echo $s1;
?>

   可以重定义如下关键函数:

  • __get($name)    属性获取函数,$name为属性名
  • __set($name, $value)    属性设置函数
  • __construct()    构造函数
  • __destruct()    析构函数
  • __call($name, $params)    调用函数
  • __autoload()    类定义加载回调函数
  • __tostring()    转换字符串函数
时间: 2024-09-24 22:46:42

PHP语法特点的相关文章

VB.NET基础语法

很久以来,VB因为缺乏完善的面向对象支持.缺乏高效的错误处理机制和性能表现不佳,因而一直受到某些人的嘲笑.VB.NET将彻底改变这种情况.然而,VB.NET在这些方面的改进也要付出代价,许多旧的代码需要手工进行转换才能在VB.NET下运行. 下面几个表格总结了VB.NET语言在语法上的改动之处.注意这些表格并没有完全列出所有改动之处,但列出了最重要的一些改动. 表A对比了VB6中一些熟悉的语法形式及其在VB.NET中类似功能最接近的语法形式. 表A:语法对比旧语法 新语法 说明窗体装载事件,类初

Swift语法专题十二——方法

Swift讲解专题十二--方法 一.引言         方法只是一个术语,其实就是将函数与特定的类型结合,类.结构体.枚举都可以定义方法,方法又分为实例方法和类型方法,类型方法类似于Objective-C中的类方法.Swift和Objective-C的一大不同是,Objective-C只有在类中可以定义方法. 二.实例方法基础         实例方法的语法和函数完全一致,其和具体类型的实例所关联,实例方法在调用时由类型的实例点语法进行调用来完成一些功能模块.示例如下: class Math

一个简单的C语言词法分析与语法分析器

词法分析 可识别内容: 标识符:id 数字:num 关键字:int,char,if,else,while,do,for 标号:, , . ,  ; 算术运算符号:=,+,-,*,/,&,!,|,&&,|| 关系运算符:<,<=,>=,>,==,!= 注释:// 内码定义: 单个符号,如{,+,*,> 等,均使用其ascii码做内码,占双或多个字节的符号(包括保留字,标号,数字,运算符等)为其取名如下: Enum { END=0,INT,CHAR,IF,

Lua 笔记--语法

        Lua允许"多重赋值",也就是一下子将多个值赋予多个变量.每个值或每个变量之间以逗号分隔: a, b = 10, 2*x         在多重赋值中,Lua先对等号右边的所有元素求值,然后才执行赋值. x, y = y, x        -->交换x 与y         Lua总是会将等号右边值的个数调整到与左边变量的个数相一致.规则是:若值的个数少于变量的个数,那么多余的变量会被赋为nil :若值的个数更多的话,那么多余的值会被"静悄悄地&quo

markdown使用基本语法

### 1. 斜体和粗体 使用 * 和 ** 表示斜体和粗体. 示例: 这是 *斜体*,这是 **粗体**. ### 2. 分级标题 使用 === 表示一级标题,使用 --- 表示二级标题. 示例: ``` 这是一个一级标题 ============================ 这是一个二级标题 -------------------------------------------------- ### 这是一个三级标题 ``` 你也可以选择在行首加井号表示不同级别的标题 (H1-H6),例

Cmd Markdown编辑器简明语法手册

1. 斜体和粗体 使用 * 和 ** 表示斜体和粗体. 示例: 这是 斜体,这是 粗体. 2. 分级标题 使用 === 表示一级标题,使用 --- 表示二级标题. 示例: 这是一个一级标题 ============================ 这是一个二级标题 -------------------------------------------------- ### 这是一个三级标题 你也可以选择在行首加井号表示不同级别的标题 (H1-H6),例如:# H1, ## H2, ### H3,

java-mysql 语法错误的问题

问题描述 mysql 语法错误的问题 在写课程设计时已经连接好数据库执行sql语句时抛出异常说是sql语句错误可是前面的引用都好着呢求大神帮助ps:数据库里面id的类型是 int (11) 外面传递过去是 String请问有影响吗?多谢代码如下:String sql1 = ""update test0 set name = "" + tf1.getText() + ""where test0.id = ""+inputValu

Eclipse中JS文件即使取消语法验证仍提示错误

     我想大家应该都遇到过这种问题:js文件一直提示报错,如图:  通常的做法都是取消js文件的语法验证,操作如图:   首先你的项目上鼠标右键-->Properties  然而,这招并不是放之四海而皆准的,如果取消了js语法验证仍然报错怎么办? 其实对付这种问题的终极解决办法如下:    首先你的项目上鼠标右键-->Properties        如果有多个js文件,一个个的add有点繁琐,这时候你可以点击Add Multiple进行批量添加,如图:    最后重新构建你的整个项目,

Groovy语法介绍

1. 介绍 Groovy 是基于 JRE 的脚本语言,和Perl,Python等等脚本语言一样,它能以快速简洁的方式来完成一些工作:如访问数据库,编写单元测试用例,快速实现产品原型等等. Groovy 是由James Strachan 和 Bob McWhirter 这两位天才发明的(JSR 241 2004 年 3 月).Groovy 完全以Java API为基础,使用了Java开发人员最熟悉的功能和库.Groovy 的语法近似Java,并吸收了 Ruby 的一些特点,因此 Groovy 在某

vs2012-error C2143: 语法错误 : 缺少“;”(在“.”的前面)

问题描述 error C2143: 语法错误 : 缺少";"(在"."的前面) 在Button函数里调用HuffmanTree1.CreateHfmTree(char Str,int m,int n); 显示错误error C2143: 语法错误 : 缺少";"(在"."的前面) void CHuffmanTreeDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 Updat