首页 > 编程 > PHP > 正文

php语言总结

2020-03-22 17:26:35
字体:
来源:转载
供稿:网友
  • php 语言总结:基础语法 类型 常量 运算符 流程控制 函数 类与对象 命名空间 超html' target='_blank'>全局变量 垃圾回收机制


    1 基本语法
    *php标记
    <?php
    echo "Hello world";
    // ... more code
    echo "Last statement";
    // 脚本至此结束,并无 PHP 结束标记

    注意:如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记。
    这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,
    而脚本中此时并无输出的意图。

    *从html中分离
    <?php if ($expression == true): ?>
    This will show if the expression is true.
    <?php else: ?>
    Otherwise this will show.
    <?php endif; ?>

    2 类型
    *简介
    PHP 支持 8 种原始数据类型。

    四种标量类型:
    boolean(布尔型)
    integer(整型)
    float(浮点型,也称作 double)
    string(字符串

    两种复合类型:
    array(数组)
    object(对象)

    最后是两种特殊类型:
    resource(资源)
    NULL(无类型)

    Note:查看表达式的值和类型,用 var_dump() 函数,获取类型用gettype(),判断是否为某个类型is_type()

    *boolean
    要指定一个布尔值,使用关键字 TRUE 或 FALSE。两个都不区分大小写

    当转换为 boolean 时,以下值被认为是 FALSE:
    布尔值 FALSE 本身
    整型值 0(零)
    浮点型值 0.0(零)
    空字符串,以及字符串 "0"
    不包括任何元素的数组
    <?php
    var_dump((bool) ""); // bool(false)
    var_dump((bool) 1); // bool(true)
    var_dump((bool) -2); // bool(true)
    var_dump((bool) "foo"); // bool(true)
    var_dump((bool) 2.3e5); // bool(true)
    var_dump((bool) array(12)); // bool(true)
    var_dump((bool) array()); // bool(false)
    var_dump((bool) "false"); // bool(true)
    ?>

    *integer
    最大值可以用常量 PHP_INT_MAX 来表示

    *float
    *string
    单引号:不会解析里面的变量
    双引号:会解析里面的变量
    (如果没有变量那么建议使用单引号这样效率会更高点,因为不用解析里面的内容)
    复杂(花括号):只需简单地像在 string 以外的地方那样写出表达式,然后用花括号 { 和 } 把它括起来即可
    <?php
    // 有效,当在字符串中使用多重数组时,一定要用括号将它括起来
    echo "This works: {$arr['foo'][3]}";
    // 有效
    echo "This works: " . $arr['foo'][3];
    ?>

    *array

    <?php
    // 创建一个简单的数组
    $array = array(1, 2, 3, 4, 5);
    print_r($array);
    // 现在删除其中的所有元素,但保持数组本身不变:
    foreach ($array as $i => $value) {
    unset($array[$i]);
    }
    print_r($array);
    //删除整个数组unset($array)
    ?>
    *object
    要创建一个新的对象 object,使用 new 语句实例化一个类:

    <?php
    class foo
    {
    function do_foo()
    {
    echo "Doing foo.";
    }
    }
    $bar = new foo;
    $bar->do_foo();
    ?>
    *resource
    数据库连接就会返回一个资源
    *null
    NULL 类型只有一个值,就是不区分大小写的常量 NULL。
    在下列情况下一个变量被认为是 NULL:
    被赋值为 NULL。
    尚未被赋值。
    被 unset()。
    判断是否为null,使用is_null()

    2 变量
    *基础
    $this 是一个特殊的变量,它不能被赋值
    变量默认总是传值赋值,也有引用变量,这就意味着改动新变量将影响到原始的变量
    *预定义变量
    *变量范围
    在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内
    <?php
    $a = 1; /* global scope */
    function Test()
    {
    echo $a; /* reference to local scope variable */
    }
    Test();
    ?>
    和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖。
    PHP 中全局变量在函数中使用时必须声明为 global
    <?php
    $a = 1;
    $b = 2;
    function Sum()
    {
    global $a, $b;


    $b = $a + $b;
    }
    Sum();
    echo $b;
    ?>

    态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失
    <?php
    function test()
    {
    static $a = 0;
    echo $a;
    $a++;
    }
    ?>

    *可变变量
    <?php
    $a = 'hello';
    $$a = 'world';
    echo "$a ${$a}";
    //与以下语句输出完全相同的结果:
    echo "$a $hello";
    ?>
    *来自php之外的变量
    $_POST $_GET

    3 常量
    <?php
    // 合法的常量名
    define("FOO", "something");
    define("FOO2", "something else");
    define("FOO_BAR", "something more");
    // 非法的常量名
    define("2FOO", "something");
    // 下面的定义是合法的,但应该避免这样做:(自定义常量不要以__开头)
    // 也许将来有一天PHP会定义一个__FOO__的魔术常量
    // 这样就会与你的代码相冲突
    define("__FOO__", "something");
    ?>

    4 运算符
    *优先级
    <?php
    $a = 3 * 3 % 5; // (3 * 3) % 5 = 4
    $a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2
    $a = 1;
    $b = 2;
    $a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
    // mixing ++ and + produces undefined behavior
    $a = 1;
    echo ++$a + $a++; // may print 4 or 5
    ?>
    *错误运算符
    支持一个错误控制运算符:@,该表达式可能产生的任何错误信息都被忽略掉。
    *执行运算符
    注意这不是单引号!PHP 将尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回
    使用反引号运算符“`”的效果与函数 shell_exec() 相同。
    <?php
    $output = `ls -al`;
    echo "<pre>$output</pre>";
    ?>
    结果:将文件目录结构输出来
    *字符串连接运算符
    有两个字符串(string)运算符。第一个是连接运算符(“.”),它返回其左右参数连接后的字符串。
    第二个是连接赋值运算符(“.=”),它将右边参数附加到左边的参数之后
    <?php
    $a = "Hello ";
    $b = $a . "World!"; // now $b contains "Hello World!"
    $a = "Hello ";
    $a .= "World!"; // now $a contains "Hello World!"
    ?>
    *数组运算符
    $a + $b 联合 $a 和 $b 的联合。
    $a == $b 相等 如果 $a 和 $b 具有相同的键/值对则为 TRUE。
    $a === $b 全等 如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。
    $a != $b 不等 如果 $a 不等于 $b 则为 TRUE。
    $a <> $b 不等 如果 $a 不等于 $b 则为 TRUE。
    $a !== $b 不全等 如果 $a 不全等于 $b 则为 TRUE。

    + 运算符把右边的数组元素附加到左边的数组后面,两个数组中都有的键名,则只用左边数组中的,右边的被忽略。
    <?php
    $a = array("a" => "apple", "b" => "banana");
    $b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");

    $c = $a + $b; // Union of $a and $b
    echo "Union of $a and $b: ";
    var_dump($c);

    $c = $b + $a; // Union of $b and $a
    echo "Union of $b and $a: ";
    var_dump($c);
    ?>

    数组中的单元如果具有相同的键名和值则比较时相等
    <?php
    $a = array("apple", "banana");
    $b = array(1 => "banana", "0" => "apple");

    var_dump($a == $b); // bool(true)
    var_dump($a === $b); // bool(false)
    ?>
    *类型运算符
    instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例
    <?php
    class MyClass
    {
    }

    class NotMyClass
    {
    }
    $a = new MyClass;


    var_dump($a instanceof MyClass);
    var_dump($a instanceof NotMyClass);
    ?>

    五:流程控制
    *if else
    *流程控制代替语法
    PHP 提供了一些流程控制的替代语法,包括 if,while,for,foreach 和 switch。
    替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成
    endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。

    <?php if ($a == 5): ?>
    A is equal to 5
    <?php endif; ?>

    *while
    while (expr):
    statement
    ...
    endwhile;

    * for
    <?php
    $people = Array(
    Array('name' => 'Kalle', 'salt' => 856412),
    Array('name' => 'Pierre', 'salt' => 215863)
    );

    for($i = 0, $size = sizeof($people); $i < $size; ++$i)
    {
    $people[$i]['salt'] = rand(000000, 999999);
    }
    ?>

    *foreach
    可以很容易地通过在 $value 之前加上 & 来修改数组的元素。
    此方法将以引用赋值而不是拷贝一个值。
    <?php
    $arr = array(1, 2, 3, 4);
    foreach ($arr as &$value) {
    $value = $value * 2;
    }
    // $arr is now array(2, 4, 6, 8)
    unset($value); // 最后取消掉引用
    ?>
    *require 和 include
    require 出错是会停止脚本程序,include 会产生警告
    require_once和require 基本一样,唯一的区别是唯一区别是 PHP 会检查该文件是否
    已经被包含过,如果是则不会再次包含。

    六 函数
    *可变函数
    可变函数类似于可变变量
    这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。
    可变函数可以用来实现包括回调函数,函数表在内的一些用途
    <?php
    function foo() {
    echo "In foo()<br /> ";
    }

    function bar($arg = '') {
    echo "In bar(); argument was '$arg'.<br /> ";
    }

    // 使用 echo 的包装函数
    function echoit($string)
    {
    echo $string;
    }

    $func = 'foo';
    $func(); // This calls foo()

    $func = 'bar';
    $func('test'); // This calls bar()

    $func = 'echoit';
    $func('test'); // This calls echoit()
    ?>
    *匿名函数
    <?php
    echo preg_replace_callback('~-([a-z])~', function ($match) {
    return strtoupper($match[1]);
    }, 'hello-world');
    // 输出 helloWorld
    ?>

    七 类与对象
    *基本概念
    $this 是一个到主叫对象的引用(通常是该方法所从属的对象)
    *属性
    在类的成员方法里面,可以用 ->(对象运算符):$this->property(其中 property 是该属性名)这种方式来访问非静态属性。
    静态属性则是用 ::(双冒号):self::$property 来访问。更多静态属性与非静态
    *类常量
    可以把在类中始终保持不变的值定义为常量
    <?php
    class MyClass
    {
    const constant = 'constant value';
    }
    ?>
    *自动加载类
    *Static 静态关键字
    声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)
    因为静态方法在编译前就被加载了,所有就不能访问非静态方法,因为他们还不存在
    *抽象类
    任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的
    *接口
    使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
    *traits
    Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。
    Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;
    也就是说,应用类的成员不需要继承。
    <?php
    trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
    }

    class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */
    }

    class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */
    }
    ?>
    *遍历对象
    *final关键字
    如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
    *对象复制
    *对象比较
    当使用比较运算符(==)比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值 都相等,
    而且两个对象是同一个类的实例,那么这两个对象变量相等。


    而如果使用全等运算符(===),这两个对象变量一定要指向某个类的同一个实例(即同一个对象)。
    *后期静态绑定
    *对象和引用
    一个关键点是“默认情况下对象是通过引用传递的”。但其实这不是完全正确的。下面通过一些例子来说明。
    *对象系列化
    所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。
    序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字

    八 命名空间
    *命名空间概述
    用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
    <?php
    namespace my ame; // 参考 "定义命名空间" 小节

    class MyClass {}
    function myfunction() {}
    const MYCONST = 1;

    $a = new MyClass;
    $c = new my ameMyClass; // 参考 "全局空间" 小节

    $a = strlen('hi'); // 参考 "使用命名空间:后备全局函数/常量" 小节

    $d = namespaceMYCONST; // 参考 "namespace操作符和__NAMESPACE__常量” 小节

    $d = __NAMESPACE__ . 'MYCONST';
    echo constant($d); // 参考 "命名空间和动态语言特征" 小节
    ?>

    *namespace关键字和__NAMESPACE__常量
    <?php
    namespace MyProject;
    echo '"', __NAMESPACE__, '"'; // 输出 "MyProject"
    ?>

    *全局空间
    如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,
    与 PHP 引入命名空间概念前一样。在名称前加上前缀 表示该名称是
    全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。
    <?php
    namespace ABC;

    /* 这个函数是 ABC open */
    function fopen() {
    /* ... */
    $f = open(...); // 调用全局的fopen函数
    return $f;
    }
    ?>

    九 超全局变量
    $GLOBALS
    $_SERVER
    $_GET
    $_POST
    $_FILES
    $_COOKIE
    $_SESSION
    $_REQUEST
    $_ENV

    十 垃圾回收机制
    * 引用计数器,每个php变量都保存在一个叫“zval”的变量容器中,除了包含变量的类型和值,
    还包括两个字节的额外信息,第一个是“is_ref”是一个bool 值 用来标识是否属于引用集合
    第二个额外的字节是refcount 用于统计引用次数
    <?php
    $a = "new string";
    xdebug_debug_zval('a');
    ?>
    结果:a: (refcount=1, is_ref=0)='new string'
    * 如果一个引用计数增加 它将继续呗使用,如果引用计数减少到0,所在变量容器将呗清零(free)


    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表