php 新手笔记

2019/05/10 php

php学习笔记

1. new static() 和 new self()的异同

self refers to the same class whose method the new operation takes place in.

static in PHP 5.3’s late static bindings refers to whatever class in the hierarchy which you call the method on.

In the following example, B inherits both methods from A. self is bound to A because it’s defined in A’s implementation of the first method, whereas static is bound to the called class (also see get_called_class() ).

self 代表的是当前方法调用栈中对应的类;而 static 代表的是 当前方法的 caller 代表的类,用于后期静态绑定。

例子

class A {
  public static function get_self() {
    return new self();
  }

  public static function get_static() {
    return new static();
  }
}

class B extends A {}

echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_static()); // A

2. ob_flush() 和 flush()

ob_flush() 刷新的是 php 自己的 buffer,而 flush() 刷新的则是 tcp buffer

3. use, require 和 include 区别

require 和 include 类似,只不过两者在加载失败时: include 会产生一个警告,脚本不会停止执行, require 失败则会产生一个致命失败(脚本停止运行) 这里特别要注意的是:使用 include() 文件不存在时,脚本继续执行,这种情况只出现在 PHP 4.3.5之前 推荐使用 require_once() 和 include_once(),可以检测文件是否有重复包含。

use 使用的是命名空间,所以参数是命名空间,使用的是右斜杠 ‘', 命名空间和文件路径不一定是对应的。

4. php在foreach中使用引用赋值&可能遇到的问题

代码:

$test=array('a','b','c');

foreach($test as &$value){
   echo $value;
}
echo $value;

foreach($test as $value){
   echo $value;
}
echo $value;

运行结果:

'a','b','c'

'c'

'a','b','b'

'b'

解释:

在第一个foreach中,我们使用了赋值引用符号,它的意思是每次遍历时,$value指向的是$test数组中的对应元素的地址, 循环一次时,$value指向的是’a’的地址,第二次循环的时候,$test指向的是第二个元素’b’的地址,第三次循环时,指向的就是’c’的地址。 当我们在做第二次遍历的时候,其实$value变量指向的还是$test的第三个元素即’c’的地址。然后foreach本身的操作是把数组中对应的元素赋值给as后面的变量, 所以在第二个foreach中,遍历第一次的时候,把‘a’赋值给$value指向的地址即[‘a’,’b’,’a’],第二次遍历的时候,把’b’赋值给$value指向的地址即[‘a’,’b’,’b’], 第三次遍历的时候,就把’b’赋值给$value指向的地址,这也就是为什么输出结果是[‘a’,’b’,’b’]而不是[‘a’,’b’,’c’]的原因。

解决方案:

在使用完赋值引用操作符之后,把变量 unset 掉,上例中加上unset($value)语句,相当于取消$value对该地址的引用,这样第二次foreach的时候,$value相当于新的变量,不会导致上述问题。这也是一个很好的编程习惯。

Search

    Table of Contents