甲: php new self() 和 new static() 的区别
<?php
/* new self() 和 new static() 的区别.
* 这两个函数都是创建一个对象的意思,但到底是什么差别
*/
class Base {
public function getNewSelf() {
return new self();
}
public function getNewStatic() {
return new static();
}
}
class Extend1 extends Base
{
}
class Extend2 extends Base
{
}
$b = new Base();
echo "base getNewSelf ret:". get_class($b->getNewSelf()) ."\n";
echo "base getNewStatic ret:".get_class($b->getNewStatic()) ."\n";
$e1 = new Extend1();
echo "e1 getNewSelf ret:". get_class($e1->getNewSelf()) ."\n";
echo "e1 getNewStatic ret:".get_class($e1->getNewStatic()) ."\n";
$e2 = new Extend2();
echo "e2 getNewSelf ret:". get_class($e2->getNewSelf()) ."\n";
echo "e2 getNewStatic ret:".get_class($e2->getNewStatic()) ."\n";
/*
* 输出结果:
* base getNewSelf ret:Base
* base getNewStatic ret:Base
* e1 getNewSelf ret:Base
* e1 getNewStatic ret:Extend1
* e2 getNewSelf ret:Base
* e2 getNewStatic ret:Extend2
*
* 结论: new self() 创建的是基类对象. 再多的继承也是一样.
* new static() 创建的是子类对象.
*/
?>
乙: php: 赋值语句与 ?: 表达式辨析举例.
在C语言下也用惯了?:表达式, 但在php下看到如下这些写法,还是令我晕菜了一阵, 大概是$a = $a 这种形式造成的.
$module = $module ? $module . DS : '';
这句话看着别扭, 在于解释的优先级别, 还得解释一下意思.
给$module 赋值(优先级较低), $module 有值(真),给$module后面加上一'/'(在linux下DS(目录分隔符)就是/), 无值(假),把''付给$module
同样分析下面一句
$range = $range ?: self::$range;
$range 为真吗? 为真保持不动,为假把self::$range 付给$range.
丙: array_key_exists 与 isset 辨析
<?php
$arr = array( 'one'=>'1', 'two'=>'2', 'three'=>null );
echo array_key_exists('one', $arr)."\n"; // 1
echo array_key_exists('two', $arr)."\n"; // 1
echo array_key_exists('three', $arr)."\n"; // 1
echo isset($arr['one'])."\n"; // 1
echo isset($arr['two'])."\n"; // 1
echo isset($arr['three'])."\n"; // 是个空值
?>
1. 首先调用的参数不同.
array_key_exists ( mixed $key , array $array ) : bool
isset ( mixed $var [, mixed $... ] ) : bool
2. 意义不同.
前者检查键值是否存在, 后者检查其值是否存在且不为0.
丁: === 与 !== 意义辨析
<?php
echo 0==false ? "等于\n":"不等于\n"; // 等于
echo 0===false ? "全等于\n":"不全等于\n"; //不全等
echo 1!='1' ? "不等于\n":"等于\n"; //等于
echo 1!=='1' ? "对\n":"错\n"; // 对
echo 1!==1 ? "对\n":"错\n"; // 错
?>